【#文档大全网# 导语】以下是®文档大全网的小编为您整理的《如何快速读懂反汇编的汇编代码》,欢迎阅读!
学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 由于答主本人也是弱的可以,长期并将长期处于入门阶段,有说错的地方还请指正。
本文来源:https://www.wddqxz.cn/bc1c6b5e0029bd64793e2ccf.html