#windows #delphi #winapi
#Windows #delphi #winapi
Вопрос:
У Process Hacker есть диспетчер процессов на C.
Когда вы дважды щелкаете в диспетчере процессов на процессе, например, Explorer
, вы видите много информации, в том числе:
Темы, связанные с процессом. PDD, Дельта-запуск циклов, адрес, приоритет.
Ну, я пытался сделать что-то подобное в Delphi, но я получаю только TID и приоритет …
Я не могу указать начальный адрес info следующим образом: «msiltcfg.dll 0x258!» или может возвращать только 00630EFA.
(Оригинальное) приложение Process Hacker показывает информацию на изображении ниже:
Как мне это решить? на основе приведенного ниже примера кода.
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. Я думаю, что ваш реальный вопрос должен быть больше похож на этот: «Как выполнить трассировку стека или связать имена функций с их адресами для определенного потока в уже запущенном процессе». Я предполагаю, что ответ заключается в том, что, если у вас нет приложения с отладочными символами, связанными внутри, или внешнего . КАРТА или файл .TDS, вы не можете.
3. Process Hacker имеет открытый исходный код, так почему бы вам не взглянуть на исходный код?
4. @johnny, пожалуйста, не исправляйте код в вопросах. Если там есть проблема, ни один ответчик не узнает об этом, и все будут в замешательстве.
5. Процесс является хакерским с открытым исходным кодом, да… но выполняется на C или C #. Реализация для Delphi / Pascal, основанная на приведенном выше коде, мне нужна. Я хотел бы, если возможно, получить от вас помощь. По ссылке показано изображение, и в красном поле выделена информация, необходимая для получения этого кода.
Ответ №1:
Взгляните на наш класс ведения журнала в модуле SynCommons.pas с открытым исходным кодом: вы можете отслеживать стек любого метода в файле журнала. Если .map (или его сжатый эквивалент .mab) доступен, будет отображен номер строки.
Я работаю над средством просмотра журналов, способным добавлять строки исходного кода во время просмотра из файла save .map /.mab.
Теперь это используется классами модульного тестирования, так что любой сбой создаст запись в журнале с исходной строкой и трассировкой стека:
C:DevlibSQLite3exeTestSQL3.exe 0.0.0.0 (2011-04-13) Хост = Пользователь ноутбука = Мое имя 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.Инициализация (15148) 00036736 общего доступа.Test64K (18206) 0003682F Общий доступ.TTestLowLevelCommon._TDynArray (18214) 000E9C94 TestSQL3 (163)
Разница между тестовым набором без ведения журнала (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
уровень, но вы можете использовать любой доступный уровень.
Комментарии:
1. Я не понимаю! В качестве кода базовой модели, который можно было бы опубликовать как реализацию этого .. даже не знаю, с чего начать, пожалуйста, помогите мне
2. @wederfs: Некий Бушез сказал, что его продукт с открытым исходным кодом. Это означает, что для этого доступен код Delphi. Вы можете использовать это, чтобы увидеть, как это сделать. Вы должны выполнить некоторую работу самостоятельно (даже когда люди предоставляют вам исходный код).
3. Процесс является хакерским с открытым исходным кодом, да… но выполняется на C или C #. Реализация для Delphi / Pascal, основанная на приведенном выше коде, мне нужна. Я хотел бы, если возможно, получить от вас помощь. По ссылке показано изображение и выделено красным полем информация, необходимая для получения этого кода
4. Я потратил недели на чтение этого фрагмента кода, чтобы получить этот результат, но я не могу многими способами, которые я пытался получить, уточнить. По этой причине я обращаюсь к вам, у которых, безусловно, больше понимания. Я программирую на Delphi до 3-х лет. Если сможете дополнить и объяснить остальную часть кода, чтобы я мог учиться, также будьте благодарны своим партнерам.
5. @wederfs Как указано в моем сообщении, все протоколирование выполняется в классе TSynLog в модуле SynCommons.pas, который можно загрузить с нашего synopse.info/fossil сайт в его последней версии и представляет собой чистый код Delphi, работающий от Delphi 6 до XE. C # не существует, а C используется только для компиляции движка SQlite3, который вам здесь не нужен.