|
|
我的 DLL 使用以下代码获取主模块基址:
HMODULE hostModule = GetModuleHandleA(nullptr);
targetAddress = (uintptr_t)hostModule + kTargetOffsetFromHostBase;
然后它在 targetAddress 上设置一个硬件执行断点,我的 VEH 检查:
ctx->Rip == targetAddress
旧的 RVA 为:
0x215F165
当前调试日志:
hostModule = 0x0000000140000000
旧 target = 0x14215F165
旧 offset = 0x215F165
VEH 安装成功
硬件断点安装成功
但 VEH 处理程序始终无法到达目标地址。
我需要的是主 EXE 模块中更新后的代码 RVA:
RVA = 运行时指令地址 - 主模块基址。
我不需要以下信息:
- 文件偏移量
- UObject 成员偏移量
- SDK 转储字段偏移量
- GWorld / GNames / GObjects 偏移量
- 类地址
- 虚函数表索引。
我需要一个可以这样使用的 RVA:
targetAddress = HostBase + RVA。target
应该是一条实际执行的指令。在旧的逻辑中,当断点命中时,处理程序会执行:
ctx->Rip += 5;
WriteContextXmm0Low64(ctx, 0x42340000);
因此,新的地址理想情况下应该与旧的指令/上下文假设相匹配。
我现在只有旧的 RVA,但我不确定它最初属于哪个函数。如有需要,我可以提供:
- 旧 RVA:0x215F165
- 当前 EXE 哈希值/版本
- 如有,提供新旧 EXE 二进制文件
- 如有,提供旧 RVA 周围的字节。
请以十六进制 RVA 的形式返回结果,例如:
0x1234567
|
|