我試圖搜索一個以null結尾的字符串進程的內存的所有實例。我enumed所有VirtualQueryEx的alloced內存區域,然後我用ReadProcessMemory讀給一個字節數組,並使用該算法中搜索(我發現這裏的作者聲稱是最快的)ReadProcessMemory最快的方法是什麼?
public static unsafe List<long> IndexesOf(byte[] Haystack, byte[] Needle) {
List<long> Indexes = new List<long>();
fixed (byte* H = Haystack) fixed (byte* N = Needle) {
long i = 0;
for (byte* hNext = H, hEnd = H + Haystack.LongLength; hNext < hEnd; i++, hNext++) {
bool Found = true;
for (byte* hInc = hNext, nInc = N, nEnd = N + Needle.LongLength; Found && nInc < nEnd; Found = *nInc == *hInc, nInc++, hInc++) ;
if (Found) Indexes.Add(i);
}
return Indexes;
}
}
它的工作原理,但它太慢了。有沒有一種方法可以將內存映射到進程或以某種方式在其內存中更快地搜索?
如何排除這些區域?順便提一下,這些都是動態字符串。它們在可執行程序執行後分配。此外,我正在閱讀大塊(作爲我正在尋找的當前內存區域的大小)。 – blez
在VirtualQueryEx中,檢查MEMORY_BASIC_INFORMATION結構並查看Protect成員。 –
這做了一個小的加速。該字符串不對齊,我不想注入一個DLL,導致最激進的病毒檢測到它。多線程是我唯一的希望嗎? – blez