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),这个函数至少是个笑话。人们仍然会找到您的字符串,只是它们不是立即可读的。
最近想学汇编。 我的一个朋友向我展示了以下说明:
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),这个函数至少是个笑话。人们仍然会找到您的字符串,只是它们不是立即可读的。