伪造ASM回邮地址?

Teh*_*wnz 2 dll assembly reverse-engineering visual-c++

是否有可能伪造返回地址,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);
  }
Run Code Online (Sandbox Code Playgroud)

Jos*_*hua 5

更好的方法:

    push returnshere
    push your_second_argument
    push your_first_argument
    push address_of_fragment_in_exe
    jmp  function_you_want_to_call
returnshere:
    ; more code
Run Code Online (Sandbox Code Playgroud)

其中address_of_ret_in_exe是此片段的地址:

    add esp, 8 ;4 * number of arguments pushed
    ret
Run Code Online (Sandbox Code Playgroud)

这具有不编辑游戏二进制文件的优点.我已经看过不止一个游戏校验自己,所以如果你编辑它,即使在松弛的空间,你也有麻烦.如果他们经历了如此多的麻烦来验证来自游戏二进制文件的调用,那么他们可能会对编辑的游戏二进制文件进行防御.很高兴他们不跟踪调用图.

  • 哦,我明白你现在在说什么.你找到一个现有的`add esp,8` /`ret`片段,并使用它.我的回答是想象有一些空间可以将一些trampoline函数放在允许的内存范围内,但不能将所有代码映射到那里. (2认同)