求助x64 内联汇编问题
本帖最后由 朱朱你堕落了 于 2024-8-15 08:24 编辑感谢各位大佬,已解决。 朱朱你堕落了 发表于 2024-8-12 08:01
对,不确定的话或是说为了保险起见,全写一遍,怎么写,哈哈,等大佬写吧。
原始指令放这里或最后面
push rax ; 依次入栈
push rbx
push rcx
push ...
call 你的函数
pop ...
pop rcx
pop rbx
pop rax ; 相反的顺序出栈
--------
省略部分你对着 x64dbg 看有哪些寄存器(或翻翻 x86-64 架构文档),跳过 rsp 就行。 手动 push/pop 你确定会用到的寄存器
此外 vs 编译目标是 x64 的话,不能内联汇编(除非安装英特尔编译器)
如果你的 hook 目标是函数头,直接把参数全转发到你的函数就好。编译器编译函数的时候会根据调用约定自动备份/还原那些特殊的寄存器值。 爱飞的猫 发表于 2024-8-12 07:38
手动 push/pop 你确定会用到的寄存器
此外 vs 编译目标是 x64 的话,不能内联汇编(除非安装英特尔编译器 ...
intel编译器安装过了,已经能内联汇编了,asm_code里不会写了。就是在调用后不影响寄存器啥的,你懂的大佬。 朱朱你堕落了 发表于 2024-8-12 07:50
intel编译器安装过了,已经能内联汇编了,asm_code里不会写了。就是在调用后不影响寄存器啥的,你懂的大 ...
不确定会用到啥寄存器就全部写一遍吧。
64 位没对应指令一次性全保存的,要按顺序手动一个一个入栈出栈 爱飞的猫 发表于 2024-8-12 07:52
不确定会用到啥寄存器就全部写一遍吧。
64 位没对应指令一次性全保存的,要按顺序手动一个一个入栈出 ...
对,不确定的话或是说为了保险起见,全写一遍,怎么写,哈哈,等大佬写吧。 pushad没了,要手动按顺序push各个寄存器。pushfd应该还是存在的。
push eax推参数这个,可能要分析一下你的call,一般是mov rcx,xxx,win平台大多数是rcx当参数,不过也可能不是,所以建议还是对目标call大概看一下具体使用的是哪个寄存器当参数。
另外前面模拟pushad的时候push很多寄存器,call之前要注意栈对齐,不然call的内部涉及浮点的指令可能会crash。
最后的push+ret也要改一下,因为不能push64位立即数。可以考虑sub rsp,8; mov dword ptr , 低32位; mov dword ptr , 高32位。大概是这样的思路 爱飞的猫 发表于 2024-8-12 07:18
原始指令放这里或最后面
push rax ; 依次入栈
push rbx
好像有约束可以告诉编译器要使用哪些寄存器 帅的勒,非常有用👍谢谢 本帖最后由 Vvvvvoid 于 2024-8-12 09:44 编辑
我记着 要使用内联汇编, 只要不是_declspec(naked)修饰的话 , 编译器会自动为我们写入一些保护指令,
而且 x64 的堆栈平衡全依赖外部的 sub/add esp , 没有call内部的 ret xx 这个约定了, sub/add的时候 一定要 64对齐否则会崩
页:
[1]
2