如何在程序集中传递参数
How does one pass on parameters in assembly?
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);
}
我理解为什么代码不能像我说的那样工作,我只是看不到一个合适的解决方案,任何帮助都将不胜感激。
每个编译器都有一个使用汇编语言调用函数的协议。协议可以在他们的手册中详细说明。
找到函数协议的一个更快的方法是让编译器为函数生成汇编语言列表。
编写内联程序集的最佳方法是:
- 首先用C++源代码编写函数
- 接下来打印出函数的程序集列表
- 查看并了解编译器生成的程序集是如何工作的
- 最后,修改内部程序集以满足您的需要
我的偏好是尽可能高效地编写C++代码(或者帮助编译器使用最佳汇编语言)。然后我查看装配清单。我只更改内联程序集以调用处理器的特殊功能(如块移动指令)。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- 如何从 x64 程序集中的堆栈中获取参数?
- 如何在程序集中传递参数
- 使用结构参数从程序集中调用C++函数
- Qt/ c++:在一个类中集中参数