当前位置: 首页 > 知识库问答 >
问题:

从二进制文件中获取源代码

龙浩博
2023-03-14

难道不应该从它的二进制文件中获得源代码吗?既然编译是将高级语言(源代码)转换为低级语言(机器代码)的过程,难道我们不能为了获得源代码而直接反转这个过程吗?如果没有,为什么?

共有1个答案

薛高澹
2023-03-14

假设我给出3,并告诉你我是通过两个数求和得到它的。你能告诉我3是两个数字之和吗?这是不可能的,因为sum是一个单向函数--不可能从输出中恢复它的参数。我可以从-5558获得它,即使对您来说12仍然得到相同的答案。

编译也是类似的。有无限多的C++程序可以生成任何特定的机器代码输出(或多或少)。

当然,您可以反向编译过程,生成C或C++代码,这些代码至少会产生具有相同语义(含义)的机器代码,但可能不是逐字节相同的。这种工具在不同程度上存在。

#include <iostream>
#include <cmath>
int main() {
  std::cout << sin(1)+cos(2) << std::endl;
  return 0;
}

假设是一个Unix系统,编译器完全有权生成执行两个系统代码的机器代码:一个写到stdout(带有一个常量缓冲区)和一个退出。在反编译这些代码时,您可以得到:

#include <unistd.h>
#include <cstdlib>
int main() {
  write(0, "0.425324\n", 9);
  exit(0);
}
 类似资料:
  • 问题内容: 我正在尝试从URLConnection读取二进制文件。当我使用文本文件对其进行测试时,它似乎可以正常工作,但对于二进制文件则不能。发送文件时,我在服务器上使用以下mime类型: 但是到目前为止,似乎没有任何效果。这是我用来接收文件的代码: 问题答案: 我就是这样

  • 所以。。。我需要从.pkl文件中读取并导入图像数据集。图像存储为“二进制blob”。一旦完成了,我需要将它们转换成字节格式,这样我就可以通过Google的CloudVision运行它们。我设法在Linux虚拟机上打开了该文件(花了几天时间试图让它在Windows上工作…)。但现在我似乎无法将这个“二进制斑点”转换为我可以使用的实际图像。。。 下面是一个“二进制blob”: \1\x0 0 0 0\

  • 问题内容: 我知道在运行单元测试时可以捕获代码覆盖率指标。但是,当我们针对二进制文件本身进行集成测试(复数)时,我们想知道覆盖范围是什么,例如: 是否有可能做到这一点?可以仅为测试目的而构建二进制文件,因此可以根据需要选择任何编译选项。 问题答案: Go Coverage工具只能与测试包一起使用。但是,并非所有希望都消失了。 如果您可以将集成测试强制到go测试框架中,那么您应该拥有所需的一切。这不

  • 我想让Arduino代码进入虚拟串行端口,而不是实际的Arduino。IDE通过COM端口向Arduino发送二进制代码,在本例中,COM端口将是虚拟COM端口,而不是Arduino。 我想读取并存储正在上载到COM端口的代码。我尝试了几个Java库(RXTX、jSSC和gnu.io),但我无法读取COM端口上的内容,因为它总是会给出另一个应用程序(即Arduino IDE)正在使用它的例外情况。

  • 问题内容: 我正在尝试在Python中读取BMP文件。我知道前两个字节表示BMP公司。接下来的4个字节是文件大小。当我执行时: 我得到: ValueError:以10为底的int()的无效文字:’F#\ x13’ 我想做的是将这四个字节读取为整数,但是Python似乎将它们读取为字符并返回一个字符串,该字符串无法转换为整数。如何正确执行此操作? 问题答案: 该方法将字节序列作为字符串返回。要将字符

  • 问题内容: 我的一些同事相信,将构建工件提交到Subversion存储库是一个好主意。争论在于通过这种方式,在测试机器上的安装和更新很容易-只需“向上”! 我敢肯定,有人反对这种不良做法,但我能想到的只是la脚的,例如“占用更多空间”。什么是最好的杀手级理由不这样做?而我们应该采取哪些其他方法呢? 如果这有所不同,则用于Java代码。一切都是从Eclipse编译的(没有自动PDE构建)。 当我说添