第二节 2.4.1逆向并还原为C代码(网上解答)

逆向CallingConvention.exe,还原为C代码,记录过程。


程序入口


main函数


通过Main函数识别出来程序大致框架如下:

函数3为编译器自动添加的堆栈平衡检查函数


void __fastcall func1(int a,int b,int c,int d,int e){

}
void  __cdecl func2(int x,int y){

}
void main(int argc,char *argv[])
{
    func1(1,3,4,6,7);
    func2(m,n);
}

func1函数

从以上汇编代码识别出func1的框架如下:

void __fastcall func1(int a,int b,int c,int d,int e){
    int x=1;
    int y=3;
    func3(x,y,c);
    func4();
    func4();
}

func3函数

func3函数大致框架如下:

int __cdecl func3(int x,int y,it z)
{
    return x+y+z;
}

func1函数补充如下:

void __fastcall func1(int a,int b,int c,int d,int e){
    int x=1;
    int y=3;
    int z=func3(x,y,c);
    func4(x,y);
    func4();
}

func4函数

func4的函数框架如下:

int cdecl func4(int x.int y)
{
    return x+y;
}

func1函数补充如下:

void __fastcall func1(int a,int b,int c,int d,int e){
    int x=1;
    int y=3;
    int z=func3(x,y,c);
    int p=func4(x,y);
    func4(p,z); //运算后eax=0C
}

到此,func1基本逆向完成,回到main函数,继续func2的逆向,如下:

func2函数

进到func2函数内部,发现其应该是printf函数,那么回到main函数,继续完善,如下:

Main函数

int cdecl func4(int x,int y)
{
    return x+y;
}
void __fastcall func1(int a,int b,int c,int d,int e){
    int x=1;
    int y=3;
    int z=func3(x,y,c);
    int p=func4(x,y);
    func4(p,z); //运算后eax=0C
}
void main(int argc,char *argv[])
{
    printf("%d",func1(1,3,4,6,7));
}