反汇编 c++/c 确定main函数的位置
2015-04-30 14:56
375 查看
用OD加载文件的时候,不会停留在
使用IDA就可以准确定位
可以看到,main函数开始之前,有很多的初始化工作。OD不会全部识别,唯一可以识别的函数是
因此,只要在GetCommandLine后跳过4个函数,一般就可以到达
如果你不想使用IDA加载程序来获得main函数位置,使用此方法可以快速找到main函数。是不是跳过4个,一般而言与编译器有很大的关系,所以,此方法只能算作经验积累。
可以看到,windows应用程序比控制台程序又多了
好在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函数。
因此,只要在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个。
好在OD可以识别
GetModuleHandle,所以在此函数之后,就是
winmain函数。当然,从压入的4个参数也能够看出来。
相关文章推荐
- 如何使用css sprites 确定小图在整图中的位置
- 确定当前Python环境中的site-packages目录位置
- 内存泄漏位置的确定方法
- ios 使用CoreLocation框架确定他的物理位置
- 用ethtool确定多网卡Linux服务器网口位置
- 两个软硬程度一样的鸡蛋,它们在某一层摔下会碎,有个100层的建筑,要求最多用两个鸡蛋确 定鸡蛋安全下落的临界位置,给出临界位置?如果是n层楼,m个鸡蛋,请给出确定临界位置的算法
- 用ethtool确定多网卡Linux服务器网口位置
- 第十三周 项目1 确定点在圆上的位置(补发)
- 当长时间点击ListView时弹出contextMenu如何确定被点击listView中item的位置
- 如何用ZBrush确定头部五官的位置
- c++程序崩溃生成dump文件确定错误位置方法
- html5使用js确定用户坐标位置
- 最大子序列和问题以及确定序列起终点位置
- BBS 设计思路系列 ---- 通过某个用户在某个榜某个位置来确定这个用户的价值
- 让我们愉快的切割吧 - 5: 如何在字符串中确定第一个数字的位置
- 确定字符串第二个大写字母的位置并分拆
- 多网卡Linux服务器如何确定网口位置
- JavaScript确定鼠标位置
- 跨浏览器确定浏览器窗口位置及窗口大小
- twoSum问题 两个数组相加为确定值,输出对应数组的位置