· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Определить ThreadID по handle

Посл.отвђт Сообщенiе


Дата: Янв 21, 2004 19:11:15

Да, нелёгкое это дело в ядре ковыряться. Вот нашёл функцию ZwGetInformationThread, но её нельзя использовать, т.к. она проверяет указатель ThreadInformation, на ядро он указывает или нет. Единственный выход передать туда указатель ring3, но такой тоже хрен достанешь. Как же всё-таки получить этот ID? (Код расположен на перехвате _NtTerminateThread).


Дата: Янв 21, 2004 19:37:10 · Поправил: volodya

ThreadID извлекается из ETHREAD


Дата: Янв 21, 2004 19:48:32

Ну понятно, откуда он извлекается. В функцию _TerminateThread передаётся хэндл треда, а как по этому хэндлу получить доступ к управляющим структурам непонятно. Только ZwGetInformationThread, но функция недоступна для ring0.


Дата: Янв 21, 2004 20:38:57

ZwGetInformationThread...
Откуда ты вообще это имя выкопал? Я не нашел ничего ни в ntdll, ни в ntoskrnl, ни в сети!


Дата: Янв 21, 2004 20:42:29

тьфу перепутал!!!

ZwQueryInformationThread.

Кстати, может можно как-нибудь получить указатель Ring3 стека и его в эту функцию передать?


Дата: Янв 21, 2004 21:09:02

Ох ты ж мой трудноудовлетворяемый...

PsCreateSystemThread
PsGetCurrentProcess
PsGetCurrentProcessId
PsGetCurrentThread
PsGetCurrentThreadId
PsGetVersion
PsSetCreateProcessNotifyRoutine
PsSetCreateThreadNotifyRoutine
PsSetLoadImageNotifyRoutine
PsTerminateSystemThread

Читай:
http://www.microsoft.com/msj/0199/nerd/nerd0199.aspx


Дата: Янв 21, 2004 21:18:42

Ну и зачем мне эти функции? Мне в мой обработчик _NtTerminateThread передаётся хэндл хрен знает какого треда, и надо по нему как-то определить ID, и всякие PsGetCurrentThreadId мне не нужны. Мне надо в общем найти свободную память в зоне ring3 размером 28байт и передать его в ZwQueryInformationThread, она туда всё что надо и запишет.


Дата: Янв 21, 2004 23:06:54

Ох... Ну что за нездоровая страсть к использованию системных структур? Ты еще в структурах ядра свою хрень храни. Чтоб не только твой дров падал, но и вообще, все к ядрене фене уходило...
Я тут немного подумал, а ЧТО ТАКОЕ хендл треда, а?


Дата: Янв 21, 2004 23:14:08

Кстати, не совсем по теме, но линк хороший:

http://www.alexfedotov.com/samples/threads.asp

А так, есть HANDLE_TABLE:
struct _HANDLE_TABLE {
  /*<thisrel this+0x0>*/ /*|0x4|*/ unsigned long Flags;
  /*<thisrel this+0x4>*/ /*|0x4|*/ long HandleCount;
  /*<thisrel this+0x8>*/ /*|0x4|*/ struct _HANDLE_TABLE_ENTRY*** Table;
  /*<thisrel this+0xc>*/ /*|0x4|*/ struct _EPROCESS* QuotaProcess;
  /*<thisrel this+0x10>*/ /*|0x4|*/ void* UniqueProcessId;
  /*<thisrel this+0x14>*/ /*|0x4|*/ long FirstFreeTableEntry;
  /*<thisrel this+0x18>*/ /*|0x4|*/ long NextIndexNeedingPool;
  /*<thisrel this+0x1c>*/ /*|0x38|*/ struct _ERESOURCE HandleTableLock;
  /*<thisrel this+0x54>*/ /*|0x8|*/ struct _LIST_ENTRY HandleTableList;
  /*<thisrel this+0x5c>*/ /*|0x10|*/ struct _KEVENT HandleContentionEvent;
};


Дата: Янв 22, 2004 10:57:24

Ну хэндл треда возвращает OpenThread, используется во всяких там SuspendThread, ResumeThread.

Я уже хотел ядро патчить, чтобы разрешить запись в ring0 область. Но вижу, что из таблицы вытащить указатель на ETHREAD лучше. Придёться копать ntoskrnl и смотреть, как он вытаскивается.


Дата: Янв 22, 2004 17:37:16

Всё, нашёл. Функция ObReferenceObjectByHandle возвращает указатель на ETHREAD, а оттуда как раз можно всё извлечь.


Дата: Янв 23, 2004 18:21:36

dragon, мне сказали, что ты не прав!
Твоя ZwQueryInformationProcess работает и для ядра!

Кусок из ntoskrnl:
INIT:005621C5 FF 75 28                             push    [ebp+arg_20]
INIT:005621C8 FF 75 24                             push    [ebp+arg_1C]
INIT:005621CB FF 75 D8                             push    [ebp+var_28]
INIT:005621CE FF 75 20                             push    [ebp+arg_18]
INIT:005621D1 FF 75 1C                             push    [ebp+arg_14]
INIT:005621D4 8D 45 A8                             lea     eax, [ebp+var_58]
INIT:005621D7 50                                   push    eax
INIT:005621D8 68 FF 0F 1F 00                       push    1F0FFFh
>INIT:005621DD 57                                   push    edi
>INIT:005621DE E8 B3 E8 E9 FF                       call    ZwCreateProcess
...
INIT:00562202 53                                   push    ebx
INIT:00562203 6A 18                                push    18h
INIT:00562205 8D 45 90                             lea     eax, [ebp+var_70]
INIT:00562208 50                                   push    eax
INIT:00562209 53                                   push    ebx
>INIT:0056220A FF 37                                push    dword ptr [edi]
>INIT:0056220C E8 49 EE E9 FF                       call   
ZwQueryInformationProcess


Дата: Янв 23, 2004 19:49:42

А я говорил про ZwQueryInformationThread. Всё равно легче ObReferenceObjectByHandle воспользоваться. А инструмент мне так и не доделать. Я делал что-то типа superbpm, только сделал так, что сервис не обнаружить, и сделал защиту от GetThreadContext/SetThreadContext. Надо ещё ловить два момента, когда структура CONTEXT передаётся в режим пользователь и наоборот(SEH). Вот наоборот я нашёл, NtContinue. А вот когда из ядра что-то передаётся я тоже нашёл, но перехватить можно только по RVA, ничего не экспортируется. А это только для конкретного файла ntoskrnl годиться, ведь они разные для Win2k/XP/2003, да ещё и для каждого SP и всяких заплаток обновлений разные они. Вряд ли кому такое нужно будет.


Дата: Янв 24, 2004 20:19:45

А я говорил про ZwQueryInformationThread.

Кхм. Соори. Пошел гулять. Хватит перед компом сидеть :(((

Я делал что-то типа superbpm, только сделал так, что сервис не обнаружить

Да ну? Сходи на rootkit, скачай оттуда kistle или как там его и проверь ;)

По SEH - точки входа две:
1) SetThreadContext
2) NtContinue

И ту, и другую ловить через SDT. Обе экспортируются.


Дата: Янв 24, 2004 23:02:48

SetThreadContext я уже поймал. NtContinue тоже можно поймать, но ещё поймать момент, когда структура CONTEXT передаётся обработчику SEH, это надо, чтобы в неё установить то, что было записано в прошлый раз. Это как бы эмуляция такая, вызываешь SetThreadContext, пишешь что-нибудь в DR регистры, а потом если вызовешь GetThreadContext, то прочитаешь тоже самое, хотя на самом деле DR регистры не меняются. Это защищает от использования для своих целей DR регистров, но не от брейкпоинтов(telock).

Так вот, ловить можно только KiUserExceptionDispatcher, но это уже кольцо 3 и перехват можно обнаружить, а я хотел полностью в ring0 всё сделать.

Для сервиса я выбираю случайное имя, так по OpenService его не обнаружить, т.к. непонятно, что обнаруживать то надо, имя случайное.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.420