gpt4 book ai didi

c++ - 如何在汇编中传递参数?

转载 作者:太空宇宙 更新时间:2023-11-04 13:43:51 58 4
gpt4 key购买 nike

我正在研究 C++ 和 ASM 中的钩子(Hook),目前我刚刚制作了一个简单的内联钩子(Hook),它在目标函数的第一条指令中放置一个跳转,在本例中是 OutputDebugString,仅用于测试目的。

问题是,经过大约 3 天的研究并弄清楚事情是如何运作的,我的钩子(Hook)终于开始工作了,但是有一个问题我不知道如何更改进入我的“虚拟机”的参数"函数,然后跳转到原始函数的其余部分。

正如你在我的代码中看到的那样,我试图在 C++ 中简单地更改参数,但当然这不起作用,因为我之后会弹出所有寄存器:/

无论如何这是我的虚拟函数,它是钩子(Hook)函数跳转到的地方:

static void __declspec(naked) MyDebugString(LPCTSTR lpOutputString) {
__asm {
PUSHAD
}

//Where i suppose i could run my code, but not be able to interfere with parameters :/
lpOutputString = L"new message!";

__asm {
POPAD
MOV EDI, EDI
PUSH EBP
MOV EBP, ESP
JMP Addr
}

original_DebugString(lpOutputString);
}

我明白为什么代码没有像我说的那样工作,我只是看不到合适的解决方案,非常感谢任何帮助。

最佳答案

每个编译器都有使用汇编语言调用函数的协议(protocol)。该协议(protocol)可能在他们的手册中有详细说明。

查找函数协议(protocol)的更快方法是让编译器为您的函数生成一个汇编语言列表。

编写内联汇编的最佳方法是:

  1. 首先用C++源代码编写函数
  2. 接下来打印出函数的汇编列表。
  3. 查看并理解编译器生成的程序集的工作原理。
  4. 最后,修改内部组件以满足您的需求。

我的偏好是尽可能高效地编写 C++ 代码(或帮助编译器使用最佳汇编语言)。然后我查看汇编列表。我只更改内联汇编以调用处理器特殊功能(例如 block 移动指令)。

关于c++ - 如何在汇编中传递参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26738708/

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