当`reg`包含内存地址时,`testreg,const`
在尝试对“crackme”二进制文件进行逆向工程时,我偶然发现了一个像这样开头的函数:
mov ecx, [esp+4]
test ecx, 3
jz short loc_106A9F0
该函数的第一个参数(这是MOV“d到ECX在该函数的第一行)是一个指针为字符串。如果我理解正确,下一行执行TEST操作,其中一个操作数是内存地址,另一个是常量。我想知道为什么程序会这样做,考虑到内存地址本身应该无关紧要。
简而言之,我想知道为什么要编程TEST一个具有非零常量的指针。
回答
它正在检查指针的 4 字节对齐,即低 2 位都为零,所以
p % 4 == 0
这是您可能在优化 strlen 或类似函数开始时执行的操作,该函数一次读取多个字节的内存;请参阅在 x86 和 x64 上的同一页面内读取缓冲区末尾是否安全?
或者它可能是一个标记指针的东西,你将 an 的低 2 位int *用于其他东西,因为实数int *总是在底部有 2 个零位(在像 x86 这样的字节可寻址机器上,在 C 实现中alignof(int) == 4)。在取消引用指针之前清除它们,或者提取它们以获取额外数据。将它们分为两个分支可能是合理的。