逆向理光固件里的strncpy的时候发现一种非常巧妙的比特操作,只用了一个减号、一个取反号和两个与号就能够判断一个4字节的int类型数(或者说DWORD类型)中是否有一个字节是零。记录一下。
1 | unsigned int __fastcall strncpy(unsigned int dst, char *src, unsigned int len) |
注意里面if ( ((v14 - 0x1010101) & ~v14 & 0x80808080) != 0 )
这个操作。
v14
是一个4字节的整形数,如果其中任何一个字节是0,那么这个字节减去1之后符号位肯定会反转,之后再和0x80
做与来判断每个字节的符号位是否发生了反转,来判断是否含有零。
非零的字节减去1之后符号位肯定不会反转,只有0减去1之后符号位才发生反转。