x86汇编中xor [si], si指令作用解析——Cascade 1701恶意代码场景
解析Cascade 1701恶意软件解密代码中的
xor [si], si指令 问题背景
获取到Cascade 1701这款历史恶意软件的汇编解密代码,但无法理解其中xor [si], si指令的作用,代码如下:
lea si, Start mov sp, 0682h Decrypt : xor [si], si xor [si], sp inc si dec sp jnz Decrypt Start : ...
原疑问:认为[si]会被赋予随机值,因为si和[si]之间没有明显可预测关联,仅了解xor XX,XX的作用,对xor [XX],XX的用法完全困惑。
指令解析与解密逻辑
这是8086架构的16位汇编代码(DOS时代恶意软件的典型环境),我们拆解每一步的作用:
初始化阶段
lea si, Start:将Start标签对应的内存地址加载到si寄存器,这是解密操作的起始位置。mov sp, 0682h:设置循环计数器sp为0x682,意味着要解密总共0x682个16位内存单元(共0xD04字节)的加密代码。
解密循环核心逻辑
xor [si], si:对si指向的内存单元(存储着加密后的代码),与si寄存器的当前值执行异或操作,结果写回该内存单元。xor [si], sp:接着对同一个内存单元,与sp寄存器的当前值执行异或操作,结果写回。inc si:si自增2(16位操作的地址步长),指向下一个待解密的16位单元。dec sp:sp自减1,循环计数器减1。jnz Decrypt:若sp不为0,继续循环解密。
xor [si], si的关键作用
异或运算的核心特性是:对同一个值连续异或两次会还原原始值(即A XOR B XOR B = A)。Cascade 1701的加密逻辑是将原始代码O加密为E = O XOR si_enc XOR sp_enc,其中:si_enc是加密时该代码单元的内存地址sp_enc是加密时对应的计数器值
解密时,每一轮循环的si和sp与加密时的si_enc、sp_enc完全对应:加密时从Start地址开始,计数器从0x682递减到0;解密时流程完全一致,每一步的si和sp都和加密时的密钥组合匹配。因此两次异或后:E XOR si XOR sp = (O XOR si_enc XOR sp_enc) XOR si XOR sp = O
最终还原出可执行的原始代码。
你之前的误解在于认为si是随机值,但实际上si是加密时就固定好的对应内存地址,sp是同步递减的计数器,两者是加密时特意选用的密钥组合,并非随机值。
内容的提问来源于stack exchange,提问作者Pierre de Chambure
相关产品推荐
相关产品推荐

