Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Получить ThreadID главного потока процесса


Автор: hhhhhhhhhhhh 8.4.2014, 15:41
Вот если запущен некий процесс - я через CreateRemoteThread загружаю в этот процесс свою dll.

Потом, в либе в момент DLL_PROCESS_ATTACH я хочу поставить CBT хук на этот процесс CBTHOOK := SetWindowsHookEx(WH_CBT, CBTHOOKPROC, HInstance, GetCurrentThreadId);
Но не работает.

Сейчас понял, что в данный момент, мы находимся в чуждом\удалённом потоке.
А как вместо GetCurrentThreadId - подставить реальный ThreadID (главного) родного потока в данном процессе?


Автор: CynicRus 8.4.2014, 16:06
GetWindowThreadProcessId.

Автор: hhhhhhhhhhhh 8.4.2014, 16:15
Цитата(CynicRus @ 8.4.2014,  16:06)
GetWindowThreadProcessId.

-Прога\жертва всегда находится в состоянии без окон, постоянно сидит в трее, и изредка показывает диалоги\окна при (моей) необходимости(щелчок в трее)-а потом уничтожает эти диалоги\окна при закрытии их.
Тобишь, в момент запуска моего лоадера - у жертвы нет окон.

Автор: CynicRus 8.4.2014, 16:44
Ну тогда только такое приходит на ум:

Код

uses PsAPI, TlHelp32, Windows, SysUtils;

//выводит список потоков
function GetThreadsInfo(PID:Cardinal): Boolean;
  var
    SnapProcHandle: THandle;
    NextProc      : Boolean;
    ThreadEntry  : TThreadEntry32;
  begin
    SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); //Создаем снэпшот всех существующих потоков
    Result := (SnapProcHandle <> INVALID_HANDLE_VALUE);
    if Result then
      try
        ThreadEntry.dwSize := SizeOf(ThreadEntry);
        NextProc := Thread32First(SnapProcHandle, ThreadEntry);//получаем первый поток
        while NextProc do begin
          if ThreadEntry.th32OwnerProcessID = PID then begin //проверка на принадлежность к процессу
              Writeln('Thread ID      ' + inttohex(ThreadEntry.th32ThreadID, 8));
              Writeln('base priority  ' + inttostr(ThreadEntry.tpBasePri));
              Writeln('delta priority ' + inttostr(ThreadEntry.tpBasePri));
              Writeln('');
          end;
          NextProc := Thread32Next(SnapProcHandle, ThreadEntry);//получаем следующий поток
        end;
      finally
        CloseHandle(SnapProcHandle);//освобождаем снэпшот
      end;
  end;



Добавлено через 1 минуту и 59 секунд
Ну и соответственно - таким макаром искать тредиды своего процесса, который там надо.

Автор: hhhhhhhhhhhh 14.4.2014, 19:01
Блин неужели, в момент загрузки через CreateRemoteThread своей dll в чужой процесс - никто не ставил хуки(SetWindowsHookEx) на этот чужой процесс?

Или может по другому это как то можно сделать? Надо сделать просто некий лоадер - его запустили- он загрузил нашу dll в чужой процесс(с постановкой хука на этот процесс) - и закрылся...

Автор: CynicRus 14.4.2014, 21:13
CreateRemoteThread - возвращает же хэндл созданного процесса.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)