天天看点

汇编代码对应的高级语言分析

该程序使用c++编写

0053C9C0是一个对象指针

0053C9C4也是一个对象指针

mov ecx, xxxxxxxx

call xxxxxxx 这种形式一般都是调用成员函数,没有重载的非虚函数

mov ecx,aaaaaaaaaa

mov eax,[ecx]

call [eax+xxxxx]  一般是调用重载过的函数,因为要取虚函数表

如果发现

call [reg+xxxx] 前面的那个ecx不等于对象地址,或者对象地址压栈,则极可能是调用类的静态虚函数。

cmp ?,imm

ja xxxxxxxxxx

sub ?,imm

jmp [xxxxxxxx+?*4]  顺序数的switch,xxxxxx一般在函数后面的不远处 ja 跳转的地址是default

mov [ebp-xxx],imm

jmp xxxxxxxx

zzzzzzzzzz .....calc with [ebp-xxx]

cmp [ebp-xxx],imm (reg or param or localvar )

jge/je/..... yyyyyyyyy

xxxxxxxx some codes

表示 for([ebp-xxx]=imm;条件(取决于比较和跳转);每次循环执行的操作(取决于calc)){}

后面的花括号在yyyyyyyyy的上一句,是一个jmp回zzzzzzzzzz的语句。

xxxxxxxxx cmp var,var

跳转 yyyyyyyyyy

somecode

jmp xxxxxxxxx

yyyyyyyyyy some codes

while(){}的汇编形式

cmp

跳转 a1

跳转 a2

a1:somecodes

a2:somecodes

a3:

if( s1 || s2 )a1;

如果a1结束是

jmp a3

if(s1||s2)a1 else a2;

如果 两个或者多个条件跳转到另外的地址,而不是最后的条件下面的地址就是 && 连接条件。

继续阅读