吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1207|回复: 13
收起左侧

[已解决] 求助x64 内联汇编问题

[复制链接]
朱朱你堕落了 发表于 2024-8-12 07:18
200吾爱币
本帖最后由 朱朱你堕落了 于 2024-8-15 08:24 编辑

感谢各位大佬,已解决。

最佳答案

查看完整内容

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

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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

[Asm] 纯文本查看 复制代码
原始指令放这里或最后面
push rax ; 依次入栈
push rbx
push rcx
push ...

call 你的函数

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


--------

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

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
朱朱你堕落了 + 3 + 1 好像发错板块了,版主挪动一下吧,,辛苦了老哥!

查看全部评分

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

点评

intel编译器安装过了,已经能内联汇编了,asm_code里不会写了。就是在调用后不影响寄存器啥的,你懂的大佬。  详情 回复 发表于 2024-8-12 07:50
 楼主| 朱朱你堕落了 发表于 2024-8-12 07:50
爱飞的猫 发表于 2024-8-12 07:38
手动 push/pop 你确定会用到的寄存器
此外 vs 编译目标是 x64 的话,不能内联汇编(除非安装英特尔编译器 ...

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

点评

不确定会用到啥寄存器就全部写一遍吧。 64 位没对应指令一次性全保存的,要按顺序手动一个一个入栈出栈  详情 回复 发表于 2024-8-12 07:52
爱飞的猫 发表于 2024-8-12 07:52
朱朱你堕落了 发表于 2024-8-12 07:50
intel编译器安装过了,已经能内联汇编了,asm_code里不会写了。就是在调用后不影响寄存器啥的,你懂的大 ...

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

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

点评

对,不确定的话或是说为了保险起见,全写一遍,怎么写,哈哈,等大佬写吧。  详情 回复 发表于 2024-8-12 08:01
 楼主| 朱朱你堕落了 发表于 2024-8-12 08:01
爱飞的猫 发表于 2024-8-12 07:52
不确定会用到啥寄存器就全部写一遍吧。

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

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

点评

-------- 省  详情 回复 发表于 2024-8-12 08:05
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 [rsp], 低32位; mov dword ptr [rsp+4], 高32位。大概是这样的思路

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
朱朱你堕落了 + 1 + 1 热心回复!
爱飞的猫 + 1 + 1 热心回复!

查看全部评分

LuGuanDi 发表于 2024-8-12 08:57
爱飞的猫 发表于 2024-8-12 07:18
[mw_shl_code=asm,true]原始指令放这里或最后面
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对齐否则会崩

点评

call 之前要对齐堆栈,call 之后要恢复原本的值。 因为函数会利用向量指令加速,从堆栈读写数据时用到,这些加速指令操作的地址需要对齐。 整起来也是挺麻烦的。 然后还有些 call 要在堆栈预留一些空间。这个是  详情 回复 发表于 2024-8-12 17:03

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
朱朱你堕落了 + 1 + 1 热心回复!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-12 22:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表