如何快速读懂反汇编的汇编代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学OD最好先从CrackMe开始,这样可以尽量减少很多不必要的干扰。
鉴于我也还是个初学者,就说说怎么分析最简单CrackMe吧。
最简单的CrackMe一般要求你输入一个key,然后反馈给你结果,你需要分析他的代码来找到正确的key。
key可能是固定的(硬编码),也可能和你输入的其他数据有关(由username生成key),有很多形式。
首先我们要知道即使是一个简单的Win32窗体的Hello World, 反汇编出来的代码量也是相当惊人的,而我们也没有必要分析这个程序每一个语句,我们要把关注点放在值得关注的地方,尤其是分支判断处,所以分析程序的第一步往往是找到关键代码。
常用的方法是:
• 对关键的API下断点,一般能找到诸如GetWindowText之类的API就能直接定位到你输入key在内存中的位置;
• 搜索程序中的字符串(提示成功/失败的字符串),一般这个会定位到判断你的key 是否正确的条件分支处。
• 在内存中搜索你输入的key,用内存断点定位访问key的代码。
接下来对关键点代码进行分析,这是最令人头痛的一步了,乍眼看去到处都是mov eax,ecx , lea esi / dword ptr ds:[xxx]什么的,确实不太直观,题主我这里有一个秘诀:
多练。
好吧这不是废话么?
但确实多练后这些代码一眼还是可以看出个大概来的。
因为程序中的每一条指令并不是精确地被程序员控制的,你在C语言里面一条
语句,翻译成汇编往往是若干条,而这种翻译是模式化的,这就导致了在反
汇编代码中有很多确定的模式:
push 0
push 1
push 2
call xxx
这是调用函数的语句,你需要去了解各种调用约定;
push ebp
mov ebp, esp
是用来保护堆栈的,常常出现在函数的开头,后面也常常会跟着很多push来保护寄存器;label:
cmp ecx, 10
je xxx
inc ecx
; do sth
jmp label
这就是一个经典的循环,当然还有很多其他的形式;
test eax, eax / cmp eax, ecx
je/jz xxx
push xxx
call xxx
判断条件后调用函数,一般就是比较关键的语句了。
另外不同的语言,不同的编译器生成的代码风格也不同,
如果代码中出现了上面提到的
push ebp
mov ebp, esp
那这个程序很可能是C语言写的,
对于字符串,如果字符串是
db "123",'\0'
这种形式的,一般是C/C++
db 3, "123"
这种形式的,则更有可能是Delphi。
P.S. 动态调试的一大好处是能看到堆栈的内容,但是也不是必要的,如果题
主用IDA的话,F5会让你幸福得哭出来的。
P.P.S 由于答主本人也是弱的可以,长期并将长期处于入门阶段,有说错的地方还请指正。