Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[win32] можно ли зная handle для нити чужого процесса получить ее id 11.08.02 23:43
Автор: Xan Статус: Незарегистрированный пользователь
|
Чтобы попытаться отослать PostThreadMessage например.
|
|
[win32] можно ли зная handle для нити чужого процесса получить ее id 12.08.02 23:21
Автор: ih8u <i hate you> Статус: Member
|
можно,
перебирай все процессы через PROCESSENTRY32
и когда твой Handle будет равен найденному, вытаскивай id из этой структуры
|
| |
[win32] можно ли зная handle для нити чужого процесса получить ее id 13.08.02 01:29
Автор: Biasha <Бяша> Статус: Member
|
> можно, > перебирай все процессы через PROCESSENTRY32 > и когда твой Handle будет равен найденному, вытаскивай id > из этой структуры
Покажи мне найденный
typedef struct tagPROCESSENTRY32 {
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID;
ULONG_PTR th32DefaultHeapID;
DWORD th32ModuleID;
DWORD cntThreads;
DWORD th32ParentProcessID;
LONG pcPriClassBase;
DWORD dwFlags;
TCHAR szExeFile[MAX_PATH];
} PROCESSENTRY32;
typedef PROCESSENTRY32 *PPROCESSENTRY32;
---
Кроме того, идея не верна в корне - может быть два разных хендела одного и того же об'єкта.
|
|
[win32] можно ли зная handle для нити чужого процесса получить ее id 12.08.02 04:39
Автор: beetle <beetle> Статус: Member Отредактировано 12.08.02 04:44 Количество правок: 1
|
NtQueryInformationThread ( IN HANDLE ThreadHandle,//даешь сюда свой хендл
IN THREADINFOCLASS tic,//тип нужной инфы
OUT PVOID Info,//возвращаемая инфа
IN ULONG ThreadInfoLength,//размер передаваемого буфера
OUT PULONG Returnlength OPTIONAL);
вот перечесление,єлементі которого задают класс инфы.который можно запросить у NtQueryInformationThread :
typedef enum _THREADINFOCLASS {
ThreadBasicInformation,
ThreadTimes,
ThreadPriority,
ThreadBasePriority,
ThreadAffinityMask,
ThreadImpersonationToken,
ThreadDescriptorTableEntry,
ThreadEnableAlignmentFaultFixup,
ThreadEventPair_Reusable,
ThreadQuerySetWin32StartAddress,
ThreadZeroTlsCell,
ThreadPerformanceCount,
ThreadAmILastThread,
ThreadIdealProcessor,
ThreadPriorityBoost,
ThreadSetTlsArrayAddress,
ThreadIsIoPending,
ThreadHideFromDebugger,
MaxThreadInfoClass
} THREADINFOCLASS;
тебе достаточно ThreadBasicInformation
получишь структкру на выходе
THREAD_BASIC_INFORMATION
typedef struct _THREAD_BASIC_INFORMATION {
NTSTATUS ExitStatus;
PTEB TebBaseAddress;
CLIENT_ID ClientID;
KAFFINITY AffinityMask;
KPRIORITY BasePriority;
KPRIORITY Priority;
} THREAD_BASIC_INFORMATION;
ну а далее структура CLIENT_ID содержит искомую инфу:
typedef struct _CLIENT_ID {
HANDLE UniqueProcess;//идентификатор процесса
HANDLE UniqueThread;//идентификатор потока
} CLIENT_ID;
typedef CLIENT_ID *PCLIENT_ID;
|
| |
[win32] можно ли зная handle для нити чужого процесса получить ее id 12.08.02 11:56
Автор: cb <cb> Статус: Member
|
> NtQueryInformationThread ( IN HANDLE ThreadHandle,//даешь > сюда свой хендл > IN THREADINFOCLASS tic,//тип нужной инфы > OUT PVOID Info,//возвращаемая инфа > IN ULONG ThreadInfoLength,//размер передаваемого буфера > OUT PULONG Returnlength OPTIONAL);
я уже изрядно подзабыл все это - но такой вариант на мой взгляд не прокатит - HANDLE воспримется в контексте того процесса откуда будет вызвана ф-я NtQueryInformationThread соответственно ее надо вызывать из того процесса кому принадлежит этот HANDLE.
cb.
|
| | |
[win32] можно ли зная handle для нити чужого процесса получить ее id 13.08.02 01:42
Автор: Biasha <Бяша> Статус: Member
|
> я уже изрядно подзабыл все это - но такой вариант на мой > взгляд не прокатит - HANDLE воспримется в контексте того > процесса откуда будет вызвана ф-я NtQueryInformationThread > соответственно ее надо вызывать из того процесса кому > принадлежит этот HANDLE.
Так оно и есть. HANDLE - индекс в некоторой таблице, которая хранится в адресном пространстве процесса. Для каждого процесса таблица своя. А псевдо-хендел, это вообще совсем не хендел, а оптимизация.
Но мне казалось HANDLE, о котором идёт речь - это именно хендел в адресном пространстве процесса, в котором и нужно получить ID. Так что всё должно работать.
Только вот что это за NtQueryInformationThread?
Я думал имеется ввиду пользовательский режим.
|
| | | |
[win32] можно ли зная handle для нити чужого процесса получить ее id 13.08.02 05:43
Автор: beetle <beetle> Статус: Member
|
> Так оно и есть. HANDLE - индекс в некоторой таблице, > которая хранится в адресном пространстве процесса. Для > каждого процесса таблица своя. А псевдо-хендел, это вообще > совсем не хендел, а оптимизация. > Но мне казалось HANDLE, о котором идёт речь - это именно > хендел в адресном пространстве процесса, в котором и нужно > получить ID. Так что всё должно работать.
описатель (он же HANDLE ) - это индекс определенной записи в таблице описателей объектов ядра некоторого процесса.Существуют механизмы совместного использования объектов ядра несколькими РАЗНЫМИ процессами.В таком случае запись из таблицы описателей объктов одного процесса копируется в соответствующую таблицу друго процесса.При этом значения хендлов могут различаться.В данном случае если есть описатель объекта ядра "поток", то он будет валидным для потока в другом процессе,если хендл получен с помощью механизма дублирования хендлов к примеру либо иного корректного механизма. Потому ентот хендл может быть абсолютно нормально использован к примеру для получения информации о потоке,на объект которого он указывает.
> Только вот что это за NtQueryInformationThread? > Я думал имеется ввиду пользовательский режим. функция из библиотеки ntdll.dll- ядра системы.Функционирует в пользовательском режиме.А вот из нее уже при трассировке попадаешь в нулевое кольцо
|
| | |
[Win32] ежели это псевдохендл,тогда согласен. А ежели нормальный, то не вижу повода. 12.08.02 17:39
Автор: beetle <beetle> Статус: Member
|
|
| | | |
[Win32] ежели это псевдохендл,тогда согласен. А ежели нормальный, то не вижу повода. 12.08.02 18:02
Автор: cb <cb> Статус: Member
|
а что есть "нормальный" HANDLE, если я ничего не путаю то HANDLE всегда принадлежит процессу его создавшему, и не важно в UserMode это делается или в KernelMode - контекст процесса есть всегда. Во всяком случае в ядре при открытии TCP соединения мне не удавалось использовать HANDLE открытый в контексте SYSTEM в произвольном процессе, пришлось всю работу затолкать в SystemThread.
cb.
|
|
|