Получить имя / описание начального адреса или из потока в процессе (Delphi / Pascal) - PullRequest
1 голос
/ 26 апреля 2011

Process Hacker имеет диспетчер процессов на C.

Когда вы дважды щелкаете в диспетчере процессов в процессе, например, в Explorer
Вы видите много информации, в том числе:
Темы, связанные спроцесс.PDD, циклы Delta Start, адрес, приоритет.

Ну, я пытался сделать что-то подобное в Delphi, но я получаю только TID и приоритет ...
Я не могу поставить информационный начальный адрес следующим образом: "msiltcfg.dll 0x258!"или может вернуть только 00630EFA.

(Оригинал) Хакер процесса подачи заявления показывает информацию на изображении ниже:

http://i54.tinypic.com/mrcztx.png

Как мне решить эту проблему?на основе приведенного ниже примера кода.

procedure TForm1.Button7Click (Sender: TObject);
var
  tbi: THREAD_BASIC_INFORMATION;
  hThreadSnap, Process, hThread, ThreadInfo: THandle;
  te32: tagTHREADENTRY32;
  me32: MODULEENTRY32;
  th32: THREADENTRY32;
  dwPID: DWORD;

  startaddr: Pointer;
  Status: LongInt;
  Error: DWORD;
  modname: String;
  hToken: DWORD;
  TKP: TOKEN_PRIVILEGES;
  otkp: TOKEN_PRIVILEGES;
  dwLen: dword;


begin
  hThreadSnap: = CreateToolhelp32Snapshot (TH32CS_SNAPTHREAD, 0);
  if hThreadSnap = INVALID_HANDLE_VALUE then 
   Exit;
  try
    dwPID: = GetProcessID (Trim (Edit1.Text));

    te32.dwSize: = SizeOf (THREADENTRY32);

    me32.dwSize: = SizeOf (MODULEENTRY32);

    ListBox1.Items.Clear;
    ListBox2.Items.Clear;

    if not Thread32First (hThreadSnap, te32) then
      Exit;

    repeat
      if te32.th32OwnerProcessID = dwPID then 
      begin
        hThread: = OpenThread (THREAD_ALL_ACCESS,
        False, te32.th32ThreadID);
        status: = ZwQueryInformationThread (hThread,
        9, 
        ThreadQuerySetWin32StartAddress {}
        @Startaddr,
        SizeOf (startaddr)
        @ DwLen);

        listbox1.Items.AddObject (Format ('StartAddress:% p'
        [Startaddr]) + 'ID:' + IntToStr(te32.th32ThreadID), TObject (hThread));

        if hThread <> 0 then
          CloseHandle (hThread);
      end;
    Until not Thread32Next (hThreadSnap, te32);
  finally
    CloseHandle (hThreadSnap);
  end;
end;

1 Ответ

2 голосов
/ 26 апреля 2011

Взгляните на наш класс ведения журнала в модуле с открытым исходным кодом SynCommons.pas : вы можете отслеживать стек любого метода в файле журнала.Если файл .map (или его сжатая эквивалентность .mab) доступен, будет показан номер строки.

Я работаю над средством просмотра журналов, которое может добавлять строки исходного кода во время просмотра из файла сохранения .map / .mab.

Теперь оно используется классами модульного тестирования, так чтолюбой сбой создаст запись в журнале с исходной строкой и трассировкой стека:

C: \ Dev \ lib \ SQLite3 \ exe \ TestSQL3.exe 0.0.0.0 (2011-04-13) Хост = Пользователь ноутбука = MyName CPU = 2 * 0-15-1027 OS = 2.3 = 5.1.2600 Wow64 = 0 Freq = 3579545 TSynLogTest 1.13 2011-04-13 05: 40: 25

20110413 05402559 сбойTTestLowLevelCommon (00B31D70) Низкий уровень общего: TDynArray "" трассировка стека 0002FE0B SynCommons.TDynArray.Init (15148) 00036736 SynCommons.Test64K (18206) 0003682F SynCommons.TTestLowLevelCommon._1 * 213 * 1013 (113) Test2Array (1013313S) Test2Cray (1013313) Test2Cray (1013313S) Test2Cray (1013313) Test2Cray (1013313S) Test2Cray (1013313) Test2Arg1014 * Разница между тестовым костюмом без регистрации (TSynTests) и тестовым костюмом с протоколированием (TSynTestsLogged) заключается только в следующем:

procedure TSynTestsLogged.Failed(const msg: string; aTest: TSynTestCase);
begin
  inherited;
  with TestCase[fCurrentMethod] do begin
    fLogFile.Log(sllFail,'%: % "%"',
      [Ident,TestName[fCurrentMethodIndex],msg],aTest);
  end; {with}
end;

Уровень sllFail, если используется здесь, но вы можете использовать любой доступныйуровень.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...