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

发表于 C/C++, 程序语言, 计算机安全, 软件安全 2017-05-20 阅读数: 219

其实想看懂反汇编的汇编代码并不难,记住一些常用的指令模式就能明白很多东西了。我们今天以这个程序的反汇编指令为例,讲解一些常用的模式。

反编译京东秒杀列表

程序无壳,可以直接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进去然后call.

反编译京东秒杀列表

这里有多个判断条件,然后选择是否跳转跳过某个函数。这里一般都是关键点,很多时候我们破解,利用的都是条件判断然后跳转的语句。

是不是少了个循环的例子?其实一般都是这样的:

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)。

反编译京东秒杀列表

https://ai.jd.com/index_new?app=Seckill&action=pcSeckillCategoryGoods&callback=pcSeckillCategoryGoods&id=29&_=1494553816298

改变ID就是不同的类目。

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

欢迎关注微信公众号:幻象客 https://www.huanxiangke.com

欢迎进入极致分享:https://alltoshare.com

幻象客 二维码

Add comment