只是偶然发现了.要为我们其他人清除此主题:通过使用当前程序计数器地址减去补丁地址来计算编解码器补丁的相对JMP偏移量:
uint32_t patch_address = (uint32_t) VirtualAlloc(...);
uint32_t jmp_offset = patch_address - (current_offset + current_len);
Run Code Online (Sandbox Code Playgroud)
注意:current_len是JMP指令所需的字节数.这取决于它是短jmp(EB)还是长跳(E9)的事实.在您的示例中为2个字节,但常规JMP(E8 0x12345678)占用5个字节.
所以在这里我们看到你的例子不会轻易工作,因为你必须覆盖属于下面的MOV甚至CALL指令的下一个字节.这取决于您的编解码器与当前指令偏移量的距离更大,因为它在地址空间的不同区域中分配.
所以你可以做的是将覆盖的7字节复制到你的洞穴中.这只有在你的补丁中不要乱用EDI寄存器时才有效(因为"MOV ECX,EDI").而你必须纠正你覆盖的CALL地址.所以这可能不是放置编解码器的最佳位置,但它可行.
我编写了自己的挂钩库,它关心通用寄存器参数,堆栈清理和覆盖的asm填充,但我建议使用上面提到的框架.
问候,迈克尔