如何在程序集中传递参数?

时间:2014-11-04 15:19:04

标签: c++ assembly hook

我正在使用C ++和ASM中的一个钩子,目前我刚刚创建了一个简单的内联钩子,它在目标函数的第一条指令中进行了跳转,在这种情况下,OutputDebugString仅用于测试目的。

问题是我的钩子经过大约3天的研究后才能完成工作并弄清楚事情是如何工作的,但有一个问题我不知道如何改变我的参数# 34;虚设"在跳转到原始函数的其余部分之前运行。

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

无论如何这里是我的虚函数,这是钩子函数跳转到的:

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);
}

我理解为什么代码不能像我说的那样工作,我只是无法找到适当的解决方案,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

每个编译器都有一个使用汇编语言调用函数的协议。该协议可在其手册中深入说明。

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

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

  1. 首先用C ++源代码编写函数
  2. 接下来打印出该功能的汇编列表。
  3. 查看并了解编译器生成的程序集的工作原理。
  4. 最后,修改内部装配以满足您的需求。
  5. 我的首选是尽可能高效地编写C ++代码(或者帮助编译器使用最佳汇编语言)。然后我查看装配清单。我只更改内联汇编以调用处理器特殊功能(例如块移动指令)。