【发布时间】:2013-07-05 10:49:12
【问题描述】:
这很可能已经被问过并回答过,但我的搜索是徒劳的。
问题是关于位、字节掩码和检查。
假设一个有两个“触发器”0xC4 和 0xC5:
196: 1100 0100 0xc4
197: 1100 0101 0xc5
检查var 是否是其中一个的简单方法是:
if (var == 0xc5 || var == 0xc4) {
}
但有时人们会看到这个(或类似的):
if ( ((var ^ magic) & mask) == 0) {
}
我的问题是如何找到 magic 和 mask。将使用哪些方法、过程、技巧等来形成这些值并断言是否存在?
编辑:
澄清一下。是的,在这个确切的例子中,前者会比后者更好,但我的问题更像是生成和检查这些类型的掩码。总体来说有点绕。我省略了很多,并试图使问题变得简单。但是……
作为一个例子,我查看了 OllyDbg 反编译器的源代码,在其中可以找到:
if (((code ^ pd->code) & pd->mask) == 0)
FOUND
其中code 是从指令中转换的 0 - 3 个字节的命令。
unsigned long code = 0;
if (size > 0) *(((char *)&code) + 0) = cmd[0];
if (size > 1) *(((char *)&code) + 1) = cmd[1];
if (size > 2) *(((char *)&code) + 2) = cmd[2];
就像只屏蔽 cmd 的字节部分一样
而pd 是:
struct t_cmddata {
uint32_t mask; Mask for first 4 bytes of the command
uint32_t code; Compare masked bytes with this
...
}
将一个长数组保存为:
const t_cmddata cmddata[] = {
/* mask code */
{ 0x0000FF, 0x000090, 1,00, NNN,NNN,NNN, C_CMD+0, "NOP" },
{ 0x0000FE, 0x00008A, 1,WW, REG,MRG,NNN, C_CMD+0, "MOV" },
{ 0x0000F8, 0x000050, 1,00, RCM,NNN,NNN, C_PSH+0, "PUSH" },
{ 0x0000FE, 0x000088, 1,WW, MRG,REG,NNN, C_CMD+0, "MOV" },
{ 0x0000FF, 0x0000E8, 1,00, JOW,NNN,NNN, C_CAL+0, "CALL" },
{ 0x0000FD, 0x000068, 1,SS, IMM,NNN,NNN, C_PSH+0, "PUSH" },
{ 0x0000FF, 0x00008D, 1,00, REG,MMA,NNN, C_CMD+0, "LEA" },
{ 0x0000FF, 0x000074, 1,CC, JOB,NNN,NNN, C_JMC+0, "JE,JZ" },
{ 0x0000F8, 0x000058, 1,00, RCM,NNN,NNN, C_POP+0, "POP" },
{ 0x0038FC, 0x000080, 1,WS, MRG,IMM,NNN, C_CMD+1, "ADD" },
{ 0x0000FF, 0x000075, 1,CC, JOB,NNN,NNN, C_JMC+0, "JNZ,JNE" },
{ 0x0000FF, 0x0000EB, 1,00, JOB,NNN,NNN, C_JMP+0, "JMP" },
{ 0x0000FF, 0x0000E9, 1,00, JOW,NNN,NNN, C_JMP+0, "JMP" },
{ 0x0000FE, 0x000084, 1,WW, MRG,REG,NNN, C_CMD+0, "TEST" },
{ 0x0038FE, 0x0000C6, 1,WW, MRG,IMM,NNN, C_CMD+1, "MOV" },
{ 0x0000FE, 0x000032, 1,WW, REG,MRG,NNN, C_CMD+0, "XOR" },
...
这将是一个典型的 live 用法示例。再说一遍:方法。一直在查看Karnaugh map 等-但认为对于同一操作区还有其他等方法。
【问题讨论】:
-
"None" 将是我的快速回答,考虑到两者在可读性上的巨大差异! :)
-
您对哪些位感兴趣?只需检查这些位,无需使用任何异或操作。
-
我怀疑你看到的是 XOR。我宁愿认为它是
&,而是按位与。 -
我试着写一个答案。但我的大脑现在不工作。 :(
-
@luserdroog:感谢您的努力,不幸的是我没有看到它......因为大脑无法正常工作,我就在你身边。我处于静止状态。整整一个星期。在逻辑根本不符合的时期。
标签: c bit-manipulation bitmask