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

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

    参考详细资料

  • 相关阅读:
    Windbg学习 (0x0002) 命令基础
    Windbg学习 (0x0001) 安装与基本配置
    python 20day--装饰器详解
    python 19day--生成器详解
    python 18day--迭代器详解
    python 17day--内置函数
    python 16day--函数作用域与函数式编程
    python 15day--递归函数与匿名函数
    python 14day--函数
    python 13day--集合、字符串格式化
  • 原文地址:https://www.cnblogs.com/iBinary/p/9954812.html
Copyright © 2020-2023  润新知