如果分发了这个二进制文件,那么每个c程序都会转换为机器代码。由于计算机的指令集众所周知,是否可以取回C原始程序?
答案 0 :(得分:16)
你永远无法回到完全相同的来源,因为没有与编译代码一起保存的元数据。
但是你可以从汇编代码中重新创建代码。
如果您对以下内容感兴趣,请查看本书:Reversing: Secrets of Reverse Engineering。
修改强>
这里有一些编译器-101,如果你用另一个单词定义一个编译器而不是像“编译器”那样技术性,它会是什么?
答案:翻译
编译器将您编写的语法/短语转换为C编译器转换为Assembly或甚至机器代码的另一种语言。 C#代码被翻译成IL等等。
您拥有的可执行文件只是原始文本/语法的翻译,如果您想“反转它”,因此“将其翻译回来”,您很可能无法获得与开始时相同的结构。
一个更现实的例子是,如果你从英语翻译成德语,从德语翻译回英语,语言结构很可能是不同的,可能会使用其他单词,但意义,语境,很可能不会已经改变了。
如果从C转到ASM,编译器/转换器也是如此,逻辑是相同的,它只是一种不同的读取方式(当然还有它的优化)。
答案 1 :(得分:5)
这取决于原始C程序的含义。诸如局部变量名,注释等之类的东西不包含在二进制文件中,因此无法获得与用于生成二进制文件的源代码完全相同的源代码。诸如IDA Pro之类的工具可能会帮助您反汇编二进制文件。
答案 2 :(得分:4)
我想知道一个真正熟练的黑客每天大约1千字节机器代码的转换率。在西方普通工资中,例如,100 KB可执行文件的价格约为25,000美元。花了那么多钱之后,获得的所有东西都是一大块C代码,完全与你的代码完全相同,减去了评论和诸如此类的好处。它无法与您的版本竞争,您将能够更快地提供更新和改进。逆向工程这些更新也是一项非常重要的工作。
如果该价格标签没有给您留下深刻印象,您可以通过添加更多代码随意提高转换成本。请记住,能够处理像这样的大型程序的熟练黑客有更好的事情要做。他们编写自己的代码。
答案 3 :(得分:4)
我所知道的关于这个主题的最佳作品之一是:
Pigs from sausages? Reengineering from assembler to C via FermaT。
声称你得到一个合理的C程序,即使原始的asm代码不是用C语言编写的!很多警告都适用。
答案 4 :(得分:3)
使用这样做的工具是一项研究活动。也就是说,可以在简单的情况下获得一些东西(除非存在调试符号,否则不会恢复局部变量名称)。在大型程序的实践中,或者如果程序员决定让它变得困难,这几乎是不可能的。
答案 5 :(得分:3)
Hex-Rays反编译器(IDA Pro的扩展程序)可以完全执行此操作。它仍然是相当近期和即将到来但显示出巨大的希望。它需要一点点习惯,但可能会加快逆转过程。它不是一个“银弹” - 没有反编译器,但它是一个很好的资产。
答案 6 :(得分:3)
这个程序的通用名称是“将汉堡包变回奶牛”。可以将二进制代码反向工程为功能等效的C程序,但是C代码是否与原始程序非常相似是一个悬而未决的问题。
答案 7 :(得分:2)
C程序与它将产生的ASM /机器代码之间没有1:1的映射 - 一个C程序可以在不同的编译器或不同的设置上编译成不同的结果)有时两个不同的C位可以生成相同的机器代码。
你肯定可以从已编译的EXE中生成C代码。你只是不知道它与原始代码的结构有多么相似 - 除了变量/函数名称丢失之外,我认为它不会知道代码在许多文件中分割的原始方式。
答案 8 :(得分:2)
你可以试试hex-rays.com,它有一个非常好的反编译器,可以将汇编代码反编译成C,准确度达到99%。