一个简单的“HELLO WORLD”反汇编代码量仍然是相当惊人的,而且没有必要分析程序的每一个语句,因此应把关注点放在值得关注的地方,例如:分支判断处,所以分析程序第一步是找到关键代码。
常用方法是:
1、对关键的API下断点,一般找到如GetWindowText之类的API就能直接定位到输入key在内存中的位置
2、搜索程序中字符串(提示成功或者失败的字符串),一般会定位到判断key是否正确的条件分支处。
3、在内存中搜索输入的key,用内存断点定位访问key的代码、
接下来对关键代码的分析最困难,只有多练
但是,C语言中的一条语句翻译成反汇编往往是若干条,并且翻译是模块化的,因此反汇编代码中有很多确定的形式。
例如:
push 0
push 1
push 2
call xxx
这是调用函数的语句,这需要了解各种调用约定。
push edp
mov edp, esp
这是用来保护堆栈的,常出现在函数开头,后面也会跟着许多push用来保护寄存器。
label:
cmp ecx, 10
je xxx
inc ecx
jmp label
这是一个经典的循环语句,也会有很多其他形式。
test eax, eax / cmp eax, ecx
je/jz xxx
push xxx
call xxx
判断条件后调用函数,一般属于比较关键的语句。
除上面所说之外,不同的语言,不同的编译器生成的代码风格也不同。
如果代码出现上面提到的
push ebp
push edp, esp
那么这个程序很可能是C语言写的。
对于字符串,若字符串是 db "123", '\0'这种形式,一般是C/C++
而像db 3, "123"这种形式的更可能是Delphi
动态调试一大好处是能开到堆栈中的内容,但也不是必要的
用IDA的话,F5
简单的逆向工程可以使用IDA+Hex-Rays插件,可以之间将汇编还原成C,只是看上去比较怪