- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
 - 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
 - 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
 - 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
 - 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
 - 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
 - 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
 
                        查看更多
                        
                    
                
                        第4章-汇编指令 
                          【安于此生译】 
之前的章节主要是理论知识,现在我们要 
在OllyDbg中实践一下,为后面打开基础。 
OllyDbg中几乎所有的标志我都有考虑,如 
果你遇到了我没有给出的指令,你可以查 
 阅更加全面的汇编指南。 
NOP (无操作) 
运行这条指令不会对寄存器,内存以及堆 
栈造成任何影响,英文单词的意思是”无 
操作”,也就是说,它没有特殊的用途。 
例如,你用一个短指令来替换一个长指令 
的话,如果处理器   没有错误多余的空 
间将会被NOP填充。 
适当数 目的nop指令可以将其他指令完全 
替换掉。 
下面使用OllyDbg重新载入CrueHead а(C 
rackMe的作者)的CrackMe。 
我们可以看到反汇编的源代码,如上图第 
一条指令是PUSH         0,占两个字节, 
在这条指令上面单击鼠标右键选择Assemb 
le. 
或者直接使用快捷键-空格键,在弹出窗口 
的编辑框中输入NOP。 
写入NOP指令后单击Assemble按钮。 
这里我们可以看到OD设计的非常智能,考 
虑到PUSH指令占两个字节,OD会使用两条N 
OP指令进行替换,而不是使用一条NOP进行 
替换。 
现在,在原来PUSH 0的地方显示的两条NOP 
指令,单击F7,指令一条NOP指令,可以看到 
,这里只改变了EIP (保存了下一条要执行 
指令的地址)寄存器的值,并没有影响到其 
他寄存器,堆栈或者标志位。 
现在我们需要在数据窗口查看这两个字节 
,它们的内存地址分别是401000和401001 
。 
在数据窗口中,鼠标右键选择- “Go to”- 
  “Expression”,输入你需要转到的地址 
。 
这里我们需要输入401000。 
红色突出显示的是刚刚修改过的字节。前 
两个是90,然后E8,FF和04,00,00。这是 
一个Call指令的所有剩余字节。 
OD可以撤销我们修改的指令吗? 
呵呵,当然啦。 
在数据窗口或者反汇编窗口中,鼠标拖选 
中两个字节。 
然后单击鼠标右键,选择 “UNDO          
SELECTION”。 
这样就恢复了原来的PUSH指令。 
在数据窗口中的话,你就可以看到它原始 
的字节了。 
 以上是关于NOP指令的所有内容。 
                                           
 
堆栈相关指令的说明 
我们之前说过,堆栈就像一个信箱一样,越 
顶部的信越先被取出来。 
PUSH  
PUSH指令-将操作数压入堆栈中。我们可 
 以看到,CrueHead а(CrackMe的作者)的C 
rackMe的第一条指令就是PUSH指令。 
  “PUSH 0”指令将把0存入到堆栈的顶部, 
此时并没有压入堆栈,指令执行后,我们看 
看堆栈如何变化。堆栈的地址在你的机器 
上可能会有所不同,但效果是一样的。 
堆栈地址在我的机器上是12FFC4,可能与 
你机器上的不同,因为堆栈每次可能放置 
在不同的位置,其初始内容也可能有所不 
同,即这里的7C816D4F和你的也可能不同 
。按F7,将0压入堆栈,堆栈顶部的就是0了 
。 
按下F7,堆栈顶部我们可以看到加入了0。 
下面的12FFC4中仍然是7C816D4F,堆栈中 
的其他值并没有改变。 
主要的变化就是堆栈的顶部变成了12FFC0 
 (这是PUSH 0指令执行的结果),新压入的 
数据总是在堆栈的顶部,并不会改变下面 
的数据。 
这里也可以看到,ESP的值变成了12FFC0。 
当然PUSH指令不仅仅可以压入数值: 
PUSH EAX的话,那么堆栈的顶部将保存EAX 
的值。 
同样的适用于其他的寄存器,你也可以压 
入特定内存地址中的值。 
PUSH  [401008] 
注意,这和下面这条指令的解释是不同的 
。 
PUSH 401008 
 (没有方括号) 
如果你使用的 “PUSH 401008”,那么堆栈 
中将被放置401008。 
执行以后,我们可以看到下面的结果: 
如果换成是 “PUSH  [401008]” 
 [401008]表示401008这个内存单元中存储 
的内容,这个时候我们得去数据窗口中查 
看它的值是多少。 
在数据窗口中鼠标右键单击-Go to-Expre 
ssion,输入401008,可以看到: 
这四个字节是CA 20 40 00。按F7执行这 
条PUSH执行。 
堆栈中我们可以看到在数据窗口中颠倒过 
来的值,即,它们被倒序放置。 
读/写的内容在内存中倒序放置时处理器 
的特点之一。
                您可能关注的文档
- 糖尿病教育-01-糖尿病基础知识.pptx
 - 糖尿病教育-02-从关键指标看糖尿病的诊断与治疗.pptx
 - 糖尿病教育-05-糖尿病降糖药物的选择.ppt
 - 糖尿病教育-08-HbA1c测试介绍.pptx
 - 糖尿病教育-09-糖尿病与并发症.pptx
 - 糖尿病教育-11-关注下肢血管病变和糖尿病足.pptx
 - 糖尿病教育-12-β细胞功能知多少.pptx
 - 糖尿病教育-16-体重控制.pptx
 - 糖尿病教育-17-肥胖糖尿病患者的治疗与管理.pptx
 - 人工神经元网络模型.pptx
 
- 使用OllyDbg从零开始Cracking-05第五章-数学指令.pdf
 - 使用OllyDbg从零开始Cracking-06第六章-比较和条件跳转.pdf
 - 使用OllyDbg从零开始Cracking-07第七章-call ret.pdf
 - 使用OllyDbg从零开始Cracking-08第八章-循环 字符串指令和寻址方式.pdf
 - 使用OllyDbg从零开始Cracking-09第九章-基本概念.pdf
 - 使用OllyDbg从零开始Cracking-10第十章-断点.pdf
 - 使用OllyDbg从零开始Cracking-11第十一章_硬件断点与条件断点.pdf
 - 使用OllyDbg从零开始Cracking-12第十二章-消息断点.pdf
 - 使用OllyDbg从零开始Cracking-13第十三章-硬编码序列号寻踪-Part1.pdf
 - 使用OllyDbg从零开始Cracking-14第十四章-硬编码序列号寻踪-Part2.pdf
 
原创力文档
                        

文档评论(0)