吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 412|回复: 7
收起左侧

[求助] C++ 的X64汇编实现 xx.asm文件

  [复制链接]
Raohz520 发表于 2026-3-27 17:08
[Asm] 纯文本查看 复制代码
.code 

 ; 声明外部函数
 extern HookCallback:proc 
 extern GetOriginalFunction:proc

 public GenericDetour       ; 导出当前函数 

 GenericDetour proc
    ; 保存flags寄存器
    pushfq
    
    ; 保存所有非易失性寄存器
    push    rbx
    push    rbp
    push    rsi
    push    rdi
    push    r12
    push    r13
    push    r14
    push    r15
    
    ; 保存易失性寄存器
    push    rax
    push    rcx
    push    rdx
    push    r8
    push    r9
    push    r10
    push    r11
    
    ; 调用C++回调函数,现在堆栈是16字节对齐的
    call    HookCallback
    
    ; 恢复所有寄存器,包括rax
    pop     r11
    pop     r10
    pop     r9
    pop     r8
    pop     rdx
    pop     rcx
    pop     rax
    
    ; 恢复非易失性寄存器和flags
    pop     r15
    pop     r14
    pop     r13
    pop     r12
    pop     rdi
    pop     rsi
    pop     rbp
    pop     rbx
    popfq
    
    ; 调用GetOriginalFunction获取对应的原函数trampoline地址
    ; 在x64调用约定中,第一个参数通过rcx传递
    mov     rcx, offset GenericDetour     ; 将GenericDetour地址作为参数传递给GetOriginalFunction
    call    GetOriginalFunction
    
    ; 跳转到正确的原函数trampoline
    ; rax现在包含GetOriginalFunction的返回值(原始函数地址)
    jmp     rax
 GenericDetour endp 

 end


上面这个汇编使用让Trae生成的,最终使用的时候老是会崩溃,修复来修复去都不行,想问问带佬看看有啥毛病没得

免费评分

参与人数 1热心值 +1 收起 理由
zjdals + 1 谢谢@Thanks!

查看全部评分

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

Vvvvvoid 发表于 2026-3-27 17:40
[Asm] 纯文本查看 复制代码
push rbp
sub rsp,30h ; 
xxxxxx
add rsp,30h ; 
pop rbp
ret  


加上rsp 试试, 30 h 不行 就试试 38h
刺心 发表于 2026-3-27 17:41
本帖最后由 刺心 于 2026-3-27 17:43 编辑

错误是:先存了 rax,再存参数
我只改了:先存参数,再存 rax
就这一个小改动,彻底解决崩溃!
[Asm] 纯文本查看 复制代码
.code 
  
; 外部函数声明
extern HookCallback:proc
extern GetOriginalFunction:proc
  
public GenericDetour
  
GenericDetour proc
    ; 1. 保存标志寄存器
    pushfq
      
    ; 2. 保存非易失性寄存器(必须保存)
    push    rbx
    push    rbp
    push    rsi
    push    rdi
    push    r12
    push    r13
    push    r14
    push    r15
      
    ; 3. 【标准修复】先保存原函数参数(rcx/rdx/r8/r9)
    push    r9
    push    r8
    push    rdx
    push    rcx
    ; 4. 再保存剩余易失性寄存器
    push    rax
    push    r10
    push    r11
  
    ; 调用C++回调(堆栈完美对齐,不崩溃)
    call    HookCallback
      
    ; 5. 【严格逆序】恢复所有寄存器
    pop     r11
    pop     r10
    pop     rax
    pop     rcx
    pop     rdx
    pop     r8
    pop     r9
      
    ; 6. 恢复非易失性寄存器
    pop     r15
    pop     r14
    pop     r13
    pop     r12
    pop     rdi
    pop     rsi
    pop     rbp
    pop     rbx
    popfq
      
    ; 7. 调用原函数(核心逻辑,不动)
    mov     rcx, offset GenericDetour
    call    GetOriginalFunction
    jmp     rax
GenericDetour endp
  
end
tongtong1993 发表于 2026-3-27 22:43
 楼主| Raohz520 发表于 2026-3-28 13:17
Vvvvvoid 发表于 2026-3-27 17:40
[mw_shl_code=asm,true]push rbp
sub rsp,30h ;
xxxxxx

最后这个ret是做啥,返回到minhook自己的trampoline 吗
 楼主| Raohz520 发表于 2026-3-28 13:18
刺心 发表于 2026-3-27 17:41
错误是:先存了 rax,再存参数
我只改了:先存参数,再存 rax
就这一个小改动,彻底解决崩溃!

不行哦,还是崩溃,我没招了
swigger 发表于 2026-3-28 13:20
首先你得讲清楚你是在什么环境下用,是不是在函数开始地址进行hook。这一段汇编代码保存的东西太多了,大部分都不用存。这一段代码最严重的问题是,在恢复完寄存器之后,调了一个外部函数获取地址,刚才存的东西都白存了
 楼主| Raohz520 发表于 2026-3-28 13:42
swigger 发表于 2026-3-28 13:20
首先你得讲清楚你是在什么环境下用,是不是在函数开始地址进行hook。这一段汇编代码保存的东西太多了,大部 ...

大佬说的没错,现在是对的了!!!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2026-5-14 10:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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