XOR免杀溯源分析:从混淆原理到实战追踪的完整思路
最近在折腾恶意样本分析的时候,又双叒叕碰到了XOR混淆的玩意儿,说实话,一开始真有点头大,但静下心来仔细捋一捋,发现XOR免杀溯源分析其实没那么玄乎,关键是要把思路理清楚,今天就把我这段时间踩坑总结出来的经验分享给大家,希望能帮到同样在做样本分析的朋友们。

为什么XOR成了免杀界的“万金油”?
先说个直观的感受哈——XOR这玩意儿真的太常见了,你随便拉一个免杀样本下来,十有八九里面藏着XOR的影子,为啥呢?因为XOR运算简单、可逆、速度快,而且对二进制数据特别友好,不像Base64那样会膨胀体积,攻击者用一个小小的密钥,就能把Shellcode或者敏感字符串搅得面目全非,静态扫描直接懵圈。
但话说回来,这也恰恰给我们做XOR免杀溯源分析留下了突破口——因为XOR是可逆的!只要你能找到密钥,原始数据就能完整还原,这就好比你把钥匙藏在了房间里,我们做溯源分析的过程,本质上就是满屋子找钥匙的过程。
XOR免杀溯源分析的核心思路:找密钥、定范围、还原文
我在实操中一般把XOR免杀溯源分析拆成三步走,这里结合个人经验聊一聊:
第一步,定位XOR循环的“指纹”。 编译出来的XOR解密代码往往有很明显的特征,比如一个循环里反复出现 xor byte ptr [xxx], al 这种指令,或者密钥被硬编码在某个寄存器里,用IDA或者Ghidra跟一下,很容易就能嗅到味道,我一般会先搜 xor 指令扎堆的地方,这招屡试不爽。
第二步,推断密钥长度和密钥值。 这一步是XOR免杀溯源分析的重头戏,如果密钥是单字节的,那太简单了,直接暴力枚举256种可能,看解密后有没有PE头或者可读字符串就行,多字节密钥就稍微麻烦点,可以用已知明文攻击的思路——比如PE文件开头一定是 MZ,Shellcode通常有 0xFC 0xE8 这类特征,反推密钥,我吐槽一句,有些样本密钥藏得贼深,还得配合动态调试下断点看内存,真挺费劲的。
第三步,批量还原与关联溯源。 找到密钥后,就可以对整个样本或者内存dump做还原了,还原出来的明文才是真正有价值的东西——可能是C2地址、可能是加载的模块名、也可能是下一阶段的Payload,有了这些,XOR免杀溯源分析就能往上追溯到攻击者的基础设施,关联到家族特征。
实战里那些让人抓狂的坑
说真的,XOR免杀溯源分析不是每次都顺风顺水,我遇到最多的坑是变种XOR——比如密钥每次循环自增、密钥跟索引异或、或者先XOR再加减偏移,这时候单纯的暴力枚举就不灵了,得结合动态执行,把解密后的内存段dump出来对比,还有的样本会分段XOR,不同段用不同密钥,那就得先把样本切块,逐个击破,这些经验都是被样本“教做人”教出来的,哈哈。
另外提醒一句,做XOR免杀溯源分析一定要注意安全隔离,样本该在虚拟机里跑就在虚拟机里跑,别图省事在物理机上开,不然真出事哭都来不及。
小结
XOR免杀溯源分析这事儿,核心就是吃透XOR的可逆性,把“找密钥—还原—关联”这条链路走通,工具固然重要,但更关键的是分析思路和耐心,希望这篇经验分享能让你下次碰到XOR混淆样本时,不再一头雾水,而是能淡定地说一句:“就这?我来还原给你看。” 有问题欢迎一起交流,咱们下篇见!