当' reg '包含内存地址时' test reg, const '



试图逆向工程一个"裂纹";在二进制文件中,我偶然发现了这样一个函数:

mov ecx, [esp+4]
test ecx, 3
jz short loc_106A9F0

函数的第一个参数(函数的第一行是MOV'd到ECX)是一个指向字符串的指针。如果我理解正确,下一行执行TEST操作,其中一个操作数是内存地址,另一个是常量。我想知道为什么程序会这样做,考虑到内存地址本身应该是无关的。
简而言之,我想知道为什么程序要TEST具有非零const的指针。

它正在检查指针的4字节对齐,即低2位都为零,所以
p % 4 == 0

这是你可能在一个优化的strlen或类似的函数开始时做的事情,一次读取超过一个字节的内存;请参阅在x86和x64上读取同一页中超过缓冲区末端的内容是否安全?

或者它可能是一个标记指针的东西,你使用int *的低2位来做其他事情,因为一个真正的int *将总是在底部有2个零位(在一个字节可寻址的机器上,如x86,在alignof(int) == 4的C实现中)。在解引用指针之前清除它们,或者提取它们以获得额外的数据。这可能是合理的分支它们都很清楚。

最新更新