我正在使用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);
}
我理解为什么代码不能像我说的那样工作,我只是无法找到适当的解决方案,非常感谢任何帮助。
答案 0 :(得分:0)
每个编译器都有一个使用汇编语言调用函数的协议。该协议可在其手册中深入说明。
查找函数协议的更快方法是让编译器为您的函数生成汇编语言列表。
编写内联汇编的最佳方法是:
我的首选是尽可能高效地编写C ++代码(或者帮助编译器使用最佳汇编语言)。然后我查看装配清单。我只更改内联汇编以调用处理器特殊功能(例如块移动指令)。