什么是_bittest 宏?

逆向工程 拆卸
2021-07-01 16:57:59

以下是btX64 Windows 二进制文件中的指令示例

bt      eax, 18h
jnb     short loc_a
lea     rcx, String
call    cs:__imp_wprintf
mov     eax, [rbx+40h]

在伪代码中:

if ( _bittest(&Mode, 0x18u) )
{
  wprintf(L"String");
  Mode = Properties->Mode;
}

_bittestIF 语句中使用是什么是类似if(a & b == b)还是什么的?该代码if(a & b == b)用于检查一个标志是否存在于 OR 运算的标志中。从调试中,我发现上面的汇编代码正在做类似的事情。

3个回答

它测试第n位是否已设置,true如果已设置false返回如果未设置则返回

它基本上与if(a & (1 << num_bit))参数是要测试的位数而不是位(或标志,如果您愿意的话)本身相同。

_bittest映射到bt指令编译器内在函数

生成bt指令,该指令检查地址 a 的位置 b 中的位,并返回该位的值。

unsigned char _bittest(  
   long const *a,  
   long b  
);

bt是一条 x86指令,用于检查数字/值中是否设置了位。它设置CF标志作为位的值,你可以使用jb/ jnb/ jc/jnc检查,如果其1/0。

bt      eax, 18h

正如@Johann 的回答中已经提到的,它相当于 python

CF = (eax & (1 << 0x18)) >> 0x18

我添加了一些代码,你玩它在这里