主函数是c语言的入口,代码逆向(一)——寻找main函数入口
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
004113A0 PUSH EBP ; 函数入口
004113A1 MOV EBP, ESP
004113A3 SUB ESP, 0C0
004113A9 PUSH EBX
004113AA PUSH ESI
004113AB PUSH EDI
004113AC LEA EDI, DWORD PTR SS:[EBP-C0]
004113B2 MOV ECX, 30
004113B7 MOV EAX, CCCCCCCC
004113BC REP STOSD
004113BE MOV ESI, ESP
004113C0 PUSH Test_0.0041573C ; /Hello World!/r/n
004113C5 CALL DWORD PTR DS:[] ; /printf
004113CB ADD ESP, 4
004113CE CMP ESI, ESP
004113D0 CALL Test_0.00411145
004113D5 XOR EAX, EAX
004113D7 POP EDI
004113D8 POP ESI
004113D9 POP EBX
004113DA ADD ESP, 0C0
004113E0 CMP EBP, ESP
004113E2 CALL Test_0.00411145
004113E7 MOV ESP, EBP
004113E9 POP EBP
004113EA RETN
我们单击选择函数入口后,可以看到CPU窗格下面的信息窗格中显示如下信息:
跳转来自 0041100F
我们单击选择此信息后,点击鼠标右键,并选择【转到 JMP 来自0041100F】后即可来到上层调用函数(以后我们将之称为“返回到调用”):
0041100A JMP
0041100F JMP Test_0.004113A0 ; 我们停到这里
00411014 JMP Test_0.004124E0
遇到这种情况直接在返回到调用,此时来到真正调用main函数的地方:
0041195F MOV EAX, DWORD PTR DS:[417148]
00411964 PUSH EAX
00411965 MOV ECX, DWORD PTR DS:[41714C]
0041196B PUSH ECX
0041196C MOV EDX, DWORD PTR DS:[417144]
00411972 PUSH EDX
00411973 CALL Test_0.0041100F ; 我们停到这里
00411978 ADD ESP, 0C
0041197B MOV DWORD PTR DS:[41715C], EAX
00411980 CMP DWORD PTR DS:[417150], 0
00411987 JNZ SHORT Test_0.00411995
00411989 MOV EAX, DWORD PTR DS:[41715C]
0041198E PUSH EAX ; /status => 0
0041198F CALL DWORD PTR DS:[] ; /exit
通过上面的代码我们便看到了main函数的典型特征,临近exit,且有三个参数。接下来我们要做的就是不断地重复上面的步骤,一直到找到程序入口点为止。
最后你要做的就是针对不同的版本不同城上的编译器重复上面的步骤,直到收集到你认为足够丰富的信息后结束,从此你就再也不用怕为找不到main函数而苦恼了。
1.1.2、栈回溯法
栈回溯的方法是先找到main函数中的那个“HelloWorld”,下断点并按【F9】键运行后查看堆栈情况,我这里的堆栈情况如下:
0012FE9C 7C930208 ntdll.7C930208 ; 我们停在这里
0012FEA0 FFFFFFFF
0012FEA4 7FFDE000
0012FEA8 CCCCCCCC
…… ……
0012FF64 CCCCCCCC
0012FF68 /0012FFB8
0012FF6C |00411978 返回到 Test_0.00411978 来自 Test_0.0041100F
0012FF70 |00000001
0012FF74 |003D2C60
0012FF78 |003D2D40
0012FF7C |0A641DBC
0012FF80 |7C930208 ntdll.7C930208
0012FF84 |FFFFFFFF
0012FF88 |7FFDE000
0012FF8C |00369E99
0012FF90 |00000000
0012FF94 |00000000
0012FF98 |00130000 ASCII "Actx "
0012FF9C |00000000
0012FFA0 |0012FF7C
0012FFA4 |00000020
0012FFA8 |0012FFE0 指向下一个 SEH 记录的指针
主函数是c语言的入口,代码逆向(一)——寻找main函数入口相关推荐
- c语言在main函数中结束,C语言程序执行时,必须从main函数开始,从mian函数结束。...
C语言程序执行时,必须从main函数开始,从mian函数结束. 甲在上班途中遗失手机一部,语言程被乙拾得.甲发布悬赏广告称,语言程愿向归还手机者支付现金1000元作为酬谢.根据物权法律制度的规定,下列 ...
- dbg 寻找main函数
方法一,3个push和堆栈平衡 设置函数入口设断点,打开程序到达断点后,一直按F8运行到类似下面的地方,F7步进查看是否是main函数. push edi push esi push dword pt ...
- c语言程序设计函数6,C语言程序设计_哈工大(6):函数.pdf
圳 职 业 技 术 学 院Shenzhen Polytechnic 六单元 :函数 教学内容 函数 教学目标 应知 了解模块化程序的结构 掌握函数的定义方法 掌握函数的调用和参数传递 了解预处理 重点 ...
- java如何寻找main函数对应的类
参考springboot Class<?> deduceMainApplicationClass() {try {StackTraceElement[] stackTrace = new ...
- [汇编与C语言关系]2. main函数与启动例程
为什么汇编程序的入口是_start,而C程序的入口是main函数呢?以下就来解释这个问题 在<x86汇编程序基础(AT&T语法)>一文中我们汇编和链接的步骤是: $ as hell ...
- Main函数之前都发生了什么
目录: 一.STM32启动代码 二.STM32与ARM启动代码比较 1.中断向量表的定义 2.中断函数的跳转实现 三.STM32启动代码汇编详解 1.Stack栈 2.Heap 堆 3.向量表 4.复 ...
- 第七章之main函数和启动例程
main函数和启动例程 为什么汇编程序的入口是_start,而C程序的入口是main函数呢?本节就来解释这个问题.在讲例 18.1 "最简单的汇编程序"时,我们的汇编和链接步骤是: ...
- C语言中main函数的研究,以及对代码断点调试的研究(王爽老师 汇编语言)
版权声明:本文为博主原创文章,未经博主允许不得转载. 我们知道作为一个语言本身是不会有诸如从main函数开始运行这样的条件(深层次的说 底层汇编代码不会指定从mian函数开始的这样的条件,程序开始的位 ...
- 初学C语言第一课代码
//写代码 //写出主函数(main函数) //如何执行? C语言是从主函数的第一行开始执行的 //所以C语言代码中得有main函数--入口 //写个代码,在屏幕上打印:鹏哥 //函数返回类型 #i ...
- C语言程序可以没有main函数
原文链接:http://www.wufangbo.com/175871/ 学习C语言的同学都知道,每个C程序要有一个main函数,程序从main函数开始执行,在main函数中结束.但事实上,C程序也可 ...
最新文章
- 《预训练周刊》第20期:EVA:包含28亿参数的中文预训练对话模型、基于知识融入提示词的文本分类...
- Babel的配置和使用
- 掌握Node.js中的Async和Await
- python 文本框内容变化_jquery文本框内容改变事件
- vim ctrlp找到文件后,如何在新窗口或者新标签中打开
- RMQ问题-ST表倍增处理静态区间最值
- 程序生活----葱油拌面
- ORA-01658: 无法为表空间中段创建 INITIAL 区
- Java订单交易_Java实现获取105发卡平台的订单信息
- Xcode安装及卸载
- 【图像标注】使用vue3实现图像标注功能
- 华为加油!海思加油!翻过这座山,你就是传奇
- 天津高一计算机会考,天津市高中信息技术会考不通过可以参加高考吗
- java关闭端口_使用java代码关闭指定端口的程序-windows
- 支付账户体系(分账接口)的9大价值
- Swagger2的配置教程
- Ubuntu 8.04 AMD64平台下Realplayer 11安装指南
- (读书笔记)《玩着玩着就能成为ppt高手》——怎样才是一个“精彩的ppt”
- 【MyBatis】MyBatis 核心配置综述之 ParameterHandler
- 刚刚宣布婚讯的新垣结衣,为什么是程序员们共同的“老婆”?
热门文章
- C#读取匿名对象的属性值的方法总结
- 51nod 最小方差
- Codeforces Round #417 (Div. 2) B. Sagheer, the Hausmeister
- git init github
- JS判断是否在微信浏览器打开
- mac osx 下gcc升级导致sac101.6a编译失败解决办法
- [JAVA]使用Jersey处理Http协议中的Multipart
- Word插入公式中如何编辑 argmin
- 看了这份《算法中文手册》笔记,就再也不怕字节了~
- 阿里内部平台VS火山引擎后端开发,拿头比?