【发布时间】:2016-06-19 14:58:51
【问题描述】:
是否可以在 ebp + 4 处伪造返回地址。
我目前正在编写一个 DLL,您可以将它注入到游戏中,它会在其中调用游戏函数来执行操作,但我调用的函数会根据程序本身检查返回地址,如果它在它们的基础之外检测到它。
那么基本上有没有办法以任何方式伪造返回地址?
它是这样工作的:
if ( (_BYTE *)retaddr - (_BYTE *)unusedPadding >= (unsigned int)&byte_A6132A )
{
dword_11E59F8 |= 0x200000u;
dword_162D06C = 0;
result = (void (*)())sub_51FEE0(dword_11E59FC, v5, (_BYTE *)retaddr - (_BYTE *)unusedPadding, ebx0, edi0, a1);
}
【问题讨论】:
-
看起来检查做了一个 abs(ret-middleofdll) > 阈值。由于您已经在打补丁,您首先需要将您的 dll 加载到未使用的Padding 地址周围的 4GB 中,并首先将地址检查补丁到 &byte_A6132A 的 0xffffffff。或者您将 dll 加载到游戏的未使用内存区域中。
标签: visual-c++ assembly dll reverse-engineering