0

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;

メモにたくさんの中国語と無効な文字を追加します。すべてのメモリアドレスを自動的にスキャンして、そこに文字列を書き込むにはどうすればよいですか? コードについて質問がある場合は、私に聞いてください...あなたの助けを待っています

4

3 に答える 3

0

To get the first memory address do this :

var
sysinfo : TSystemInfo;
GetSystemInfo(sysinfo);
start : DWORD;
begin
start := DWORD(sysinfo.lpMinimumApplicationAddress);
end;

You are getting garbage because an 0 occurss in the string before all memory is shown so do this use

var
   mybuffer : String;
begin
   SetLength(mybuffer,MemInfo.RegionSize);
   CopyMemory(@mybuffer[1],Buff,MemInfo.RegionSize);
   Memo1.Lines.Add(mybuffer);

end;
于 2012-05-02T06:27:16.663 に答える
0

dll インジェクション (およびその他の楽しい手法) を探している場合は、こちらを参照してください。 https://sites.google.com/site/delphibasics/system/app/pages/search?scope=search-site&q=dll+injection

于 2012-05-02T06:45:38.983 に答える