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

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时代恶意软件的典型环境),我们拆解每一步的作用:

  1. 初始化阶段

    • lea si, Start:将Start标签对应的内存地址加载到si寄存器,这是解密操作的起始位置。
    • mov sp, 0682h:设置循环计数器sp为0x682,意味着要解密总共0x682个16位内存单元(共0xD04字节)的加密代码。
  2. 解密循环核心逻辑

    • xor [si], si:对si指向的内存单元(存储着加密后的代码),与si寄存器的当前值执行异或操作,结果写回该内存单元。
    • xor [si], sp:接着对同一个内存单元,与sp寄存器的当前值执行异或操作,结果写回。
    • inc si:si自增2(16位操作的地址步长),指向下一个待解密的16位单元。
    • dec sp:sp自减1,循环计数器减1。
    • jnz Decrypt:若sp不为0,继续循环解密。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:15:30