2016-04-15 3 views
0
DWORD FindPattern(DWORD base, DWORD size, char *pattern, char *mask) 
{ 
    // Get length for our mask, this will allow us to loop through our array 
    DWORD patternLength = (DWORD)strlen(mask); 

    for (DWORD i = 0; i < size - patternLength; i++) 
    { 
     bool found = true; 
     for (DWORD j = 0; j < patternLength; j++) 
     { 
      // If we have a ? in our mask then we have true by default, 
      // or if the bytes match then we keep searching until finding it or not 
      found &= mask[j] == '?' || pattern[j] == *(char*)(base + i + j); 
     } 

     // Found = true, our entire pattern was found 
     // Return the memory addy so we can write to it 
     if (found) 
     { 
      return base + i; 
     } 
    } 

    return NULL; 
} 

が、私はメモリの特定のセクションにバイトを見つけるために使用私のFindPattern関数であり、ここで私は関数を呼び出す方法は次のとおりです。変換進整数「 x」の - 上記(C++メモリ)

DWORD PATTERN = FindPattern(0xC0000000, 0x20000,"\x1F\x37\x66\xE3", "xxxx"); 
PrintStringBottomCentre("%02x", PATTERN); 

今、例えば整数があったとします:0xDEADBEEF これを "\ xDE \ xAD \ xBE \ xEF"のようなcharポインタに変換したいのですが、これをFindPattern関数に入れることができます。どうすればいい?

+0

'\のX 'フォームはあなたのコード内の文字列_literal_形です。メモリには存在しません。実際には '0xDEADBEEF'と同じです。 '0x'はコンパイラ用です。 – MSalters

+0

私は\ xは必要ないと言っていますか? –

+0

実際、実行時にパターンを作成してから、コンパイラはありません。 – MSalters

答えて

0

ここで注意する必要があります。 x86を含む多くのアーキテクチャでは、を使用してがこの順序でメモリに格納されていることを意味して、EF BE AD DEが格納されます。intが格納されます。しかし、char配列はDE AD BE EFの順番で格納されます。

質問には、0xDEADBEEFがメモリに格納されていますか、実際にはバイト列DE AD BE EFが必要ですか?

intを使用する場合は、char *配列を使用しないでください。パターンとマスクをDWORDとして渡すと、その機能を大幅に簡素化できます。

バイトのシーケンスを検索する場合は、最初にintとして格納しないでください。入力をchar配列として取得し、パターンとして直接渡してください。


編集:C/C++での\文字がエスケープ文字であるので、それを次のもの

int a = 0xDEADBEEF; 
char pattern[4]; 
pattern[0] = (a >> 24) & 0xFF; 
pattern[1] = (a >> 16) & 0xFF; 
pattern[2] = (a >> 8) & 0xFF; 
pattern[3] = a & 0xFF; 
+0

intを返さなければならない関数を使用している場合、返されるバイトはパターンになるものです –

+0

@MCDOOGLEye ok私はあなたが探しているものを得ると思います。私の編集を参照してください – smead

+0

これは私のコードと出力です:https://gyazo.com/04139c73b075e3bddc502adf256dd6b0私は値の最初にFFFFFFをしたくありません。 編集:私はcharの代わりにintを入れ、それは私がそれに感謝したいことをします! –

0

:あなたは私が何をしたいあなたを与えるだろうと思われ、このようなものを試すことができますあなたが望むエスケープ文字に変換され、文字列の16進数変換(\x)に変換されます。これを避けるには、前に別の\を追加してください。そうすれば、通常の文字と見なされます。

例)\\xDE\\xAD\\xBE\\xEF

+0

パターンでは、 "\ x"を使用する必要がありますか? –

+0

処理に必要なものによって異なります。あなたのサンプル関数呼び出しでは、 'DWORD PATTERN = FindPattern(0xC0000000、0x20000、" \ x1F \ x37 \ x66 \ xE3 "、" xxxx ");'、\ xは関数の引数に含まれているので、それ。 –

関連する問題