pe文件运行过程

分析vc6 生成的hello world 程序,

 一、pe入口为 _WinMainCRTStartup (ida6.5显示的函数名,下面是ida7.5转的C代码),简单来说,就是先调用HeapCreate建立一个可变大小的堆,在该堆上申请几块内存用于管理小内存变量,如果是变量较大则调用HeapAlloc。

二、实验

        1、    void* p=HeapCreate(0,4096,0);   

                 void * e=HeapAlloc(p,0,16482);

运行之后,p=0x003f0000,e=0x003f07e0,此时堆应该变大了

        2、   void* p1=HeapCreate(0,4096,0);
                void* p2=HeapCreate(0,4096,0);
                void * e=HeapAlloc(p1,0,16482);

运行之后 p1=0x00560000 p2=0x01f30000 e=0x005607e0

总结:HeapCreate 中预留空间,HeapAlloc申请的空间超范围,则扩大Heap

void __noreturn start()
{
  DWORD v0; // eax
  HMODULE v1; // eax
  int nShowCmd; // [esp+Ch] [ebp-6Ch]
  CHAR *lpCmdLine; // [esp+14h] [ebp-64h]
  int Code; // [esp+18h] [ebp-60h]
  struct _STARTUPINFOA StartupInfo; // [esp+1Ch] [ebp-5Ch] BYREF
  CPPEH_RECORD ms_exc; // [esp+60h] [ebp-18h]

  v0 = GetVersion();
  dword_4236E0 = BYTE1(v0);
  dword_4236DC = (unsigned __int8)v0;
  dword_4236D8 = BYTE1(v0) + ((unsigned __int8)v0 << 8);
  dword_4236D4 = HIWORD(v0);
  if ( !_heap_init(0) )
    fast_error_exit(28);
  ms_exc.registration.TryLevel = 0;
  _ioinit();
  dword_42502C = (int)GetCommandLineA();
  dword_4236B8 = __crtGetEnvironmentStringsA();
  _setargv();
  _setenvp();
  _cinit();
  StartupInfo.dwFlags = 0;
  GetStartupInfoA(&StartupInfo);
  lpCmdLine = (CHAR *)_wincmdln();
  if ( (StartupInfo.dwFlags & 1) != 0 )
    nShowCmd = StartupInfo.wShowWindow;
  else
    nShowCmd = 10;
  v1 = GetModuleHandleA(0);
  Code = WinMain(v1, 0, lpCmdLine, nShowCmd);
  exit(Code);
}

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麻雀123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值