C语言逆向——如何寻找main入口,一个反汇编成C的实战练习

发布时间 2023-04-02 12:36:50作者: bonelee
第二节 2.3找程序的入口
原文:https://www.showdoc.com.cn/fengxin1225/7054696489361869

控制台应用程序的main函数入口


在OD中找到以上其他中的函数,然后跟着3个参数的CALL就是main

例:

———————————————————-

 

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

逆向CallingConvention.exe,还原为C代码,记录过程。该程序可以自己去生成一个:

#include <iostream>
#include<Windows.h>
#include<stdio.h>

int functionC(int a, int b)
{
    return a + b;
}

int functionB(int a,int b,int c)
{
    return a + b + c;
}

int functionA(int a, int b, int c, int d, int e)
{
    int x, y;
    x = functionB(a, b, c);
    y = functionC(a, b);
    return y = functionC(x, y);
}

int main()
{
    int result = functionA(1, 3, 4, 6, 7);
    printf("结果是:%d\n", result);
    system("pause");
}

 


程序入口

 

 


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函数==》注意:这个是printf函数的汇编!

 

 

进到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));
}

上面的答案有瑕疵,比如函数返回值啥的void错误:

完善后代码如下:


#include <iostream>
#include<Windows.h>
#include<stdio.h>

int functionC(int a, int b)
{
    return a + b;
}

int functionB(int a,int b,int c)
{
    return a + b + c;
}

int functionA(int a, int b, int c, int d, int e)
{
    int x, y;
    x = functionB(a, b, c);
    y = functionC(a, b);
    return y = functionC(x, y);
}

int main()
{
    int result = functionA(1, 3, 4, 6, 7);
    printf("结果是:%d\n", result);
    system("pause");
}