2011-07-15 10 views
0

CreateProcessを使用してプロセスを実行しましたが、そのプロセスに割り当てられたメモリ領域をダンプしますか?これまでプロセスを作成し、そのメモリを文字列にダンプする

私のコードは次のとおりです。私はあなたが単一の読み取り操作でメモリの4 MBの読みしようとしている

function ExecuteAndDumpProcess(FileName: String): String; 
var 
    BytesRead : DWORD; 
    BufferSize : Integer; 
begin 
    flag:=0; 
    idh := pointer(LoadLibraryEx(PChar(FileName),0,DONT_RESOLVE_DLL_REFERENCES)); 
    inh := pointer(dword(idh)+idh^._lfanew); 
    EP := pointer(inh^.OptionalHeader.ImageBase + inh^.OptionalHeader.AddressOfEntryPoint); 
    GetStartupInfo(si); 
    if CreateProcess(pChar(FileName),nil,nil,nil,FALSE,DEBUG_PROCESS+DEBUG_ONLY_THIS_PROCESS,nil,nil,si,pi) then 
    While TRUE do begin 
     WaitForDebugEvent(DBEvent, 100000); 

     if DBEvent.dwDebugEventCode = EXIT_PROCESS_DEBUG_EVENT then 
     Begin 
     Exit; 
     End; 

     if dbevent.dwDebugEventCode = CREATE_PROCESS_DEBUG_EVENT then 
     Begin 
     End; 

     If dbevent.dwDebugEventCode = EXCEPTION_DEBUG_EVENT then 
     Begin 
//   if (DBEvent.Exception.ExceptionRecord.ExceptionCode = EXCEPTION_BREAKPOINT) and (flag = 1) then 
     Begin 
      BufferSize:= (1024 * 1024) * 4; 
      SetLength(Result, BufferSize); 
      ReadProcessMemory(pi.hProcess, Pointer(dword(EP)-15), @Result[0], BufferSize, BytesRead); 
      FreeLibrary(dword(idh)); 
      CloseHandle(pi.hProcess); 
      CloseHandle(pi.hThread); 
      //ContinueDebugEvent(DBEvent.dwProcessId,DBEvent.dwThreadId,DBG_TERMINATE_THREAD); 
      // ContinueDebugEvent(DBEvent.dwProcessId,DBEvent.dwThreadId,DBG_TERMINATE_PROCESS); 
      // ContinueDebugEvent(DBEvent.dwProcessId,DBEvent.dwThreadId,DBG_CONTROL_BREAK); 
      TerminateProcess(pi.hProcess, 0); 
      Exit; 
     End; 
     if (DBEvent.Exception.ExceptionRecord.ExceptionCode = EXCEPTION_BREAKPOINT) and (flag=0) then 
     begin 
      inc(flag); 
     end; 
     ContinueDebugEvent(DBEvent.dwProcessId,DBEvent.dwThreadId,DBG_CONTINUE); 
     end; 
     ContinueDebugEvent(DBEvent.dwProcessId,DBEvent.dwThreadId,DBG_EXCEPTION_NOT_HANDLED); 
    end; 
end; 

答えて

0

と思います。一度に1つのメモリページを読み込むループが必要です(コードでは4 Mbではなく4 Kbです)。 GetSystemInfo API呼び出しから適切な番号を取得することができます。http://msdn.microsoft.com/en-us/library/windows/desktop/ms724381(v=vs.85).aspx

また、一部のアドレスがデバッグプロセスでマップ解除されることが必要です。 ReadProcessMemoryは、使用されていないメモリアドレスから読み込もうとするとエラーを返します。