1

これはおそらく以前に尋ねられて回答された可能性がありますが、私の検索は無駄でした.

質問は、ビット、バイト マスク、およびチェックに関するものです。

2 つの「トリガー」がある0xC4とし0xC5ます。

196: 1100 0100  0xc4
197: 1100 0101  0xc5

いずれかであるかどうかを確認する簡単な方法は次のvarとおりです。

if (var == 0xc5 || var == 0xc4) {

}

しかし、時々これ(または同様のもの)を見ることがあります:

if ( ((var ^ magic) & mask) == 0)  {

}

私の質問は、魔法マスクを見つける方法です。これらの値を形成し、存在するかどうかをアサートするために、どのような方法、手順、トリックなどを利用する必要がありますか?


編集:

明確にするために。はい、この正確な例では、前者の方が後者よりも優れていますが、私の質問は、これらの種類のマスクの生成とチェックの一般的なものです。一般的に少しいじります。私は多くを省略し、質問を簡単にしようとしました. しかし ...

例として、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" },
  ...

これは、典型的な実際の使用例です。繰り返しますが、この方法です。カルノーマップなどを見てきましたが、同じ地区の作戦には別の方法などがあると思いました。

4

2 に答える 2