https://blog.51cto.com/u_15494922/5104230?share_token=567f79d6-3370-46e0-9326-a404fcb0f68b&tt_from=copy_link&utm_source=copy_link&utm_medium=toutiao_android&utm_campaign=client_share
其实想看懂反汇编的汇编代码并不难,记住一些常用的指令模式就能明白很多东西了。我们今天以这个程序的反汇编指令为例,讲解一些常用的模式。
程序无壳,可以直接OD载入,一载入我们就看到程序入口点,程序入口点是我们识别语言的重要标志:
这两句是C++编写的程序的标志,我们用工具查看一下是否真的用C++编写的。
猜测正确。而且请看第二句: mov ebp,esp 如果说程序是加壳的,当我们单步到此句的时候,有的时候就可以使用esp定律法脱壳。此时观察右边寄存器窗口,会发现只有esp一处变红了,esp是栈指针寄存器,它变红则代表这个寄存器发生了变化,发生变化后,肯定会恢复这个变化。esp定律法利用的就是堆栈平衡原理(入栈出栈后跳到程序入口点)。
看看这三句,dword是两个字节大小,ptr是指针,fs:[0]是指向SEH链的指针,SEH链主要用来处理程序异常,所以这里的大致意思是将这个指针存入eax寄存器,然后推入栈中。再改变fs:[0]的指向为esp寄存器。
这是为了保护寄存器所做的操作。将寄存器们推入栈中。
调用函数。可以参考下面这个例子:
显然2和1都是参数,先push进去然后cal
l.
这里有多个判断条件,然后选择是否跳转跳过某个函数。这里一般都是关键点,很多时候我们破解,利用的都是条件判断然后跳转的语句。
是不是少了个循环的例子?
其实一般都是这样的:
C语言代码:
typedef struct _Foo{
DWORD size; // +0x00
DWORD array[...]; // +0x04
}Foo,*PFOO
PFOO bar = ...;
for(i = .. ; i < bar->size; ++i){
if(bar->array[i]!=0){
...
}
}
反编译:
loop_start:
mov eax,[edi+4]
mov eax,[eax+ebx*4]
test eax,eax
jz short loc_7F627F
loc_7F627F:
inc ebx
cmp ebx,[edi]
jl short loop_start
对着源代码并不难理解,我就不再赘述了。
老规矩,献上API(使用IDA就可以找到了,下次有机会讲讲IDA)。
改变ID就是不同的类目。
您可以在极致分享(alltoshare.com)上找到这款软件,感谢原作者。
联系客服