用OD加载文件的时候,不会停留在main
函数上,如何确定main
的位置,这就需要对程序加载过程有个了解。
使用IDA就可以准确定位main
函数的起始位置。
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个,一般而言与编译器有很大的关系,所以,此方法只能算作经验积累。
原文地址:http://blog.csdn.net/bugmeout/article/details/45394889