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

时间: 2024-10-14 04:07:01

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

PC逆向之代码还原技术,第六讲汇编中除法代码还原以及原理第二讲,被除数是正数 除数非2的幂

目录 一丶简介 二丶代码还原讲解 1.被除数无符号 除数非2的幂 2.被除数无符号 除数为特例7 三丶代码还原总结 一丶简介 上一篇博客说的除2的幂. 如果被除数是有符号的,那么会进行调整,并使用位操作进行优化 本片博客专门讲解除数不是2的幂 二丶代码还原讲解 1.被除数无符号 除数非2的幂 高级代码: Release汇编 .text:0040101A mov eax, 38E38E39h .text:00401023 mul [esp+10h+var_8] .text:00401027 shr

逆向课程第二讲,寻找main入口点

一丶识别各个程序的入口点 入门知识,识别各个应用程序的入口点 (举例识别VC 编译器生成,以及VS编译生成的Debug版本以及Release版本) 1.识别VC6.0 Debug版本 1.1 首先,新建一个VC debug版本的程序,然后F5运行,可以看到栈回溯窗口 1.2 而后通过栈回溯窗口,点击mainCRTStarup,查看main函数之前会调用什么API 确定之后,OD打开查看. 可以看到调用API的位置,但是怎么确定那个是入口点,我们知道,  VC中的main函数是3个参数,那么我们只

常见各种语言程序入口点代码

Borland Delphi 6.0 - 7.000509CB0 > $ 55 PUSH EBP00509CB1 . 8BEC MOV EBP,ESP00509CB3 . 83C4 EC ADD ESP,-1400509CB6 . 53 PUSH EBX00509CB7 . 56 PUSH ESI00509CB8 . 57 PUSH EDI00509CB9 . 33C0 XOR EAX,EAX00509CBB . 8945 EC MOV DWORD PTR SS:[EBP-14],EAX0050

第二讲 python程序基本架构

输入-------------处理------------------------------输出 变量赋值        算术运算(+.-.*./)             打印输出 输入语句        逻辑运算(如:判断字符串大小)     写入文件(用户名:ip:时间) 算法处理                           写入数据库 eg1: >>> x=12 --------|>>> y=13---------|----输入>>>

汇编代码还原第一讲,基本类型以及浮点编码.

目录 代码还原技术 一丶简介代码还原 二丶代码还原中的数据类型表现形式 1.整数类型 2.无符号整数 3.有符号整数 4.浮点数数据类型 5.浮点编码 4.Double类型解析. 三丶浮点汇编 1.浮点栈 2.浮点汇编 3.使用内联浮点汇编实现加法 四丶布尔类型 地址丶指针丶引用表达形式 常量 #define与const定义 总结: 代码还原技术 一丶简介代码还原 例子一:我们很多人都学习过汇编.但是汇编的核心知识就是我能看的懂.有人拿汇编去做外挂.比如我去追偏移.看着视频去做.然后换一个游戏依

“金山杯2007逆向分析挑战赛”第一阶段第二题

注:题目来自于以下链接地址: http://www.pediy.com/kssd/ 目录:第13篇 论坛活动 \ 金山杯2007逆向分析挑战赛 \ 第一阶段 \ 第二题 \ 题目 \ [第一阶段 第二题] 题目描述: 己知是一个 PE 格式 EXE 文件,其三个(section)区块的数据文件依次如下:(详见附件)  _text,_rdata,_data 1. 将 _text, _rdata, _data合并成一个 EXE 文件,重建一个 PE 头,一些关键参数,如 EntryPoint,Imp

Windows 程序启动性能优化(先载入EXE,后载入DLL,只取有限的代码载入内存,将CPU的IP指向程序的入口点)

一.重定位链接时重定位:目标文件一般由多个节组成,编译器在编译每个目标文件时一般都是从0地址开始生成代码.当多个代码节合成一个代码段时,需要根据其在最终代码段中的位置做出调整.同时,链接器需要对已经解析的符号分配运行时地址.这个过程就是重定位. 加载时重定位:程序中可能调用了DLL,由于EXE是最先被加载的,所以一般都能加载到其想要的内存地址上:而DLL的加载一般在EXE之后,就需要对DLL中的地址进行重定位了. 二.程序的启动过程WIN32程序启动过程包括: (1)操作系统把程序加载到内存,并

逆向知识第十讲,循环在汇编中的表现形式,以及代码还原

一丶do While在汇编中的表现形式 1.1高级代码: #include "stdafx.h" int main(int argc, char* argv[]) { int nSum = 0; int i = 0; do { nSum = nSum + i; } while (i <=100); return 0; } 高级代码很简单,只是一个简单的求1~100的累加 1.2 Debug版本下的汇编表现形式 代码定式很简单 ADDR .....do While逻辑代码块 xxx

逆向实用干货分享,Hook技术第一讲,之Hook Windows API

逆向实用干货分享,Hook技术第一讲,之Hook Windows API 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶什么是Hook,以及Hook能干啥 首先这一个小标题主要介绍神马是Hook,如果知道的,则不用看了. 这里我偷袭啊懒,贴出Hook的意思  https://baike.baidu.com/item/%E9%92%A9%E5%AD%90%E7%A8%8B%E5%BA%8F Hook,英文单词中成