朱朱你堕落了 发表于 2024-8-12 07:18

求助x64 内联汇编问题

本帖最后由 朱朱你堕落了 于 2024-8-15 08:24 编辑

感谢各位大佬,已解决。

爱飞的猫 发表于 2024-8-12 07:18

朱朱你堕落了 发表于 2024-8-12 08:01
对,不确定的话或是说为了保险起见,全写一遍,怎么写,哈哈,等大佬写吧。

原始指令放这里或最后面
push rax ; 依次入栈
push rbx
push rcx
push ...

call 你的函数

pop ...
pop rcx
pop rbx
pop rax ; 相反的顺序出栈

--------

省略部分你对着 x64dbg 看有哪些寄存器(或翻翻 x86-64 架构文档),跳过 rsp 就行。

爱飞的猫 发表于 2024-8-12 07:38

手动 push/pop 你确定会用到的寄存器
此外 vs 编译目标是 x64 的话,不能内联汇编(除非安装英特尔编译器)
如果你的 hook 目标是函数头,直接把参数全转发到你的函数就好。编译器编译函数的时候会根据调用约定自动备份/还原那些特殊的寄存器值。

朱朱你堕落了 发表于 2024-8-12 07:50

爱飞的猫 发表于 2024-8-12 07:38
手动 push/pop 你确定会用到的寄存器
此外 vs 编译目标是 x64 的话,不能内联汇编(除非安装英特尔编译器 ...

intel编译器安装过了,已经能内联汇编了,asm_code里不会写了。就是在调用后不影响寄存器啥的,你懂的大佬。

爱飞的猫 发表于 2024-8-12 07:52

朱朱你堕落了 发表于 2024-8-12 07:50
intel编译器安装过了,已经能内联汇编了,asm_code里不会写了。就是在调用后不影响寄存器啥的,你懂的大 ...

不确定会用到啥寄存器就全部写一遍吧。

64 位没对应指令一次性全保存的,要按顺序手动一个一个入栈出栈

朱朱你堕落了 发表于 2024-8-12 08:01

爱飞的猫 发表于 2024-8-12 07:52
不确定会用到啥寄存器就全部写一遍吧。

64 位没对应指令一次性全保存的,要按顺序手动一个一个入栈出 ...

对,不确定的话或是说为了保险起见,全写一遍,怎么写,哈哈,等大佬写吧。

yes2 发表于 2024-8-12 08:50

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位。大概是这样的思路

LuGuanDi 发表于 2024-8-12 08:57

爱飞的猫 发表于 2024-8-12 07:18
原始指令放这里或最后面
push rax ; 依次入栈
push rbx


好像有约束可以告诉编译器要使用哪些寄存器

Dylan19970311 发表于 2024-8-12 09:30

帅的勒,非常有用👍谢谢

Vvvvvoid 发表于 2024-8-12 09:42

本帖最后由 Vvvvvoid 于 2024-8-12 09:44 编辑

我记着 要使用内联汇编, 只要不是_declspec(naked)修饰的话 , 编译器会自动为我们写入一些保护指令,
而且 x64 的堆栈平衡全依赖外部的 sub/add esp , 没有call内部的 ret xx 这个约定了, sub/add的时候 一定要 64对齐否则会崩
页: [1] 2
查看完整版本: 求助x64 内联汇编问题