打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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)上找到这款软件,感谢原作者。


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
实验一 计算机是怎样工作的 SA*****369 张*铭
x86、arm、mips架构函数调用实例分析
深入理解C语言的函数调用过程
http://blog.csdn.net/amwfnyq/article/details/...
CTF PWN练习之返回地址覆盖
论函数调用约定
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服