汇编中多字节密钥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长度
关键细节拆解
小端序密钥处理:
x86是小端字节序,所以你要异或的0xDEADBEEF,在寄存器里必须存成0xEFBEADDE(字节倒序),这样用dword [esi]和EDX异或时,每个字节的对应关系才和你的Python代码完全一致。循环边界的严谨性:
先判断剩余长度是否≥4,够的话批量处理,不够就逐个字节处理,彻底避免内存越界问题。剩余字节的循环密钥逻辑:
用ror edx,8(循环右移8位)实现密钥的循环复用,每次把密钥的下一个字节移到DL寄存器,和你Python代码里循环使用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
相关产品推荐
相关产品推荐

