PC逆向之代码还原技术,第二讲寻找程序入口点
一丶简介
程序逆向的时候.我们需要知道程序入口点.动态分析的时候以便于看是什么程序编写的.
比如VC++6.0 我们可以写一个程序测试一下
我们写一段代码. F10进行调试.看看是谁调用的main即可.
部分代码拷贝如下:
__try {
_ioinit(); /* initialize lowio */
#ifdef WPRFLAG
/* get wide cmd line info */
_wcmdln = (wchar_t *)__crtGetCommandLineW();
/* get wide environ info */
_wenvptr = (wchar_t *)__crtGetEnvironmentStringsW();
_wsetargv();
_wsetenvp();
#else /* WPRFLAG */
/* get cmd line info */
_acmdln = (char *)GetCommandLineA(); //GetCommandLineA
/* get environ info */
_aenvptr = (char *)__crtGetEnvironmentStringsA(); // GetEnvironmentStringsA();
_setargv();
_setenvp();
#endif /* WPRFLAG */
_cinit(); /* do C data initialize */
#ifdef _WINMAIN_
StartupInfo.dwFlags = 0;
GetStartupInfo( &StartupInfo );
#ifdef WPRFLAG
lpszCommandLine = _wwincmdln();
mainret = wWinMain(
#else /* WPRFLAG */
lpszCommandLine = _wincmdln();
mainret = WinMain(
#endif /* WPRFLAG */
GetModuleHandleA(NULL), //调用GetModuleHandle() API
NULL,
lpszCommandLine,
StartupInfo.dwFlags & STARTF_USESHOWWINDOW
? StartupInfo.wShowWindow
: SW_SHOWDEFAULT
);
#else /* _WINMAIN_ */
#ifdef WPRFLAG
__winitenv = _wenviron;
mainret = wmain(__argc, __wargv, _wenviron);
#else /* WPRFLAG */
__initenv = _environ;
** mainret = main(__argc, __argv, _environ);** 调用main函数位置.可以看到三个参数
#endif /* WPRFLAG */
#endif /* _WINMAIN_ */
exit(mainret);
}
__except ( _XcptFilter(GetExceptionCode(), GetExceptionInformation()) )
{
/*
* Should never reach here
*/
_exit( GetExceptionCode() );
} /* end of try - except */
}
通过上面代码我们可以定位特征
程序调用了:
GetCommandLine();
GetEnvironmentStringsA();
GetModuleHandle() API
然后下方调用了main函数. main函数是是三个参数.所以我们动态或者静态调试的时候可以观看特征找到我们入口点
看上面图片,我们可以看到有一个API给我们标注出来了就是GetCommandLine函数.
那么根据特征.main函数调用就在下面了.下面还会调用几个API
我们知道main函数是三个参数.所以找有三个push的地方. 可以看到上图 0x40100F 就是我们的main函数内部.
看上图可以看到main里面的代码.因为我是Debug程序.所以我们看到的0x40100F内部是一个JMP. 跳转到我们的main
入口点.也就是0x401250 位置.
根据以上方法.我们可以多观看几个编译器的特征.进行定位.