9

我想通过使用十六进制编辑器更改可执行文件中声明的整数变量的值,仅假设我知道代码中声明了一个变量类型 int 并且变量是这样的:

整数值 = 1337;

我想使用十六进制编辑器编辑可执行文件搜索值 1337 并将其更改为其他值,我在 ubuntu 中尝试了 ghex,但我不知道如何搜索它我将其转换为十六进制但我没有找到它,在此先感谢各位。

4

1 回答 1

24

首先,您将使用readelf来确定变量的虚拟地址(加载程序后它在内存中的位置)。-s将向您显示符号表,我们将 grep 为您的变量的名称。

readelf -s a.out | grep value

这将输出如下所示的一行:

    64: 000000000060102c     4 OBJECT  GLOBAL DEFAULT   24 value

所以在这里,文件中的第 64 个符号是value. 它的加载地址是 0x60102c,大小为 4 个字节。现在我们有了虚拟地址,但这并没有告诉我们它在文件中的位置。为此,我们需要做三件事:

  1. 弄清楚它在哪个部分
  2. 找出这个值的部分偏移量
  3. 将其部分偏移量添加到该部分的文件偏移量,以获得项目的实际文件偏移量(如果您打开 ELF 文件,您将在十六进制编辑器中看到“地址”)。

让我们再跑readelf一次。-S将列出这些部分。

readelf -S a.out

这是输出的一个片段。记住我们变量的地址是 at 60102c,我们正在寻找60102c位于 itsAddress和 its之间的部分Address + Size。由于这是一个读写变量,我们可以猜测它会在.data节中。

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  ...
  [21] .dynamic          DYNAMIC          0000000000600e28  00000e28
       00000000000001d0  0000000000000010  WA       6     0     8
  [22] .got              PROGBITS         0000000000600ff8  00000ff8
       0000000000000008  0000000000000008  WA       0     0     8
  [23] .got.plt          PROGBITS         0000000000601000  00001000
       0000000000000028  0000000000000008  WA       0     0     8
  [24] .data             PROGBITS         0000000000601028  00001028
       0000000000000008  0000000000000000  WA       0     0     4
  [25] .bss              NOBITS           0000000000601030  00001030
       0000000000000008  0000000000000000  WA       0     0     4
  [26] .comment          PROGBITS         0000000000000000  00001030
       000000000000002c  0000000000000001  MS       0     0     1

果然,.data活在记忆中。从本节的地址中减去的地址,我们得到:601028601028+8 = 601030value

  60102c       Address of `value`
- 601028       Start address of .data section
--------
       4

因此,value位于从该.data部分开始的偏移量 4 处。现在,该.data部分在文件中的什么位置?这就是Offset专栏告诉我们的。 .data从文件偏移量开始1028。知道了这一点,我们可以找到文件偏移量value

  1028         File offset of .data section
+    4         Offset of `value` in .data section
-------
  102c         File offset of `value`

我们已经获得了文件偏移量,现在让我们确保我们知道会发生什么。您的变量的值为 1337。在十六进制中,即 0x539。但是,我们需要提出字节顺序(或“字节序”)。Intel x86 系统是little endian的。这意味着当大于一个字节的整数存储在一个地址时,该值的最低有效字节(或“小”端)位于该地址,其余字节位于后续(递增地址)。

因此,您的 1337 将(作为 4-byte int)存储在文件中,如下所示:

39 05 00 00

在“大端”系统(例如摩托罗拉 68k)上,该值将以相反的顺序在文件中显示:

00 00 05 39

综上所述,如果您在十六进制编辑器中打开您的 ELF 文件,然后转到偏移 102c,您将看到您的值:

在此处输入图像描述

ELF 文件没有校验和或 CRC,因此您应该能够在十六进制编辑器中简单地编辑该值,并且当您的程序执行时它将具有新值!

于 2013-12-19T00:34:21.480 回答