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

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

时间:2023-04-02 12:44:35浏览次数:47  
标签:func1 return 函数 func4 int C语言 反汇编 main

第二节 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");
}



标签:func1,return,函数,func4,int,C语言,反汇编,main
From: https://www.cnblogs.com/bonelee/p/17278098.html

相关文章

  • 跟着鹏哥学C语言-第四天
    if语句if(表达式)语句; if(表达式)语句1;else语句2;多分枝if(表达式1)语句1;elseif(表达式2)语句2;else语句3;如果条件成立,要执行多条语句,则应该使用代码块intmain(){ intage=40; if(age<18) printf("未成年\n"); elseif(age>=18&&age<=28) printf("青年人......
  • PAT Basic 1059. C语言竞赛
    PATBasic1059.C语言竞赛1.题目描述:C语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛。既然竞赛主旨是为了好玩,颁奖规则也就制定得很滑稽:0、冠军将赢得一份“神秘大奖”(比如很巨大的一本学生研究论文集……)。1、排名为素数的学生将赢得最好的奖品——小黄人玩偶!2、......
  • C# Environment.CurrentDirectory和AppDomain.CurrentDomain.BaseDirectory的区别
    Environment.CurrentDirectory和AppDomain.CurrentDomain.BaseDirectory都是C#中用于获取当前应用程序的目录路径的方法,但是它们的用途和行为是不同的。Environment.CurrentDirectory返回的是当前进程的当前工作目录路径,这通常是启动应用程序的目录。如果在启动时没有指定工......
  • 迁移学习(CDA)《CDA:Contrastive-adversarial Domain Adaptation 》
    论文信息论文标题:CDA:Contrastive-adversarialDomainAdaptation论文作者:NishantYadav,M.Alam,AhmedK.Farahat,DipanjanGhosh,ChetanGupta,A.Ganguly论文来源:2023 ArXiv论文地址:download 论文代码:download视屏讲解:click1介绍基于域对齐的域适应方法实现了......
  • C语言逆向汇编——参数局部变量、函数堆栈、调用约定和内嵌汇编码
    第一节1.1C语言1、注意参数和局部变量在堆栈中的存储方式2、参数在调用函数前就已经存入堆栈,从[EBP+8]、[EBP+C]、……开始。3、局部变量是在调用函数后,存入缓冲区里,从[EBP-4]、[EBP-8]、……开始4、函数运算得到的结果,通常存在EAX里。        第一......
  • c语言include文件路径(c语言include相对路径)
    原文:http://www.easyaq.com/post/11694.html今天给各位分享c语言include文件路径的知识,其中也会对c语言include相对路径进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览:1、C语言include能不能是相对路径?2、C语言中,include是什么意思?3、#incl......
  • QMainWindow知识点记录
    1.新建action toolbaropenFileAction = new QAction(QIcon(":/pic/open"), QString::fromLocal8Bit("打开"), this); openFileAction->setShortcut(tr("Ctrl+O")); openFileAction->setStatusTip(tr("打开一个文件"));-------......
  • 关于python 的if __name__ == "__main__"的模块测试
    if__name__=="__main__"也就是说执行当前文件,不调用模块的时候__name__=__main__调用模块的时候,测试如下:1、新建test01.py文件测试代码如下print("这条消息来自test01")deffunc():print('hello,world!***')print("这条消息来自func")if__name__=="__......
  • 逍遥自在学C语言 | 第一个C语言程序 九层之台起于垒土
    一、人物简介第一位闪亮登场,有请今后会一直教我们C语言的老师——自在。第二位上场的是和我们一起学习的小白程序猿——逍遥。二、C语言简介C语言是一种高级语言,运行效率仅次于汇编,支持跨平台C语言是学习其他高级语言的基础,如C++、Java和Python三、编程环......
  • C语言编程练习_查找数组中不重复的数字
    题目描述:给定一个整形数组空间arr,数据中包含两个一样的数字若干,只有一个数字是单独一个。设计一个函数把这个出现一次的数字返回出来。 解决方案一:穷举法:假设arr数组中的每个元素都是重复的。也可能是不重复的(效率差)#include<stdio.h>intfun1(intarr[],intlen){  ......