如何快速读懂反汇编的汇编代码

2022-07-14 17:14:17   文档大全网     [ 字体: ] [ 阅读: ]

#文档大全网# 导语】以下是®文档大全网的小编为您整理的《如何快速读懂反汇编的汇编代码》,欢迎阅读!
汇编,快速,代码,如何
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

相关推荐