2016-04-15 57 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」這樣的字符指針,這樣我就可以將它放到我的FindPattern函數中。我將如何做到這一點?

+0

的'\ x'形式是在你的代碼串_literal_形式。它不存在於內存中。事實上與「0xDEADBEEF」相同; 「0x」僅用於編譯器。 – MSalters

+0

所以你說我不需要\ x? –

+0

確實,你在運行時創建了模式,然後就沒有編譯器。 – MSalters

回答

0

你必須在這裏小心。在包括x86在內的許多體系結構中,使用little endian來存儲int,這意味着int 0xDEADBEEF按以下順序存儲在內存中:EF BE AD DE。但是char數組的存儲順序是DE AD BE EF

所以問題是,你是否試圖找到一個int 0xDEADBEEF存儲在內存中,或者你真的想要的字節序列DE AD BE EF

如果你想int,根本不要使用char *數組。將模式和掩碼作爲DWORD傳遞,並且可以簡化該功能。

如果你想找到字節序列,那麼不要把它作爲int存儲在第一位。只需將輸入作爲char數組並將其直接作爲模式傳遞即可。


編輯:你可以嘗試這樣的事情,我認爲這會給你想要的東西:

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好吧我想我得到你要找的東西。看看我的編輯 – smead

+0

好的,這是我的代碼和輸出:https://gyazo.com/04139c73b075e3bddc502adf256dd6b0我不希望FFFFFF在值的開始。 編輯:我把int而不是字符,它做我想要的,謝謝! –

0

在C/C++的\字符轉義字符,所以任何它後面被轉換爲你想要的轉義字符,十六進制轉換(\x)在你的字符串中。爲了避免這種情況,在它之前加上另一個\,這樣它將被視爲正常字符。

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

+0

在模式中,我甚至需要使用「\ x」嗎? –

+0

這取決於你在處理中需要什麼。在你的示例函數調用中,'DWORD PATTERN = FindPattern(0xC0000000,0x20000,「\ x1F \ x37 \ x66 \ xE3」,「xxxx」);','\ x'包含在函數參數中,所以我認爲你需要它。 –