找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2673|回复: 26
打印 上一主题 下一主题
收起左侧

怎么吧hex文件转换成c文件啊

  [复制链接]
跳转到指定楼层
楼主
ID:1084404 发表于 2023-6-20 22:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883242 发表于 2023-6-21 07:08 | 只看该作者
转不了,别想了。等什么时候实现sh1t2rice转换再说吧。
回复

使用道具 举报

板凳
ID:1034262 发表于 2023-6-21 09:47 | 只看该作者
问问人工智能
回复

使用道具 举报

地板
ID:57657 发表于 2023-6-21 10:22 | 只看该作者
hex反汇编再反C,网上搜一下有没有大神会搞,人工翻译没有免费的。
回复

使用道具 举报

5#
ID:656419 发表于 2023-6-21 13:40 | 只看该作者
呃   一般别人的HEX才需要反成C啊,,,,大兄弟你干了啥,,,
回复

使用道具 举报

6#
ID:517951 发表于 2023-6-21 14:05 | 只看该作者
hex文件在不知道是51还是ARM或是其他什么单片机型号下, 你是没办法还原为c的. 以后人工智能高度发达了,或许有可能.  
回复

使用道具 举报

7#
ID:142059 发表于 2023-6-21 15:09 来自手机 | 只看该作者
npn 发表于 2023-6-21 10:22
hex反汇编再反C,网上搜一下有没有大神会搞,人工翻译没有免费的。

看碟下菜,起步2W米
回复

使用道具 举报

8#
ID:1059013 发表于 2023-6-21 15:15 | 只看该作者
这么多年了,没有听说有成功转换的
回复

使用道具 举报

9#
ID:1069337 发表于 2023-6-21 15:34 | 只看该作者
目前应该还没有这个功能
回复

使用道具 举报

10#
ID:1085375 发表于 2023-6-21 16:10 | 只看该作者
1、你应该是嵌入式开发中已经编译成.hex的文件吧,这个hex文件基本上可以理解为windows中的.exe,你要是反编译汇编。

2、还能看出点门道,返回C,我在微软的操作系统下从来没比较满意的做成功过。

3、何况你还是在单片机中。
回复

使用道具 举报

11#
ID:155507 发表于 2023-6-21 19:15 | 只看该作者
要将51单片机的hex文件转换为C文件,需要先将hex文件进行反汇编,然后再进行反汇编代码到C代码的转换。以下是一种常见的方法:

1.使用8051反汇编器:使用适合的8051反汇编工具,如单片机智能反编译软件,IDA Pro、Ghidra等,将hex文件进行反汇编。Ghidra是一个广泛使用的开源工具,它可以将8051的机器码反汇编为汇编代码。

2.反汇编:使用适当的命令或选项,将hex文件输入反汇编工具。这将生成反汇编代码,其中包含了8051芯片的汇编指令和程序的结构。

3.分析反汇编代码:仔细分析反汇编代码,了解程序的结构、逻辑和功能。这是将反汇编代码转换为C代码的基础。

4.根据汇编代码编写C代码:根据分析的反汇编代码,手动编写对应的C代码。这需要熟悉8051汇编语言和C语言,并理解程序的功能和算法。

5.重建程序结构:根据反汇编代码中的分支、循环和函数调用等信息,重建程序的结构。这包括编写相应的条件语句、循环语句和函数。

6.重新命名变量和函数:根据反汇编代码的上下文和功能,为变量和函数命名,使代码更具可读性和可维护性。

请注意,将汇编代码转换为等效的C代码是一项复杂的任务,因为在编译过程中会丢失某些信息,如原始变量名、类型信息等。因此,转换后的C代码可能不会完全还原原始代码,并且可能需要进一步的手动调整和优化。

同时,请确保你有权进行这样的操作或者你在合法和道德的范围内进行转换。注意,根据您的具体情况,可能还需要使用其他反汇编工具或转换器,具体取决于您的要求和可用的工具。

回复

使用道具 举报

12#
ID:712097 发表于 2023-6-23 09:36 | 只看该作者
这个真不行,就算强行转换成功也不保证能够使用。
回复

使用道具 举报

13#
ID:798322 发表于 2023-6-24 21:13 | 只看该作者
生成机器的十六进制语言,本质上是C语言到汇编到机器语言,反过来就需要反过来编译,需要理解每个转换步骤的语言,需要研究底层的机器语言,好像没有软件可以反过来。
回复

使用道具 举报

14#
ID:688692 发表于 2023-6-25 10:09 | 只看该作者
信息的可逆性?
我很多个写法做出来编译后可能得到的HEX是一样的,你怎么可能反编译回去呢?
比如同一个C文件我把变量名改改,编译出来的结果不会改变,所以反编译是不可能的,只能梳理程序执行的流程和结构,手动重写C,这比正向开发难多了。
回复

使用道具 举报

15#
ID:155507 发表于 2023-6-25 11:31 | 只看该作者

人工智能 给出来的答案。

将MCS-51 8051的hex文件转换成C文件

:0B002300EF1FAC0670011E4C70F622AF
:10000300C2A07F507EC3120023D2A07F507EC312B2
:04001300002380EC5A
:03000000020017E4
:0C001700787FE4F6D8FD75810702000335
:00000001FF

反汇编 编译
;标号==============指令================================地址===机器码=======
;==========================================================================
Q0000:             LJMP  Q0017                        ;0000   02 00 17
;==========================================================================
Q0003:             CLR   P2.0                         ;0003   C2 A0
                   MOV   R7,#50H                      ;0005   7F 50
                   MOV   R6,#0C3H                     ;0007   7E C3
                   LCALL Q0023                        ;0009   12 00 23
                   SETB  P2.0                         ;000C   D2 A0
                   MOV   R7,#50H                      ;000E   7F 50
                   MOV   R6,#0C3H                     ;0010   7E C3
                   LCALL Q0023                        ;0012   12 00 23
                   SJMP  Q0003                        ;0015   80 EC
Q0017:             MOV   R0,#7FH                      ;0017   78 7F
                   CLR   A                            ;0019   E4
Q001A:             MOV   @R0,A                        ;001A   F6
                   DJNZ  R0,Q001A                     ;001B   D8 FD
                   MOV   SP,#07H                      ;001D   75 81 07
                   LJMP  Q0003                        ;0020   02 00 03
;==========================================================================
Q0023:             MOV   A,R7                         ;0023   EF
                   DEC   R7                           ;0024   1F
                   MOV   R4,06H                       ;0025   AC 06
                   JNZ   Q002A                        ;0027   70 01
                   DEC   R6                           ;0029   1E
Q002A:             ORL   A,R4                         ;002A   4C
                   JNZ   Q0023                        ;002B   70 F6
                   RET                                ;002D   22
;==========================================================================

要将MCS-51 8051的HEX文件转换为C文件,你可以按照以下步骤进行手动转换:

1.创建一个新的C文件(例如example.c)来保存转换后的代码。

2.打开HEX文件,并查看每一行的指令和地址。

3.解析hex文件:打开hex文件,读取每一行的数据。每一行通常以冒号(:)开头,后面是一系列的16进制数字,代表指令、数据和校验等信息。

4.将每一行指令转换为等效的C语句,并按地址顺序将它们写入到example.c文件中。

以下是一个示例转换的过程:

#include <8051.h> // 根据你的8051型号和编译器选择正确的头文件

void main() {
    Q0000:
        // LJMP  Q0017 (地址:0000,机器码:02 00 17)
        goto Q0017;

    Q0003:
        // CLR   P2.0 (地址:0003,机器码:C2 A0)
        P2_0 = 0;

        // MOV   R7,#50H (地址:0005,机器码:7F 50)
        R7 = 0x50;

        // MOV   R6,#0C3H (地址:0007,机器码:7E C3)
        R6 = 0xC3;

        // LCALL Q0023 (地址:0009,机器码:12 00 23)
        Q0023();

        // SETB  P2.0 (地址:000C,机器码:D2 A0)
        P2_0 = 1;

        // MOV   R7,#50H (地址:000E,机器码:7F 50)
        R7 = 0x50;

        // MOV   R6,#0C3H (地址:0010,机器码:7E C3)
        R6 = 0xC3;

        // LCALL Q0023 (地址:0012,机器码:12 00 23)
        Q0023();

        // SJMP  Q0003 (地址:0015,机器码:80 EC)
        goto Q0003;

    Q0017:
        // MOV   R0,#7FH (地址:0017,机器码:78 7F)
        R0 = 0x7F;

        // CLR   A (地址:0019,机器码:E4)
        A = 0;

    Q001A:
        // MOV   @R0,A (地址:001A,机器码:F6)
        *R0 = A;

        // DJNZ  R0,Q001A (地址:001B,机器码:D8 FD)
        if (--R0 != 0) {
            goto Q001A;
        }

        // MOV   SP,#07H (地址:001D,机器码:75 81 07)
        SP = 0x07;

        // LJMP  Q0003 (地址:0020,机器码:02 00 03)
        goto Q0003;
}

void Q0023() {
    // MOV   A,R7 (地址:0023,机器码:EF)
    A = R7;

    // DEC   R7 (地址:0024,机器码:1F)
    R7--;

    // MOV   R4,06H (地址:0025,机器码:AC 06)
    R4 = 0x06;

    // JNZ   Q002A (地址:0027,机器码:70 01)
    if (R7 != 0) {
        goto Q002A;
    }

    // DEC   R6 (地址:0029,机器码:1E)
    R6--;

Q002A:
    // ORL   A,R4 (地址:002A,机器码:4C)
    A |= R4;

    // JNZ   Q0023 (地址:002B,机器码:70 F6)
    if (A != 0) {
        goto Q0023;
    }

    // RET (地址:002D,机器码:22)
    return;
}
注意,上述代码只是根据你提供的HEX文件进行的大致转换,具体转换的结果可能因8051芯片型号、编译器和编程环境的不同而有所不同。在实际转换过程中,你可能需要根据你的具体情况进行调整和优化。同时,根据HEX文件提供的信息,你需要手动添加初始化和其他逻辑来完整地重现原始程序的功能。



原本的程序。
/**************************************************************************************
*                              LED闪烁实验                                                                                                  *
实现现象:下载程序后D1指示灯闪烁
注意事项:无                                                                                                                                                                  
***************************************************************************************/

#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;


sbit led=P2^0;                 //将单片机的P2.0端口定义为led

/*******************************************************************************
* 函 数 名         : delay
* 函数功能                   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
        while(i--);       
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{
        while(1)
        {
                led=0;
                delay(50000); //大约延时450ms
                led=1;
                delay(50000); //大约延时450ms       
        }               
}





回复

使用道具 举报

16#
ID:77589 发表于 2023-6-26 14:22 | 只看该作者
HEX到汇编是可行的,再到C,哈哈!还不如知道功能了,重写!!!!
回复

使用道具 举报

17#
ID:486153 发表于 2023-6-26 14:40 | 只看该作者
不好实现,应该转不了
回复

使用道具 举报

18#
ID:362692 发表于 2023-6-26 15:22 | 只看该作者
转换不了,所采用的原理不一样,格式不一样。
回复

使用道具 举报

19#
ID:1065432 发表于 2023-6-26 20:08 | 只看该作者
根据汇编重写C还有的一说吧。直接转够呛
回复

使用道具 举报

20#
ID:1086115 发表于 2023-6-27 09:55 | 只看该作者
目前没有这个能力
回复

使用道具 举报

21#
ID:1086306 发表于 2023-6-29 08:28 | 只看该作者
这个就算是能转换,确定格式能用吗?
回复

使用道具 举报

22#
ID:146782 发表于 2023-6-29 11:16 | 只看该作者
转不了的
回复

使用道具 举报

23#
ID:143767 发表于 2023-6-29 11:55 | 只看该作者
如果能够反编译成功,那人人都是盗版高手
回复

使用道具 举报

24#
ID:382454 发表于 2023-6-29 11:56 | 只看该作者
反C,就象OD一样,把EXE变成汇编语言。
回复

使用道具 举报

25#
ID:1107336 发表于 2024-2-4 20:30 | 只看该作者
PDF怎么转HEX
回复

使用道具 举报

26#
ID:584814 发表于 2024-2-5 08:20 | 只看该作者
给你一本莎士比亚全集,你能译出英文原版么,呵呵
回复

使用道具 举报

27#
ID:420836 发表于 2024-2-5 09:29 | 只看该作者
逆向工程可以根据不同的硬件平台将hex文件转换为汇编代码。 将十六进制转换为 C 代码并不容易。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表