我有一个“历史”恶意软件(cascade 1701)的 asm 密码。 但是,我无法理解指令 xor [si], si 的意义是什么。代码如下:
lea si, Start
mov sp, 0682
Decrypt : xor [si], si
xor [si], sp
inc si
dec sp
jnz Decrypt
Start : ...
对我来说,似乎 [si] 将被分配给一种随机值,因为 si 和 [si] 之间没有明显的联系(至少没有可预测的联系)。 感谢您的帮助!
我所做的所有研究最终都向我解释了我理解的 xor XX, XX 的要点...但是 xor [XX], XX ?!
最佳答案
在 Intel 汇编中(以及变体中,例如 Borland 引入的“理想”模式,这就是您的代码片段可能使用的),操作数的顺序是“目标 <- 源”。 (与高级语言赋值语句中操作数出现的顺序相同。)
XOR [SI], SI
对 si
指向的地址内容进行异或值为si
并将结果存储回该地址。尽管非常奇怪,但它是完全合法的。
异或运算是一种众所周知的简单加密策略。在最简单的形式中,它由将数组中的每个值与常量进行异或运算组成,因此它类似于XOR [si], 01ah
。 .
这种简单加密形式的问题在于它会产生可预测的模式,因为“a”总是会转换为某个值,“b”会转换为其他值,但总是相同的值,等等。
另一种稍微更高级(但按照现代加密标准同样幼稚)的方法是对加密数组中的每个索引使用不同的值进行异或。这就是XOR [SI], SI
完成,因为SI
每次迭代都会有不同的值。
这种特殊的异或加密实现的奇怪之处在于,(除其他外)它假设要加密的字符数组位于固定的内存地址,并且它将是完全相同的地址当重新应用算法进行解密时。
(请注意,术语“加密/解密”在这里可以互换使用,因为加密和解密都使用相同的算法:解密只需重新应用该算法。)
所以,这可能意味着这段代码的作者煞费苦心地确保缓冲区始终位于预期的内存地址,换句话说就是 Start:
的值。加密和解密时都是一样的。
这是非常hacky的,但是汇编语言程序员通常以做这样的极其hacky的事情而闻名。
恶意软件程序员更是如此。
请注意 Start:
标签可能会产生误导。该代码可能已被反汇编。作者使用LEA
指令作为将缓冲区地址加载到 SI
的方法,并且反汇编程序习惯于为任何 LEA
的目标创建标签。指令,而不必知道段寄存器是如何排列的。因此,如果Start:
标签实际上在代码中,正如代码片段所示,那么可能发生的情况是反汇编器出于某种原因假设 DS 寄存器包含与 CS 寄存器相同的值,因此 SI 正在加载某些指令的地址,而可能发生的情况是 SI 被设置为指向数据段中的某个缓冲区,此时该缓冲区与代码段不同。如果这个假设是正确的,那么代码实际上并不像看起来那么糟糕。
有关描述九十年代初期我大学时代的一次黑客攻击事件的短篇小说(文学、非小说类),其中我破解了 Norton Utilities protected 密码,请参阅 https://blog.michael.gr/2017/09/a-hackers-tale.html事实上,诺顿实用程序使用的是这种简单的异或算法的最简单形式,即使使用了稍微更高级的形式,我破解其密码的方法也会起作用。
关于assembly - xor [si], si 在 asm x86 中做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74371985/