使用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
相关产品推荐
相关产品推荐

