1 週間前、別のプロセスのメモリをスキャンするプロジェクトの作成を開始しました。最初は、プロセスに DLL を挿入してそのメモリにアクセスすることを考えていましたが、すべての困難のために、VirtualQueryEx / ReadProcessMemory API を使用してこれを開始しました。以下にコードを示します。
var
Form1: TForm1;
PIDHandle: THandle;
PID: dword;
MemInfo: MEMORY_BASIC_INFORMATION;
SysInfo: SYSTEM_INFO;
PageSize, MemStart, ReceivedBytes: cardinal;
Buff: PChar;
IsWow64Process: TIsWow64Process;
IsWow64: BOOL;
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))) then
begin
if (0<>MemInfo.Protect and PAGE_READWRITE) then
begin
GetMem(Buff, MemInfo.RegionSize);
if (ReadProcessMemory(PIDHandle, Pointer($00636ED0), Buff,
MemInfo.RegionSize, ReceivedBytes)) then
begin
Memo1.Lines.Append(PAnsiChar(Buff));
end;
FreeMem(Buff);
end;
end;
MemStart:= MemStart + MemInfo.RegionSize;
end;
CloseHandle(PIDHandle);
end;
まずすべて - この while メソッド:
while (VirtualQueryEx(PIDHandle, Pointer(MemStart), MemInfo, SizeOf(MemInfo)) > 0) do
...
MemStart:= MemStart + MemInfo.RegionSize;
すべてのメモリアドレスをスキャンしていますか? それとも、アドレスを読み取らずに「ジャンプ」しているだけですか??! 2番目の最も重要な問題-私はメモ帳を使用してテストを行っています。私の目的は、そこに書かれた文字列を読み取ることです。私がこのようにすると:
if (0<>MemInfo.Protect and PAGE_READWRITE) then
begin
GetMem(Buff, MemInfo.RegionSize);
if (ReadProcessMemory(PIDHandle, Pointer($00636ED0), Buff,
MemInfo.RegionSize, ReceivedBytes)) then
begin
Memo1.Lines.Append(PAnsiChar(Buff));
end;
FreeMem(Buff);
end;
アドレスを ReadProcessMemory に直接渡すと、文字列の最初の文字 (または最初のバイト) が取得されます。バフを覚えているのは PChar です...しかし、同じことをすると、 ReadProcessMemory は次のようになります。
if (ReadProcessMemory(PIDHandle, MemInfo.BaseAddress, Buff,
MemInfo.RegionSize, ReceivedBytes)) then
begin
Memo1.Lines.Append(PAnsiChar(Buff));
end;
FreeMem(Buff);
end;
メモにたくさんの中国語と無効な文字を追加します。すべてのメモリアドレスを自動的にスキャンして、そこに文字列を書き込むにはどうすればよいですか? コードについて質問がある場合は、私に聞いてください...あなたの助けを待っています