我想通过使用十六进制编辑器更改可执行文件中声明的整数变量的值,仅假设我知道代码中声明了一个变量类型 int 并且变量是这样的:
整数值 = 1337;
我想使用十六进制编辑器编辑可执行文件搜索值 1337 并将其更改为其他值,我在 ubuntu 中尝试了 ghex,但我不知道如何搜索它我将其转换为十六进制但我没有找到它,在此先感谢各位。
我想通过使用十六进制编辑器更改可执行文件中声明的整数变量的值,仅假设我知道代码中声明了一个变量类型 int 并且变量是这样的:
整数值 = 1337;
我想使用十六进制编辑器编辑可执行文件搜索值 1337 并将其更改为其他值,我在 ubuntu 中尝试了 ghex,但我不知道如何搜索它我将其转换为十六进制但我没有找到它,在此先感谢各位。
首先,您将使用readelf
来确定变量的虚拟地址(加载程序后它在内存中的位置)。-s
将向您显示符号表,我们将 grep 为您的变量的名称。
readelf -s a.out | grep value
这将输出如下所示的一行:
64: 000000000060102c 4 OBJECT GLOBAL DEFAULT 24 value
所以在这里,文件中的第 64 个符号是value
. 它的加载地址是 0x60102c,大小为 4 个字节。现在我们有了虚拟地址,但这并没有告诉我们它在文件中的位置。为此,我们需要做三件事:
让我们再跑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
活在记忆中。从本节的地址中减去的地址,我们得到:601028
601028+8 = 601030
value
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,因此您应该能够在十六进制编辑器中简单地编辑该值,并且当您的程序执行时它将具有新值!