反汇编 c++/c 确定main函数的位置

本文深入解析了使用OD工具定位main函数在程序加载过程中的位置,包括控制台程序和Windows应用程序的不同识别方式及跳转方法。通过理解和跳过初始化函数,可以直接定位到main函数,为开发者提供了一种快速简便的方法来查找main函数位置。

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

用OD加载文件的时候,不会停留在main函数上,如何确定main 的位置,这就需要对程序加载过程有个了解。
使用IDA就可以准确定位main 函数的起始位置。

控制台部分识别

console beta
void __cdecl start()
{
  DWORD v0; // eax@1
  int v1; // eax@4

  v0 = GetVersion();
  dword_4101A4 = BYTE1(v0);
  dword_4101A0 = v0;
  dword_41019C = BYTE1(v0) + (v0 << 8);
  dword_410198 = v0 >> 16;
  if ( !sub_4068EE(0) )
    fast_error_exit(0x1Cu);
  _ioinit();
  dword_411704 = *GetCommandLineA*();
  dword_41017C = __crtGetEnvironmentStringsA();
  _setargv();
  _setenvp();
  _cinit();
  dword_4101B8 = envp;
  v1 = main(argc, argv, envp);
  exit(v1);
}

可以看到,main函数开始之前,有很多的初始化工作。OD不会全部识别,唯一可以识别的函数是GetCommandLine,在此函数执行之后,一般要再次调用4个函数__crtGetEnviromentStrings、setargv、setenvp、cinit,此后才会执行main 函数。
MAIN函数确定
因此,只要在GetCommandLine后跳过4个函数,一般就可以到达main 函数的位置。

如果你不想使用IDA加载程序来获得main函数位置,使用此方法可以快速找到main函数。是不是跳过4个,一般而言与编译器有很大的关系,所以,此方法只能算作经验积累。

window应用程序识别

windows程序常用start代码
void __cdecl start()
{
  DWORD v0; // eax@1
  signed int v1; // eax@4
  HMODULE v2; // eax@7
  int v3; // eax@7
  int v4; // [sp-4h] [bp-78h]@6
  CHAR *lpCmdLine; // [sp+10h] [bp-64h]@3
  struct _STARTUPINFOA StartupInfo; // [sp+18h] [bp-5Ch]@3
  CPPEH_RECORD ms_exc; // [sp+5Ch] [bp-18h]@3

  v0 = GetVersion();
  dword_405528 = BYTE1(v0);
  dword_405524 = (unsigned __int8)v0;
  dword_405520 = BYTE1(v0) + ((unsigned __int8)v0 << 8);
  dword_40551C = v0 >> 16;
  if ( !_heap_init(0) )
    fast_error_exit(0x1Cu);
  ms_exc.registration.TryLevel = 0;
  _ioinit();
  dword_405A18 = (int)GetCommandLineA();
  dword_405504 = (void *)__crtGetEnvironmentStringsA();
  _setargv();
  _setenvp();
  _cinit();
  StartupInfo.dwFlags = 0;
  GetStartupInfoA(&StartupInfo);
  lpCmdLine = (CHAR *)_wincmdln();
  if ( StartupInfo.dwFlags & 1 )
    v1 = StartupInfo.wShowWindow;
  else
    v1 = 10;
  v4 = v1;
  v2 = GetModuleHandleA(NULL);
  v3 = WinMain(v2, NULL, lpCmdLine, v4);
  exit(v3);
}

可以看到,windows应用程序比控制台程序又多了GetStartupInfo,GetModuleHandle ,所以此时就应该跳过6个。
windows窗口程序

好在OD可以识别GetModuleHandle ,所以在此函数之后,就是winmain 函数。当然,从压入的4个参数也能够看出来。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值