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寄存器。 这是为了保护寄存器所做的操作。将寄存器们推入栈中。 调用函数。可以参考下面这个例子: C语言代码:sum = add(1, 2); 反编译: push 2 push 1 call add (地址)
显然2和1都是参数,先push进去然后cal l. 这里有多个判断条件,然后选择是否跳转跳过某个函数。这里一般都是关键点,很多时候我们破解,利用的都是条件判断然后跳转的语句。 是不是少了个循环的例子? 其实一般都是这样的:
对着源代码并不难理解,我就不再赘述了。 老规矩,献上API(使用IDA就可以找到了,下次有机会讲讲IDA)。 改变ID就是不同的类目。 您可以在极致分享(alltoshare.com)上找到这款软件,感谢原作者。 |
|