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

一丶识别各个程序的入口点

入门知识,识别各个应用程序的入口点

(举例识别VC 编译器生成,以及VS编译生成的Debug版本以及Release版本)

1.识别VC6.0 Debug版本

1.1 首先,新建一个VC debug版本的程序,然后F5运行,可以看到栈回溯窗口

1.2 而后通过栈回溯窗口,点击mainCRTStarup,查看main函数之前会调用什么API

确定之后,OD打开查看.

可以看到调用API的位置,但是怎么确定那个是入口点,我们知道,  VC中的main函数是3个参数,那么我们只需要找到

三个push 然后一个Call的位置,则可以确定,(确定也是要你F7跟进去,看看代码是不是main函数的代码,或者参数传参是什么)

1.3确定main入口点

在上图可以看到,三个push,然后一个Call,那么我们跟进去查看,因为是Debug版本,所以已经提示出来参数是什么了

所以直接可以确定了.

1.4 F7跟进去查看

可以直接确定使我们的入口点

IDA查看一次

步骤和前边一样,先看入口点特征,Debug版本特征是调用API GetVersion

所以IDA中查看.

1.查看文本视图

2.展开文本视图

这里提示你要CTRL +  加号 展开

展开查看

3.根据特征,读取代码,确定main位置

因为是Debug所以有符号显示 下面直接看Release版本

2.查看VC6.0 Release版本

首先,特征是一样的,都是调用GetVersion

那么现在直接OD打开去分析.(当然IDA也可以,都是工具)

1.一样,先找特征

2.找到之后,因为我们写的是main,所以判断是main,只要找到三个push一个Call即可

已经找到了 F7 跟进去查看.

3.确认是不是.

可以看出,因为是Release版本,所以都给优化没了.确实使我们写的代码

3.查看VS系列 Debug版本(没个版本不一样,所以先看下特征这里是 VS 2015)

1.栈回溯,确定入口点特征

首先第一步,还是编写一段代码

然后通过栈回溯,查看入口的特征.

那么我觉着,这个是入口点的特征,而在tmainCRTStartup里面调用的wmain

那么此时OD打开的时候可以分析遇到的第二个call,然后在第二个call里面跟进去.

通过栈回溯,可以看到会调用这种API,而下方的截图则会调用wmain,所以OD打开,不断的跟,也是三个push 一个Call

2.OD分析

因为是Debug版本,有跳转表,也可以看到符号信息,所以直接跳转过来

跳转过来之后(看下图)

可以看到确实是两个Call,也就是我们上面分析的,然后进入第二个Call

3.确定入口点位置

F7跟进去,查找三个push  一个Call

找到了,我们跟进去查看,看看是否是入口点,

跟进去之后发现又有一层跳转表,没关系,F8 走过去

跟过来之后则会发现确实使我们入口点写的代码了

 

4. VS系列,查看Release版本

Release版本是一样的,直接IDA打开查看(换着工具看)

1.进去IDA,打开入口点,CTRL + 加号展开

CTRL + 加号展开不做演示,同上面分析一样.

查看反汇编

发现IDA直接跟过来的就是这个,那么此时好办了,我们知道main在它的下面,那么直接寻找三个push 一个Call即可.

找到了,双击_main确认一下.

我们刚才写的代码已经出来了

转载于:

作者:IBinary
出处:http://www.cnblogs.com/iBinary/

原文地址:https://www.cnblogs.com/gd-luojialin/p/11219704.html

时间: 2024-11-11 20:40:55

逆向课程第二讲,寻找main入口点的相关文章

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

PC逆向之代码还原技术,第二讲寻找程序入口点 一丶简介 程序逆向的时候.我们需要知道程序入口点.动态分析的时候以便于看是什么程序编写的. 比如VC++6.0 我们可以写一个程序测试一下 我们写一段代码. F10进行调试.看看是谁调用的main即可. 部分代码拷贝如下: __try { _ioinit(); /* initialize lowio */ #ifdef WPRFLAG /* get wide cmd line info */ _wcmdln = (wchar_t *)__crtGet

【雅思基础课程】语法基础课程-第二讲

雅思语法基础课程-第二讲 第二讲 一切从简单句开始之 S Vt O 机器吞了我的卡! The machine eats my card! --- 指经常吞卡,现在.过去.将来,不符合常理 The machine ate my card! --- S + Vt + O 这样符合常理,只吞了一两次 \1. S= n. / pron. / to do/ 主语从句 1.n. 2.pron. 代词 3.to do 4.主语从句 \2. O= n. / pron. /to do/ 宾语从句 1.n, 2.p

判断单链表是否存在环,如果存在则寻找环的入口点,用快慢指针法

pNode findBeginning(pNode head) { pNode p1 = head; pNode p2 = head; //第一步:判断链表是否有环 while (p2->next != NULL){ p1 = p1->next; p2 = p2->next->next; if (p1 == p2)//链表确实存在环 break; } if (p2->next == NULL)//链表不存在环 return NULL; //第二步:开始寻找环的入口点 p1 =

程序定义了多个入口点。使用 /main (指定包含入口点的类型)进行编译

原文:请使用/main进行编译,以指定包含入口点类型 在使用VS工具初学C#的时候需要不停的写小程序,觉得每次都新建项目太过麻烦,所以试着把程序写在一个项目下面,结果编译的时候出错了,因为我每个小程序都使用的Main()方法,而VS的提示信息虽然看得懂原因,却不明白要怎么做,后来查阅MSDN得到解决办法,在此与跟我有同样疑惑的人分享: 解决办法: VS界面点击:项目-->XX属性-->应用程序  在此页有一个启动对象属性设置成你想启动的那个类名就可以了. 另外:/main进行编译是指在CMD命

不包含适合于入口点的静态“Main”方法

问题背景 建立一个C#项目之后,删除了自带的Class1类.完成了程序的编写之后提示如下错误: 问题解决 方案1 在 public partial class MainForm : Form下面添加这句话 public static void Main(string[] args) { // Starts the application. Application.Run(new FormXXX());//FormXXX是你定义的窗口类 } 程序就可以运行了. 方案2 在form窗体的代码类中添加

Android程序的入口点是什么,不是Main()吗

很多初入Android开发的网页可能不知道Android程序的入口点是什么,不是main()吗,当然我相信回复onCreate的在字面上不算错,但是你们想的是Activity中的onCreate 方法吧,其实真正的入口点entrypoint是什么. Android使用Google Dalvik VM,相对于传统Java VM而言有着很大的不同,在Sun的Java体系中入口点和标准c语言一样是main(),而每个Android程序都包含着一个Application 实例,一个Application

不包含适合于入口点的静态“Main”方法/does not contain a static 'Main' method suitable for an entry point

error:as subject solution: 1. Must be declared as static 2. Main, is defined with the wrong case, such as lower-case main. 3. must return void or int 4. it must have either no parameters or else one parameter of type string[] static void Main() { //

WPF 不包含适合于入口点的静态“Main”方法

手动创建App.xaml作为启动项目时,编译时提示错误: 1>------ 已启动生成: 项目: WpfApplication11, 配置: Debug Any CPU ------ 1>CSC : error CS5001: 程序"e:\RefCode\C#\.....\obj\Debug\WpfApplication11.exe"不包含适合于入口点的静态"Main"方法 ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0

跟我学《JavaScript高程3》 第二讲,课程笔记

跟我学<JavaScript高程3> 第二讲:第3章 课程制作:bling,兴哥,5年Java,3年前端 课程知识:JavaScript.Html.Css 课程目标:前端体系课程,逐步深入,找到一份前端工作 课程大纲:本书目录结构 适合人群:前端初学者,可以0基础,但要认真,踏实 课程回顾 1.静态项目基本结构:html.css.js.images 2.文件的方式引入一个JavaScript脚本文件:引入方式.引入路径 3.变量编写Hello,world:变量的定义,使用变量. 补充:变量在讲