分享

简单看懂反汇编代码(逆向一款JD秒杀搜索工具得到API)

 山峰云绕 2023-04-27 发布于贵州

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 (地址)
  • 1.

显然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
  • 1.

对着源代码并不难理解,我就不再赘述了。

老规矩,献上API(使用IDA就可以找到了,下次有机会讲讲IDA)。


​​


改变ID就是不同的类目。

您可以在极致分享(alltoshare.com)上找到这款软件,感谢原作者。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多