如何在程序集中传递参数

How does one pass on parameters in assembly?

本文关键字:参数 集中 程序集 程序      更新时间:2023-10-16

im在C++和ASM中处理一个钩子,目前我刚刚制作了一个简单的内联钩子,在目标函数的第一条指令中进行跳转,在本例中,目标函数是OutputDebugString,仅用于测试目的。

问题是,经过大约3天的研究,我的钩子终于正常工作了,弄清楚了事情是如何工作的,但有一个问题是,在跳到原始函数的其余部分之前,我不知道如何更改"伪"函数中的参数。

正如你在我的代码中看到的那样,我试图简单地在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. 首先用C++源代码编写函数
  2. 接下来打印出函数的程序集列表
  3. 查看并了解编译器生成的程序集是如何工作的
  4. 最后,修改内部程序集以满足您的需要

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