《C++反汇编与逆向分析》动态调试找到main函数

本文详细解释了在C/C++程序中,main或WinMain函数作为语法规定的用户入口,实际调用前编译器进行的初始化工作,包括全局数据设置、缓冲区溢出保护等。并通过IDA和x64dbg工具展示了动态和静态定位main函数的调试过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在VS C++开发程序在调试时总是从main或WinMain函数开始,这就让我们很容易误认为它们是程序的第一条指令,但是事实并非如此。main或WinMain函数需要一个调用者,在它们被调用前,编译器其实已经做了很多事情,所以main或WinMain是“语法规定的用户入口”,而不是"应用程序入口"

探寻在main函数调用前编译器做了什么事情:

在调用main()函数前编译器会添加一些初始化c语法或c++语法全局数据,初始化缓冲区溢出全局变量。

程序入口函数mainCRTStartup:

__scrt_common_main:

 这个函数在内部调用了__security_init_cookie()来初始化缓冲区溢出全局变量。(可以通过变量来阻拦一下缓冲区溢出攻击)

 __scrt_common_main_seh:

此函数用来初始化c或c++中的一些全局数据,初始化线程,然后调用invoke_main()。

invoke_main:

调用主函数。

x64dbg定位main函数:

IDA静态分析:

先将exe文件拖入IDA中,通过交叉引用从main反推到入口函数mainCRTStartup。

debug模式下x64程序从mian反推调用过程中汇编特征

1.main

2.jmp

3.4个call,跟进最后一个call

4.movzx

   test

   jz

   mov

   mov

   call

   call  <--跟进

5.2个call,跟进最后一个call

6.一个call,跟进

7.jmp

 

 

 

 

 

 

 

x64dbg动态定位main:

首先我们将应用程序的pdb文件(调试信息)文件删除,模拟真实场景。

我们将exe文件拖入x64dbg.exe中。

 可以看到我们目前还在系统文件空间ntdll.dll中。我们按下F9进入我们自己的应用程序空间。

 

接着我们根据上面IDA的分析反推来找到main函数

步骤如下:

1.jmp -->跟进

2.一个call,跟进

3.2个call,跟进最后一个call

4.movzx

   test

   jz

   mov

   mov

   call

   call  <--跟进

5.4个call,跟进最后一个call

6.jmp

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值