将ASM转换为C(非逆向工程)

将ASM转换为C(非逆向工程),c,assembly,embedded,reverse-engineering,microchip,C,Assembly,Embedded,Reverse Engineering,Microchip,我在谷歌上搜索了一下,我看到大量轻率的回答,基本上是在嘲笑提问者提出这样一个问题 Microchip免费提供了一些源代码(我不想在这里发布它,以防这是一个禁忌。基本上,谷歌AN937,点击第一个链接,这里有一个“源代码”链接,它是一个压缩文件)。它在ASM中,当我看它的时候,我开始斜视。我想把它转换成类似c类型语言的东西,这样我就可以继续了。因为这样的行: GLOBAL _24_bit_sub movf BARGB2,w subwf AARGB2,f 它们可能很简单,但对我来说毫无

我在谷歌上搜索了一下,我看到大量轻率的回答,基本上是在嘲笑提问者提出这样一个问题

Microchip免费提供了一些源代码(我不想在这里发布它,以防这是一个禁忌。基本上,谷歌AN937,点击第一个链接,这里有一个“源代码”链接,它是一个压缩文件)。它在ASM中,当我看它的时候,我开始斜视。我想把它转换成类似c类型语言的东西,这样我就可以继续了。因为这样的行:

GLOBAL  _24_bit_sub
movf    BARGB2,w
subwf   AARGB2,f
它们可能很简单,但对我来说毫无意义

可能有一些自动的ASM到C翻译,但我能找到的只是人们说这是不可能的。坦率地说,这是不可能的。两种语言都有结构,这种结构肯定可以翻译

一定有一些自动的ASM到C翻译,但我能找到的只是人们说这是不可能的。坦率地说,这是不可能的

不,不是。编译会丢失信息:最终目标代码中的信息少于C源代码中的信息。反编译器无法神奇地从无到有地创建这些信息,因此真正的反编译是不可能的。

请查看以下内容:

反编译器是给定给 执行以下操作的计算机程序: 反向操作 编译器。也就是说,它翻译为 包含某个位置的信息的文件 相对较低的抽象级别 (通常设计成计算机 可读而非人类可读) 变成一种更高层次的形式 抽象(通常设计为 人类可读)

从编译后的程序中获得完全相同的源代码基本上是不可能的。但反编译器一直是计算机科学的一个研究领域(例如,这是一个博士项目)

有多种算法可用于在汇编代码上进行模式匹配并生成等效的C代码,但很难用一种通用的方法来完成这项工作,这种方法适用于所有输入


您可能想在一个通用的反编译器上查看半个月的开源工作。

这不是不可能的,只是非常困难。一个熟练的汇编程序和C程序员可能会做到这一点,或者您可以考虑使用。其中一些在将asm转换为C方面做得相当好,尽管您可能需要重命名一些变量和方法

查看x86体系结构可用的反编译器列表。

不太可能

与ASM相比,C除了可读性之外还有一个巨大的优势,那就是它阻止了“聪明”的编程技巧

你可以在汇编程序中做很多没有直接C等价物的事情, 或者在C语言中包含曲折的语法

另一个问题是数据类型大多数汇编程序本质上只有两种可互换的数据类型:字节和字。可能有一些语言构造来定义int和float 等,但没有尝试检查内存是否按定义使用。因此,很难将ASM存储映射到C数据类型

此外,所有汇编程序存储本质上是一个“结构”;存储是按照定义的顺序进行布局的(不像C语言中存储是根据运行时的突发奇想进行排序的)。许多ASM程序依赖于精确的存储布局—要在C中实现相同的效果,需要将所有存储定义为单个结构的一部分

还有很多ABS指令(在旧的IBM manframes上,LA、load address指令通常用于执行简单的算术运算,因为它速度更快,不需要溢出寄存器)


虽然从技术上讲可以转换为C,但生成的C代码的可读性不如转换后的ASM代码

你完全可以用汇编语言编写一个c程序。问题是它可能看起来不像你所想的,或者可能会。我的照片生锈了,但使用了另一个汇编程序,比如说你有

add r1,r2
在C中,让我们说它变成了

r1 = r1 + r2;
可能更具可读性。当值从内存跳到寄存器,再跳回到寄存器,并且寄存器被重用时,可能会失去变量名的意义。如果你说的是旧图片,它有两个寄存器,一个累加器,另一个,实际上可能更容易,因为大部分变量都在内存中,你看地址,比如

q = mem[0x12];
e = q;
q = mem[0x13];
e = e + q;
mem[0x12] = e;
很长很长,但很明显,mem[0x12]=mem[0x12]+mem[0x13]

这些内存位置很可能是变量,它们不会像带有一堆寄存器的处理器的编译C代码那样跳转。pic可能更容易找出变量,然后在文件中进行搜索和替换以命名它们

您正在寻找的是静态二进制翻译,不一定是从一个二进制到另一个二进制(从一个处理器到另一个处理器)的翻译,但在这种情况下是从pic二进制到C的翻译。理想情况下,您希望使用应用说明中给出的汇编程序,使用微芯片工具将其组装成二进制,然后做翻译。你也可以做动态二进制翻译,但你甚至不太可能找到其中的一个,而且它通常不会产生C,而是一个二进制到另一个二进制。你有没有想过沃尔玛那些15美元的操纵杆和吃豆人和加拉加是如何工作的?来自arcade的rom使用静态二进制翻译进行转换、优化和清理,并为手持设备中的新目标处理器编译C或任何中间语言。我想不是所有的都是这样做的,但我很确定有些是这样

百万美元的问题,你能找到一个静态二进制翻译图片?谁知道呢,你可能得自己写一本。猜猜这意味着什么,你写了一个反汇编程序,而不是反汇编成本地汇编程序语法的指令,比如addr0,r1,你让反汇编程序打印出r0=r0+r1;
movf    BARGB2,w -> c_movf(BARGB2,w);
subwf   AARGB2,f -> c_subwf(AARGB2,f);
#define c_subwf(x,y) // I don't know this ASM, but this is some Substraction must be here