Создать процесс и записать его память в строку - PullRequest
0 голосов
/ 16 июля 2011

Я выполнил процесс, используя CreateProcess, но я хочу вывести область памяти, выделенную процессу, как это сделать?

мой код до сих пор:

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;

1 Ответ

0 голосов
/ 05 апреля 2012

Я думаю, вы пытаетесь прочитать 4 Мб памяти за одну операцию чтения.Вместо этого у вас должен быть цикл, который читает по одной странице памяти за раз (обычно 4 КБ, а не 4 МБ, как в вашем коде).Вы можете получить правильный номер из вызова API GetSystemInfo: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724381(v=vs.85).aspx

Вы также должны ожидать, что некоторые адреса не будут отображены в отлаженном процессе.ReadProcessMemory вернется с ошибкой, если вы попытаетесь прочитать с адреса памяти, который не используется.

...