同一位置的可执行代码在内存和磁盘上不同

逆向工程 拆卸 视窗 记忆 修补 注射
2021-07-04 20:31:54

我正在尝试注入代码以在运行时将可执行文件中 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位的。

1个回答

我从头开始,使用 OllyDbg 来查找内存中的操作码,然后编写我的启发式方法来查找某些感兴趣的操作码也对内存中的图像进行操作。有一些奇怪的差异,例如在 EBP 上运行某个 MOV 而不是磁盘上的 ESI(我现在认为这与线程本地存储有关,因为显然 Windows 链接器确实重写了东西?),但我设法让它工作.

其它你可能感兴趣的问题