c语言程序怎么还原回代码,逆向分析:如何一步步还原C代码
逆向实战
应各位的建议,加了注释,喜欢的看官点个赞支持一下,哈哈!
程序入口
如何查找程序入口?
main 函数被调用前要先调用的函数如下:
GetVersion()
_heap_init()
GetCommandLineA()
_crtGetEnvironmentStringsA()
_setargv()
_setenvp()
_cinit()
这些函数调用结束后就会调用main 函数,根据main 函数调用的特征,将3 个参数压入栈内作为函数的参数。
回到反汇编图,我们可以看到OD给我们注释出来的GetCommandLineA()函数下面紧接着push了三个寄存器,这就是我们判断程序入口最简单的方法了!
main函数
简要分析:
这里通过push压入了三个参数,通过mov 寄存器,立即数传入了两个参数,符合__fastcall调用约定的传参"手法";因为__fastcall的传参顺序是从右往左,因此函数1的调用如右:func1(1,3,4,6,7)
通过Main函数识别出来程序大致框架如下:
函数3为编译器自动添加的堆栈平衡检查函数,故在此不用考虑。
void __fastcall func1(int a,int b,int c,int d,int e){
}
//函数2我们暂时不知道是什么,先写到这
void __cdecl func2(int x,int y){
}
void main(int argc,char *argv[])
{
func1(1,3,4,6,7);
func2(m,n);
}
func1函数
简要分析:
mov [local.2],edx实现将mov dword ptr ds:[ebp-8],edx,即给局部变量赋值,不熟悉这部分的朋友可以函数调用与堆栈图分析相关知识点。
这里push了三个参数,并且是在函数内部平衡的堆栈,可以基本判断调用方式为stdcall(这种调用约定在函数内部使用ret n的方式平衡堆栈,待分析func3的时候再论)。
你问我堆栈平衡怎么看,继续往下看吧,紧接着func3向下面分析:
mov [local.3],eax:这句的作用是将调用func3的返回结果eax放到[ebp-0c]中;紧接着又push了两个寄存器,调用func4,并且我们可以看到在call func4之后有条add esp,0x8,这就是堆栈平衡,目的是让堆栈恢复到调用前的状态,由于是在func4外部平衡的堆栈,我们也叫做外平栈,调用约定为C和CPP默认的__cdecl!
从以上汇编代码识别出func1的框架如下:
void __fastcall func1(int a,int b,int c,int d,int e){
int x=1;
int y=3;
func3(x,y,c);
func4();
func4();
}
func3函数
简要分析:
[arg.1]即我们之在main函数看到的传入的第一个参数(最左边的),其它的不再赘述,经过一番加法运算后将返回值放到eax中,看伪代码吧。
func3函数大致框架如下:
int __cdecl func3(int x,int y,it z)
{
return x+y+z;
}
func1函数补充如下:
void __fastcall func1(int a,int b,int c,int d,int e){
int x=1;
int y=3;
int z=func3(x,y,c);
func4(x,y);
func4();
}
这里再提一下,x即[ebp-4],y即[ebp-8],z即[ebp-0c],对应func1函数部分的[local.1],[local.2],[local.3].
func4函数
简要分析
同上,不再赘述,直接看伪代码吧!
func4的函数框架如下:
int cdecl func4(int x.int y)
{
return x+y;
}
func1函数补充如下:
void __fastcall func1(int a,int b,int c,int d,int e){
int x=1;
int y=3;
int z=func3(x,y,c);
int p=func4(x,y);
func4(p,z); //运算后eax=0C
}
同理,p代表func1函数部分的[local.4].
到此,func1基本逆向完成,回到main函数,继续func2的逆向,如下:
func2函数
进到func2函数内部,发现其应该是printf函数,那么回到main函数,继续完善,如下:
Main函数
int cdecl func4(int x,int y)
{
return x+y;
}
void __fastcall func1(int a,int b,int c,int d,int e){
int x=1;
int y=3;
int z=func3(x,y,c);
int p=func4(x,y);
func4(p,z); //运算后eax=0C
}
void main(int argc,char *argv[])
{
printf("%d",func1(1,3,4,6,7));
}
c语言程序怎么还原回代码,逆向分析:如何一步步还原C代码相关推荐
- Simens NX (原UG)内部代码逆向分析 / Inner code Reverse analysis of NX software
[篇首语]这里的逆向分析不是机械中的反求工程(抄数),而是软件中的逆向工程,旨在研究软件内部代码实现机制.我在这里要说明一下,软件逆向不在软件使用的许可范围之内,仅可以作为研究软件实现功能的一种方法. ...
- 逆向分析使用COM组件对象模型的代码
<恶意代码分析实战>第七章实验7-2的程序使用了COM进行联网通信.首先把书上第七章关于COM介绍的原文贴出来: 总结一下,就是说恶意程序有时会通过另一个服务程序提供的接口函数实现一些操作 ...
- 八路抢答器c语言程序,八路抢答器-51单片机(附Proteus仿真、C代码、原理图及PCB、论文和元器件清单)...
获取全套设计资源,请见后文说明- 设计要求 1)抢答器同时供8名选手或2个代表队比赛,分别用8个按钮S0-S7表示: 2)设置一个系统清除和抢答控制开关S,该开关由主持人控制: 3)抢答器具有锁存与显 ...
- 用c语言程序编写天干地支,农历中天干地支的计算【C代码】
[本程序在DEV C++ 4.9.9.2 下编译通过] 有关农历的东西有以下几篇文章: /* 函数名称:int GetChineseEra(int year,int flag) 函数功能: 返回某年对 ...
- 五位数回文数c语言程序,五位数的回文数有多少个
2018-12-16 数学中有哪些回文数? 简介折叠编辑本段回文数是指一个像16461这样"对称"的数,即:将这个数的数字按相反的顺序重新排列后,所得到的数和原来的数一样.这里,& ...
- android qq群加群代码,逆向分析某QQ恶意自动邀请加群APK
本帖最后由 boomsoap 于 2019-5-23 18:48 编辑 一:基本原理 APK通过调用了qq登陆并实现了使用者的QQ群的读取,让使用者自动的邀请指定的QQ号,而指定QQ号再进行群发消息传 ...
- 【32位win7一键扫雷】32位win7系统自带扫雷游戏逆向分析之一键扫雷(附VS代码工程文件、可执行文件和OD分析缓存文件)
实现效果 视频地址:https://www.zhihu.com/zvideo/1373742900744974336 附一张扫雷自定义中难度最大时进行一键扫雷的截图,如下,24*30,共668颗雷. ...
- 玩转代码|逆向分析一下4399小游戏绕过实名认证
4399的实名认证真是越来越恶心了,本以为只是响应国家号召做点表面功夫,没想到现在他们又在网页上加了反调试.看来是4399是认真的. 目录 0X00实名认证提醒 0X01分析 0X03断点发现=关键元 ...
- php 后门代码_分析一段PHP的后门代码,很恶心
[PHP] 纯文本查看 复制代码if($_GET['ac']=="ok"){ echo 'OK'; function downFile($url,$path){ $arr=pars ...
最新文章
- .net下绘制统计图工具-请推荐
- Node.js与Sails~方法拦截器policies
- java 数组的动态初始化和静态初始化
- Nginx文件描述符泄露?浅析FD_CLOEXEC文件描述符标志
- 【Linux 操作系统】Ubuntu 配置 ftp freemind adb
- Android基础教程pdf
- springmvc项目在启动完成之后执行一次方法_SpringMVC运行原理
- MySQL删除存储过程
- 【性能测试】性能测试基础:性能测试的概念、分类、场景和设计要点
- 初学JAVA,javaoo小结
- 对话Pauly Comtois:赫斯特商业媒体中的企业DevOps采用
- 《C++程序设计POJ》《WEEK3 类和对象进阶》成员对象和封闭类/友元/this指针/常量成员函数...
- 无人驾驶 ai算法_AI机器学习具有碳足迹,因此无人驾驶汽车也是如此
- html css js肝撸淘宝官网代码(淘宝web端官网页面+部分js功能实现)
- centos7虚拟机网桥模式不通_Centos7虚拟机桥接模式
- 假设用于通信的电文由字符集{a,b,c,d,e,f,g}中的字母构成。它们在电文中出现的频度分别为
- 英语计算机自我介绍范文面试,计算机面试英文自我介绍范例
- 关于引用的介绍和使用
- 键盘方向键的码值列表
- 如何优雅地提取 App 的素材
热门文章
- 连续恰饭涨700w播放,B站这支视频成B站推广新标杆
- 荣耀30Pro怎么申请鸿蒙,荣耀30Pro在今年可以升级到鸿蒙系统,华为已经照顾到了荣耀用户...
- 云象黄步添:区块链和隐私计算打破数据安全流动矛盾,构建数据要素市场基石
- 别人家的大学,哈工大来了!
- 《Splunk智能运维实战》——第3章 仪表盘和可视化——让数据闪光 3.1 简介
- 《Splunk智能运维实战》——1.4 使用脚本输入
- C语言——折半查找法
- 交互设计课程的心得体会
- 加工中心y轴服务器超差,加工中心坐标轴间隙导致的镗孔圆度超差
- 设计模式之行为模式模型