首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XOR EAX,2(和load/store/pointer-increment)常用在哪里?

XOR EAX,2(和load/store/pointer-increment)常用在哪里?
EN

Stack Overflow用户
提问于 2021-09-29 12:55:39
回答 1查看 86关注 0票数 0

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

代码语言:javascript
复制
mov EAX, [EDX]
xor EAX, 2
mov [EBX], EAX
inc EDX
inc EBX

我回答说,

代码语言:javascript
复制
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. 

我的解释正确吗?如果我错了,请纠正我。

其次,他问,这个最常用的地方是什么?

这是某种常规的代码例程指令吗?有没有人能帮我一下这个最常用的地方?

请原谅我的理解/错误。我对组装非常陌生。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-29 14:32:49

这看起来毫无意义的低效和奇怪(如果这是在循环中,会有重叠的4字节加载/存储),所以我怀疑你在任何地方都找不到它,但是的,你已经正确地描述了它的作用。

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

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

对于更复杂的异或常量,它用于对字符串或来自简单的低工作量逆向工程(如strings ./a.out )的其他数据进行轻度混淆,以便在可执行文件中找到连续的ASCII字节。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69376832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档