PC逆向之代码还原技术,第二讲寻找程序入口点

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 位置.

根据以上方法.我们可以多观看几个编译器的特征.进行定位.

参考详细资料

原文地址:https://www.cnblogs.com/iBinary/p/9954812.html