【问题标题】:How are integers stored in the binary after compilation?编译后整数如何存储在二进制文件中?
【发布时间】:2019-03-23 20:55:48
【问题描述】:

我正在尝试创建一个可以修改已编译(或等效)文件的程序。问题是在编译文件中定位不同的值,我设法找到字符串值而不是整数值。

到目前为止,我所做的是我将一个编译文件作为输入并生成一个“人类可读”的新文件,基本上我逐字节读取编译文件并将新文件中的每个字节写为位串,例如原始文件中值为 124 的字节在新文件中变为“01111100”。这似乎工作正常,我能够对“人类可读”文件进行反向操作并运行它。

#include <stdlib.h>
#include <stdio.h>

int main()
{
    printf("Hello world!\n");
    return 0;
}

例如,如果我编译和翻译上面代码的输出文件,我可以找到对应于“Hello world!\n”的位序列。

但是在下面的代码中,编译后翻译输出文件的时候,找不到3000对应的东西(不管是找3000对应的Integer还是String)。

#include <stdlib.h>
#include <stdio.h>

int main()
{
    int x = 3000;
    printf("%d", x);
    return 0;
}

到目前为止,我的猜测是 3000 是以我不知道的方式编写的。尽管我在翻译过程中做错了什么也同样有可能。到目前为止,我已尝试使用以下两个位序列查找 3000:

  • 作为整数 00001011 10111000
  • 作为字符串 00110011 00110000 00110000 00110000

编辑:强调我使用无优化标志 -O0 进行编译可能很重要。

【问题讨论】:

    标签: c compilation


    【解决方案1】:

    您可能在以小端顺序存储整数的 Intel 机器上。您需要搜索 10111000 00001011(以二进制形式编写 - 字节顺序与您之前使用的相反)或 0xB8 0x0B 以十六进制字节形式。

    【讨论】:

      猜你喜欢
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-06
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多