2012-05-12 31 views
3

我正在嘗試掃描整個進程的內存,但沒有成功......我在做的是:對於測試我使用記事本,所以我寫在那裏%B和這個HEX值爲:25(%)和42(B)。因此,代碼爲:使用ReadProcessMemory掃描整個進程內存

while (VirtualQueryEx(PIDHandle, Pointer(MemStart), MemInfo, SizeOf(MemInfo)) <> 0) do 
    begin 
     if ((MemInfo.State = MEM_COMMIT) and (not (MemInfo.Protect = PAGE_GUARD) 
     or (MemInfo.Protect = PAGE_NOACCESS)) and (MemInfo.Protect = PAGE_READWRITE)) then 
      begin 
      SetLength(Buff, MemInfo.RegionSize); 
       if (ReadProcessMemory(PIDHandle, MemInfo.BaseAddress, Buff, 
             MemInfo.RegionSize, ReceivedBytes)) then 
       begin 
       for I := 0 to SizeOf(Buff) do 
       begin 
    if (IntToHex(Buff[i], 1) = '25') and (IntToHex(Buff[i+2], 1) = '42') then 
        Form1.Memo1.Lines.Append(IntToHex(Buff[i], 1)); 
       end; 

       end; 
      end; 
     MemStart:= MemStart + MemInfo.RegionSize; 
    end; 
    CloseHandle(PIDHandle); 
    end; 

的變種「的Buff」是TB的(我讀到Tbytes的,並認爲這是相同的字節數組)。所以我將字節轉換爲十六進制,並分別搜索值25和42。代碼如下:

if (IntToHex(Buff[i], 1) = '25') and (IntToHex(Buff[i+2], 1) = '42') then 

因爲在十六進制值之間有00。所以我需要添加'+2'。我如何掃描整個內存的這個值?

回答

8

記事本使用Unicode,因此您需要查找UTF-16編碼數據,$0025$0042

我不明白你爲什麼覺得在比較之前需要轉換成十六進制字符串。對於需要使用字符串的十六進制,沒有什麼特別的。十六進制只是一個基數爲16的數字系統。因此,十進制數32與十六進制數20相同,即32=$20。直接與整數值做你的比較:

if (Buff[i]=$25) and (Buff[i+2]=$42) then 

儘管如此,考慮到$00字節測試確實應該是這樣的:

var 
    Target: string; 
.... 
Target := '%B'; 
if CompareMem(@Buff[i], @Target[1], Length(Target)*SizeOf(Char)) then 
    .... 

我不想太深入您的代碼的其餘部分,但此行

for I := 0 to SizeOf(Buff) do 

在許多不同的級別上是錯誤的。

  1. SizeOf(Buff)返回指針的大小,因爲動態數組變量本質上只是一個指針。要記住的一個有用的事情是在編譯時對SizeOf進行評估。
  2. 如果您使用Length而不是SizeOf那麼您將迭代列表的末尾。要循環使用動態數組,請從0循環到Length(...)-1
  3. 但在這種情況下,您正在訪問的循環內指數i+2,所以你應該從循環到0Length(...)-3

但事實上,你需要來比較連續的4個字節來找到匹配。也許是這樣的:

TargetByteLength = Length(Target)*SizeOf(Char); 
for i := 0 to Length(Buff)-TargetByteLength do 
    if CompareMem(@Buff[i], @Target[1], TargetByteLength) then 
    .... 
+0

謝謝你的回答和關注。但對於我來說,仍然是一個謎,爲什麼程序無法找到記事本內存中的值。如果我進行ReadProcess,如: ReadProcessMemory(PIDHandle,指針($ 00367ED0),淺黃色,MemInfo.RegionSize,ReceivedBytes),用正確的地址指針,它找到。但是掃描整個內存,找不到任何東西。對不起,不便... – HwTrap

+0

我的最新更新有幫助嗎? –

+0

是的......謝謝! – HwTrap