我正在尝试注入代码以在运行时将可执行文件中 CMP 的字节值从 0 更改为 2,以便有效地将布尔比较作为插入我自己行为的一部分。我有文件中单个 0x00 字节的偏移量,以及我原以为它的虚拟地址 - 文件偏移量 + 图像基址 + .text 部分的虚拟地址。
然而,令我惊讶的是,当我在运行时查看这个虚拟地址时,我在代码中的一个完全不同的地方,在一堆 0xCC 字节的中间。
看多了,我发现一般我假设的虚拟地址是不一致的。例如,以下是 Ghidra 显示的虚拟地址 0x00ebf5e0(偏移量 + 图像库 + .text virtualaddr)的一些操作码:
55 push ebp
8B EC mov ebp, esp
83 EC 1C sub esp, 0x1c
A1 90 74 43 01 mov eax, dword ptr [0x1437490]
33 C5 xor eax, ebp
89 45 FC mov dword ptr [ebp - 4], eax
这是通过直接从同一地址 ( (unsigned int8_t*)0x00ebf5e0)读取而转储到内存中的一些操作码:
8B 01 mov eax, dword ptr [ecx]
89 45 F8 mov dword ptr [ebp - 8], eax
89 5D E4 mov dword ptr [ebp - 0x1c], ebx
83 FB 10 cmp ebx, 0x10
72 04 jb 0x11
8B 3E mov edi, dword ptr [esi]
EB 02 jmp 0x13
8B FE mov edi, esi
我已经尝试了几乎所有我能做的事情 - 直接寻址,通过 psapi.h 获取图像基指针GetModuleInformation(不出所料,结果等于0x400000),包括但不包括0x1000(.textvaddr)等。唯一有趣的结果是带来的是,在图像库的最开始,字节和操作码实际上会检查 - 这让我认为这个问题与对齐有关。
注意:根据 dumpbin,可执行文件已剥离重定位。它也是32位的。