1

このコードを使用すると、スキャンが高速になったと思いますが、スキャンは常に同じアドレスを返します。

例えば:

00123456
00124567
00135478
00145893
00123456 //start repeat 
00124567
00135478
00145893
00123456 //start repeat 
00124567
00135478
00145893

これは私の手順です:

procedure SCANBYTE(value: integer);
var
 lpflOldProtect: dword;
 s: size_t;
 mbi: MEMORY_BASIC_INFORMATION;
 SI: SYSTEM_INFO;
 lpStartAddress, lpStopAddress: dword;
 addr: dword;
 i: dword;
begin
 GetSystemInfo(si);
 lpStartAddress := dword(SI.lpMinimumApplicationAddress);
 lpStopAddress := dword(SI.lpMaximumApplicationAddress);
 for addr := lpStartAddress to lpStopAddress do begin
  S:= VirtualQuery(Pointer(addr), MBI, SizeOf(MEMORY_BASIC_INFORMATION));
  if (S=SizeOf(MEMORY_BASIC_INFORMATION)) and (MBI.State = MEM_COMMIT) and (MBI.Type_9 = MEM_PRIVATE) and (MBI.RegionSize>0) and (MBI.Protect = PAGE_READWRITE) then begin
   for i := dword(MBI.BaseAddress) to (dword(MBI.BaseAddress) + dword(MBI.RegionSize)) - 4096 do begin
     if value = PBYTE(i)^ then ListBox1.Items.Add(IntToHex(i,8));
   end;
  end;
 end;
end;

問題は最後の FOR ループにあると思います。

(...)
for i := dword(MBI.BaseAddress) to (dword(MBI.BaseAddress) + dword(MBI.RegionSize)) - 4096 do begin
(...)

しかし、私は本当に知りません..どうすればこれを解決できますか?

4

1 に答える 1

8

開始アドレスから終了アドレスまでループでコードを実行します。アドレスは、ループを周回するたびに1ずつaddr増加します。ページ全体に関する情報を提供します。ページ内のすべてのアドレスは同じベースアドレスを持っています。ドキュメントには、「この値は次のページの境界に切り捨てられます」と記載されています。VirtualQuery

もっとよく見るとmbi.BaseAddress、外側のループを4096回繰り返しても同じであることがわかります(4096がページサイズであると仮定)。したがって、同じメモリブロックを何度も再スキャンしていることになります。(それはまたあなたのコードが遅い理由を説明するかもしれません。)

于 2012-04-04T19:43:48.027 に答える