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

时间:2009-09-04 01:51:20

标签: c assembly embedded reverse-engineering microchip

我用谷歌搜索,我看到了令人惊讶的轻率反应,基本上嘲笑提问者提出这样的问题。

Microchip提供免费的一些源代码(我不想在这里发布,以防万一。基本上,谷歌AN937,点击第一个链接,有一个链接“源代码”,它的拉链文件)。它在ASM中,当我看到它时,我开始睁大眼睛。我想把它转换成类似c语言的东西,以便我可以跟随。因为行如:

GLOBAL  _24_bit_sub
movf    BARGB2,w
subwf   AARGB2,f

可能非常简单,但它们对我毫无意义。

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

谢谢。

13 个答案:

答案 0 :(得分:37)

你绝对可以从汇编程序中创建一个c程序。问题是它可能看起来不像你在想什么,或者它可能会。我的PIC生锈了,但使用另一个汇编程序,比如说你有

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代码那样跳转。图片可能会更容易找出变量,然后进行搜索和替换以在文件中命名它们。

你正在寻找的是一个静态二进制翻译,不一定是从一个二进制文件到另一个二进制文件的翻译(从一个处理器到另一个处理器),但在这种情况下是从二进制文件到二进制文件的转换。理想情况下你想要使用汇编程序在应用笔记中给出并使用微芯片工具将其组装成二进制文件,然后进行翻译。你也可以进行动态二进制翻译,但你更不可能找到其中的一个,它通常不会导致C,而是一个二进制到另一个。有没有想过那些带有pac-man和galaga的沃尔玛15美元操纵杆怎么样?来自街机的rom使用静态二进制转换,优化和清理以及为手持设备盒中的新目标处理器编译的C或任何中间语言进行转换。我想不是所有这些都是这样做的,但我很确定有些人。

百万美元的问题,你能找到一张静态二进制翻译吗?谁知道,你可能要自己写一个。并猜测这意味着什么,你编写一个反汇编程序,而不是反汇编到本机汇编语法中的指令,如添加r0,r1,你的反汇编程序打印输出r0 = r0 + r1;当你完成这个反汇编程序时,虽然你会非常了解pic汇编语言,所以你不需要asm到C的翻译器。你有鸡和蛋的问题。

答案 1 :(得分:17)

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

有各种算法可用于在汇编代码上进行模式匹配并生成等效的C代码,但很难以一般方式对所有输入都有效。

您可能希望在广义反编译器中查看Boomerang有关半近期开源工作的信息。

答案 2 :(得分:8)

无法 确定性将汇编代码转换为C.中断,自修改代码和其他低级别事物除了C中的内联汇编外没有任何其他表示形式。只有某种程度上,程序集到C进程才能工作。更不用说生成的C代码可能比实际读取汇编代码更难理解......除非你使用它作为开始在C中重新实现汇编代码的基础,那么它有点用处。查看IDA的Hex-Rays插件。

答案 3 :(得分:7)

我曾经做过一个项目,其中很大一部分知识产权是用x86汇编代码编码的一些严肃的算法。为了将代码移植到嵌入式系统,该代码的开发人员(不是我)使用了名为MicroAPL的装备中的工具(如果我没记错的话):

我对这个工具的表现非常非常惊讶。

另一方面,我认为这是“如果你不得不问,你买不起”的东西之一(它们的价格范围为一次性转换项目工作到4行左右)装配一美元的装配。)

但是,通常从供应商处获得的汇编程序被打包为可以从C调用的函数 - 因此只要例程执行您想要的操作(在您要使用的处理器上),您可能只需要组装它们或多或少地忘记它们 - 它们只是你从C中调用的库函数。

答案 4 :(得分:7)

是的,很有可能将汇编程序代码反向设计为高质量的C。

我为一家MicroAPL工作,这家公司生产一种名为Relogix的工具,用于将汇编程序代码转换为C.在其他一篇文章中提到过。

请查看我们网站上的示例:

http://www.microapl.co.uk/asm2c/index.html

答案 5 :(得分:6)

  

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

不,不是。编译失去信息:最终目标代码中的信息少于C源代码中的信息。反编译器无法从零开始神奇地创建该信息,因此真正的反编译是不可能的。

答案 6 :(得分:4)

这不是不可能的,只是非常努力。熟练的程序集和C程序员可能会这样做,或者你可以使用Decompiler。其中一些在将asm转换为C方面做得相当不错,尽管您可能需要重命名一些变量和方法。

查看this site以获取可用于x86架构的反编译器列表。

答案 7 :(得分:3)

看看这个:decompiler

  

反编译器是给予a的名称   执行的计算机程序   反向操作到a   编译器。也就是说,它翻译了一个   包含信息的文件   相对较低的抽象水平   (通常设计为计算机   可读而不是人类可读的)   成为具有更高水平的形式   抽象(通常设计为   人类可读的。

答案 8 :(得分:3)

不太可能。

除了可读性之外,C over ASM的一大优势是它阻止了“聪明”的编程技巧。

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

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

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

还有很多被滥用的指令(在旧版的IBM manframes上,LA,加载地址,指令经常用于执行简单的算术,因为它更快,并且不需要溢出寄存器)

虽然在技术上可能转换为C,但生成的C代码的可读性将低于已转换的ASM代码。

答案 9 :(得分:2)

我可以说99%保证,这种汇编语言没有现成的转换器,所以你需要写一个。您可以使用C函数简单地实现它替换ASM命令:

movf    BARGB2,w -> c_movf(BARGB2,w);
subwf   AARGB2,f -> c_subwf(AARGB2,f);

这部分很容易:) 然后你需要实现每个功能。您可以将寄存器声明为全局变量以简化操作。你也可以使用not functions,但#defines,如果需要调用函数。这将有助于参数/结果处理。

#define c_subwf(x,y) // I don't know this ASM, but this is some Substraction must be here

特殊情况是ASM指令/标签,我认为它只能用#defines转换。

当您获得某些特定于CPU的功能时,乐趣就开始了。这可以是带有堆栈操作的简单函数调用,一些特定的IO /内存操作。更有趣的是程序计数器寄存器的操作,用于计算或使用/计算刻度/延迟。

但是还有另外一种方法,如果这个核心发生了。这也是硬核:) 存在名为dynamic recompilation的技术。它在许多emulators中使用。

您不需要重新编译ASM,但这个想法几乎是一样的。您可以从第一步开始使用所有#defines,但为它们添加所需功能的支持(递增PC / Ticks)。您还需要为代码添加一些虚拟环境,例如内存/ IO管理器等。

祝你好运:)

答案 10 :(得分:1)

我认为拿起一本关于PIC组装的书并学会阅读它会更容易。汇编程序通常很容易学习,因为它的级别很低。

答案 11 :(得分:0)

很难将函数从asm转换为C但是可以手动执行。使用反编译器转换整个程序将为您提供无法理解的代码,因为在编译期间大部分结构都丢失了。没有有意义的变量和函数名称,结果C代码仍然很难理解。

答案 12 :(得分:0)

查看asm2c

  

Swift工具将DOS / PMODEW 386 TASM汇编代码转换为C代码