XOR EAX,2(andload/store/pointer-increment)常用在什么地方?

Where is XOR EAX, 2 (and load/store/pointer-increment) commonly used?

最近想学汇编。 我的一个朋友向我展示了以下说明:

mov EAX, [EDX]
xor EAX, 2
mov [EBX], EAX
inc EDX
inc EBX

我回复了,

1. Value at `edx` address is loaded in `eax`
2. Value in `eax` is XORed by 2 
3. Value in `eax` is stored back in memory address mentioned in `ebx`
Increment edx and ebx. 

我的解释正确吗?如有不妥请指正

其次他问,这个用在什么地方最多?

这是某种规律的代码例程指令吗?谁能帮我看看这个最常用的地方是什么?

请原谅我的understanding/mistakes。我对组装很陌生。

这看起来毫无意义的低效和怪异(如果这是一个循环,则有重叠的 4 字节 loads/stores),所以我怀疑你会在任何地方找到它,但是是的,你已经正确地描述了它的作用.

复制缓冲区并仅翻转每个字节的第 2 位也是不正常的(假设 EDX 和 EBX 指向非重叠缓冲区)。

但是,如果您要这样做,您要么一次使用 movzx eax, byte [edx] 加载和 mov [ebx], al 存储一个字节,要么 add ebx,4/add edx,4 所以你可以 xor eax, 0x02020202。 (或者最好使用 SSE1 或 SSE2 一次复制和异或 16 个字节。)

使用更复杂的 XOR 常量,这可用于从简单的省力逆向工程(如 strings ./a.out 中轻松混淆字符串或其他数据,以在可执行文件中查找连续的 ASCII 字节。

参见 glibc memfrob(3)42 (0x2a) 就地异或,而不是复制。从没有设置高位的常量可以看出(因此大多数可打印的 ASCII 字符保持可打印的 ASCII),这个函数至少是个笑话。人们仍然会找到您的字符串,只是它们不是立即可读的。