反汇编c语言函数 c++ 反汇编( 二 )


对于成功进行反汇编的代码,IDA根据代码的入口、调用、转移等指令,可以为使用者提供各种格式的程序的流程图,IDA提供许多格式由用户选择,便于用户理解程序的结构 。
汇编语言的科学定义,其实就是介于机器码(各种01)和高级语言(如C)之间的一种语言 。你用C语言写一段程序 , 其实要在机器上运行的话,机器是不懂的,要经过编译器、汇编器编译 , 变成汇编,最终再变成机器码 , 机器根据这些机器码的01可以控制硬件电路完成你程序想执行的操作 。
C语言怎么使用调用函数?例子代码如下所示:
int Add(int x, int y) {int sum;
sum = x + y;return sum;
}void main() {int z;
z = Add(1, 2);printf("z=%d\n", z);
}
下面分析一下 Add函数的调用过程 。
首先断点在z = Add(1, 2);处, 反汇编如下所示:
int z;
z = Add(1, 2);002C141E 6A 02push2002C1420 6A 01push1002C1422 E8 60 FC FF FFcall002C1087
002C1427 83 C4 08addesp,8002C142A 89 45 F8movdword ptr [ebp-8],eax
首先压入参数1和2:
002C141E 6A 02push2002C1420 6A 01push1
通过观察ESP可以看到参数从右到左依次入栈,ESP往低内存方向移动8字节:
ESP=0025FCCC
...0x0025FCAA00 00 78 4c 33 00 bc fc 25 00 a9 fe aa 0f 78 4c 33 00 c8 fc 25 00 3d 5a b2 0f *** 01 00 00 00 02 00 00 00 ***0x0025FCCC00 00 00 00
谁能帮我把一个hex文件反编译为c语言文件?文件有两种 , 一种是文本文件,一种是程序二进制文件 , 不管哪种文件都可以用十六进制编码来显示 , 称为hex文件 。
1、文本Hex文件一般不需要转成C语言,更多的是程序二进制文件,用十六进制显示,可以转换成C语言,一般使用相应的反汇编程序来实现,这方面的工具很多,不同的平台略有不同 。Windows平台一般常用的OllyDbg、Windbg、IDA,Linux平台使用最多的是GDB和Linux版的IDA 。
OllyDbg,简称OD,一般是软件逆向工程爱好者,最先使用的一个工具,但是因为当下不在更新 , 所以一般用一般用于学习使用,下图中左上角的区域即为反汇编区域 ,用户可以根据汇编指令 , 分析程序算法 , 然后自己编写代码 。
在Windows平台,特别是x64平台,最好用的反汇编工具除还得是Windbg 。将程序载入Windbg后,可以输入u命令来查看程序的反汇编代码 。
2、对于编程人员来说,逆向分析是一个基本的技能,但是往往不容易入门 , 这里举一个例子 。以一段早些年ShellCode的十六进制代码为例,代码如下图所示,这段不起眼的代码,实际上实现了一个下载者的功能 。
拿到这样的十六进制代码 , 一般来说,先将其生成二进制文件 , 然后再分析其指令,通过反汇编指令再写出源码 。只需要将上面的十六进制代码,保存到C语言的字符串数组中 , 写入到一个Exe的文件空段中,再修改指令将其跳转到程序入口处即可,这个过程类似于软件安全领域的壳 。
将十六进制代码写入一个exe文件后,就可以将exe文件载入动态调试器进行动态分析或者使用静态反汇编程序进行静态分析,两者的不同在于动态调试器是要运行程序的,而静态反汇编分析不需要运行程序,所以一般恶意程序,都采用静态分析 。反汇编开头的一段十六进制代码注释如下:
4AD750215Apopedx; 函数返回的地址保存到edx中
4AD7502264:A1 30000000moveax, dword ptr fs:[30]; 取peb
4AD750288B40 0Cmoveax, dword ptr [eax+C]; peb_link
4AD7502B8B70 1Cmovesi, dword ptr [eax+1C]; 初始化列表到esi
4AD7502EADlodsdword ptr [esi]; [esi]-eax + 8的位置即kernel32.dll的地址

推荐阅读