gpt4 book ai didi

c++ - 没有内联汇编的 x64 函数绕行

转载 作者:太空狗 更新时间:2023-10-29 23:14:46 31 4
gpt4 key购买 nike

晚上好,各位程序员和黑客。

我正在试验二进制补丁,更准确地说:绕过未通过 vftable 调用的函数。

详细我在做什么

我将一个 DLL 注入(inject)到一个正在运行的进程中,并通过扫描它的签名来确定一个函数(原始函数)的起始地址。

找到它后,我用自己的 shell 代码重写了前 13 个字节,以将对此函数的每次调用重定向到我的 DLL 的一个函数( Hook 函数):

mov rax, <dll_function_address>
jmp rax
ret

hook 函数 再次调用原始函数 的地址,在删除我的 shellcode 以防止无休止的递归之后。原始函数返回后, Hook 函数将返回它返回的值以保持常规代码流。

问题

您可能已经注意到,我的 shellcode 绝不会保留任何寄存器(甚至 RAX 也不行,它可能不仅被 hook 函数 操纵,而且已经被我的 shellcode 操纵了。

因此,原始函数在被钩子(Hook)函数调用时失败。我想添加内联汇编以将寄存器推送到堆栈,作为 hook 函数 中的第一个操作,并在将控制权传递给原始函数 之前将它们弹出,但是Visual Studio 不支持内联汇编的 x64。

我可以用操作码补充我的 shellcode 以将寄存器压入堆栈。但是我无法添加操作码来弹出它们,因为我在调用原始函数

之前恢复了原始代码

我试图规避的解决方案

我实际上知道解决这个问题最干净的方法是重新定位整个函数。这样,我就不会在调用原始函数 之前被迫移除 Hook 。我可以添加操作码以将寄存器推送到我的 jmp shellcode 和操作码以将它们弹出到重定位函数的前面。我试图绕过这个,因为我不知道如何动态确定原始函数的结尾,所以我不知道要移动多少字节。

问题

  1. 是否有某种调用约定或其他我还不知道的东西,允许我以强制编译器不使用寄存器的方式声明我的 Hook 函数,但只有堆栈?
  2. 有人知道我如何判断 0xC3 (ret) 字节是否实际上是函数结束吗?
  3. 我可以将 Visual Studio 2013 配置为使用其他编译器吗?支持 x64 内联汇编?

最佳答案

一个解决方案是,不是从你的钩子(Hook)中恢复原始函数,而是调用你从你的钩子(Hook)中覆盖的相同指令,例如:

原始函数:

<do_stuff>
push rbp
mov rsp, rbp
sub 8, rsp
add rbx, rcx
....

钩子(Hook)函数:

<do_stuff>
mov rax, <dll_function_address>
jmp rax
nop
add rbx, rcx
...

你的 dll 函数:

  ... // Do your hooked stuff
push rbp // Repeat the code your replaced from the hooked function
mov rsp, rbp
sub 8, rsp
jmp <do_stuff + sizeof(shellcode) + nopsled> // Call it and add the offset of the hook shellcode

如果 shell 代码与指令不一致,您可以 nop sled,如示例所示。

关于rax的问题​​,我觉得你可以这样做:

<do_stuff>
push <dll_function_address>
ret
nop
add rbx, rcx
...

它将你的钩子(Hook)地址压入栈中并调用ret,ret获取栈中的第一个地址并跳转到那里。

或者你可以使用调用指令:

<do_stuff>
call <dll_function_address>
nop
add rbx, rcx
...

调用钩子(Hook)后,像您已经做的那样替换钩子(Hook)函数。然后剩下的问题是你的 dll 函数的 ret 将在 nop 指令上继续,所以你需要从压入堆栈的地址中删除 5(调用指令的大小),为此,我发现了这个:https://stackoverflow.com/a/12631122/2838914 .

关于c++ - 没有内联汇编的 x64 函数绕行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32194863/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com