将ASM转换为C(不是逆向工程)
我用谷歌搜索,我看到一个惊人的轻浮反应基本上嘲笑提问者问这样一个问题。
Microchip免费提供一些源代码(我不想在这里发布,以防万一。基本上,谷歌AN937,点击第一个链接,有一个链接“源代码”及其压缩文件)。 它在ASM中,当我看到它时,我开始睁大眼睛。 我想把它转换成类似ac类型语言的东西,这样我就可以跟随它。 因为行如:
GLOBAL _24_bit_sub movf BARGB2,w subwf AARGB2,f
可能很简单,但它们对我毫无意义。
必须有一些自动ASM到C的翻译器,但我能找到的只是人们说它不可能。 坦率地说,它不可能是不可能的。 两种语言都有结构,这种结构肯定可以翻译。
谢谢。
你绝对可以从汇编程序制作ac程序。 问题是它可能看起来不像你在想什么,或者它可能会。 我的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代码那样跳转。 pic可以更容易找出变量,然后进行搜索和替换以在文件中命名它们。
您正在寻找的是一个静态二进制转换,不一定是从一个二进制到另一个二进制的转换(从一个处理器到另一个处理器),但在这种情况下是从二进制到二进制的转换。理想情况下,您希望采用在应用笔记并使用微芯片工具将其组装成二进制文件,然后进行翻译。 你也可以进行动态二进制翻译,但你更不可能找到其中的一个,它通常不会导致C,而是一个二进制到另一个。 有没有想过那些带有pac-man和galaga的沃尔玛15美元操纵杆怎么样? 来自街机的rom使用静态二进制转换,优化和清理以及为手持设备盒中的新目标处理器编译的C或任何中间语言进行转换。 我想不是所有这些都是这样做的,但我很确定有些人。
百万美元的问题,你能找到一张静态的二进制翻译吗? 谁知道,你可能要自己写一个。 并猜测这意味着什么,你编写一个反汇编程序,而不是反汇编到本机汇编语法中的指令,如添加r0,r1,你的反汇编程序打印输出r0 = r0 + r1; 当你完成这个反汇编程序时,虽然你会非常了解pic汇编语言,所以你不需要asm to C翻译器。 你有鸡和鸡蛋的问题。
从编译的程序中获取完全相同的源代码基本上是不可能的。 但反编译器一直是计算机科学领域的研究领域(例如dcc反编译器 ,这是一个博士项目)。
有各种算法可用于在汇编代码上进行模式匹配并生成等效的C代码,但很难以一般方式对所有输入都有效。
您可能想要查看Boomerang在广义反编译器中进行的半开放式开源工作。
您无法 确定性地将汇编代码转换为C。中断,自修改代码和其他低级事物除了C中的内联汇编外没有任何表示。只有某种程度上,汇编到C进程才能工作。 更不用说生成的C代码可能比实际读取汇编代码更难理解……除非你使用它作为开始在C中重新实现汇编代码的基础,否则它有点用处。 查看IDA的Hex-Rays插件。
我曾经做过一个项目,其中很大一部分知识产权是用x86汇编代码编写的一些严肃的算法。 为了将代码移植到嵌入式系统,该代码的开发人员(不是我)使用了名为MicroAPL的装备中的工具(如果我没记错的话):
我对这个工具的表现非常非常惊讶。
另一方面,我认为这是“如果你不得不问,你买不起”的东西之一(它们的价格范围为一次性转换项目工作到大约4行assembly处理一美元)。
但是,通常从供应商处获得的汇编程序打包为可以从C调用的函数 – 因此只要例程执行您想要的操作(在您要使用的处理器上),您可能只需要组装它们和或多或少忘记他们 – 他们只是你从C调用的库函数。
是的,将汇编程序代码逆向工程到高质量C是非常可能的。
我为一家MicroAPL工作,这家公司生产一种名为Relogix的工具,用于将汇编代码转换为C.在其他一篇文章中提到过。
请查看我们网站上的示例:
必须有一些自动ASM到C的翻译器,但我能找到的只是人们说它不可能。 坦率地说,它不可能是不可能的。
不,这不对。 编译丢失信息:最终目标代码中的信息少于C源代码中的信息。 反编译器无法从零开始神奇地创建该信息,因此真正的反编译是不可能的。
这不是不可能,只是非常努力。 熟练的程序集和C程序员可能会这样做,或者你可以看一下使用Decompiler 。 其中一些在将asm转换为C方面做得相当不错,尽管您可能需要重命名一些变量和方法。
查看此站点以获取可用于x86体系结构的反编译器列表。
看看这个: 反编译器
反编译器是给予计算机程序的名称,该程序执行与编译器相反的操作。 也就是说,它将包含相对较低抽象级别(通常设计为计算机可读而非人类可读)的信息的文件转换为具有更高抽象级别(通常设计为人类可读)的forms。
不容易。
除了可读性之外,C over ASM的一大优势是它阻止了“聪明”的编程技巧。
你可以在汇编程序中做很多事情,没有直接的C等价,或者在C中涉及曲折的语法。
另一个问题是数据类型,大多数汇编程序基本上只有两种可互换的数据类型:字节和单词。 可能有一些语言结构来定义整数和浮点数等,但是没有尝试检查内存是否按照定义使用。 因此很难将ASM存储映射到C数据类型。
此外,所有汇编程序存储本质上都是一个“结构”; 存储按其定义的顺序布局(与C不同,存储在运行时突发奇想的情况下排序)。 许多ASM程序依赖于确切的存储布局 – 在C中实现相同的效果,您需要将所有存储定义为单个结构的一部分。
还有很多被滥用的指令(在旧世界的IBM manframes上,LA,加载地址,指令常规用于执行简单的算术,因为它更快,并且不需要溢出寄存器)
虽然在技术上可能转换为C,但生成的C代码的可读性将低于已转换的ASM代码。
我可以说99%保证,这种汇编语言没有现成的转换器,所以你需要写一个。 您可以使用C函数简单地实现它替换ASM命令:
movf BARGB2,w -> c_movf(BARGB2,w); subwf AARGB2,f -> c_subwf(AARGB2,f);
这部分很容易:)然后你需要实现每个function。 您可以将寄存器声明为全局变量以简化操作。 你也可以使用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的function时,这种乐趣就开始了。 这可以是具有堆栈操作的简单函数调用,一些特定的IO /内存操作。 更有趣的是程序计数器寄存器的操作,用于计算或使用/计数刻度/延迟。
但是,如果这个核心发生,还有另一种方式。 这也是硬核:)存在一种名为动态重编译的技术。 它在许多模拟器中使用 。
您不需要重新编译ASM,但这个想法几乎是一样的。 您可以从第一步开始使用所有#defines,但为它们添加所需function的支持(递增PC / Ticks)。 您还需要为代码添加一些虚拟环境,例如内存/ IO管理器等。
祝好运 :)
我认为拿起一本关于PIC组装的书并学会阅读它会更容易。 汇编程序通常很容易学习,因为它的级别很低。
很难将函数从asm转换为C但是可以手工完成。 使用反编译器转换整个程序将为您提供无法理解的代码,因为在编译期间大部分结构都丢失了。 没有有意义的变量和函数名称,结果C代码仍然很难理解。
看看asm2c
Swift工具将DOS / PMODEW 386 TASM汇编代码转换为C代码