You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用NASM编写PE打包器解密Stub时XOR循环代码报错求助

使用NASM编写PE打包器解密Stub时XOR循环代码报错求助

嘿,看起来你遇到了NASM语法和逻辑的双重小问题,咱们一步步来解决:

1. 直接导致报错的语法错误

你代码里的这行:

inc rbx ,1

是完全错误的!NASM中inc指令的作用就是将寄存器的值自动加1,不需要额外指定,1参数。多余的逗号和数字1让NASM无法解析,这就是你看到error: comma, decorator or end of line expected, got 259的原因。把这行改成:

inc rbx

就能解决语法报错。

2. 逻辑上的致命问题(解密后未写回内存)

你原来的汇编代码只完成了“读取加密字节→XOR解密”的步骤,但没有把解密后的字节写回原内存地址!这样.text段的加密数据根本不会被修改,就算循环跑完,程序还是无法执行原入口点的代码。

修正后的完整Stub代码

这里给你修正后的可运行版本:

BITS 64
xor rbx, rbx          ; 初始化计数器为0
loop:
    ; 读取.text段当前偏移的字节到al(只用rax的低8位,足够存1字节)
    mov al, byte [0x00007FF75C991000 + rbx]
    xor al, 0x19       ; 用密钥0x19解密
    mov byte [0x00007FF75C991000 + rbx], al  ; 把解密后的字节写回原地址
    inc rbx             ; 计数器加1
    cmp rbx, 797696     ; 对比是否达到.text段的SizeOfRawData
    jne loop            ; 没到就继续循环
jmp $                  ; 无限循环表示解密完成

编译验证

现在用你原来的命令重新编译:

nasm -f bin stub.asm -o stub.bin

应该就能生成正确的原始二进制Stub了,你可以把stub.bin的字节注入到PE的.packed段中。

额外建议(针对后续开发)

目前用硬编码地址虽然简单,但在实际打包器中,这些值(.text段起始地址、段大小、原入口点)都应该是动态获取的——比如在C代码中把这些值写入Stub的指定位置,而不是写死在汇编里。不然换一个目标程序,你的Stub就完全失效了。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 13:23:02