(qs это селектор такой модный, или опечатка?) Открываю блокнотом, qs становится gs ?!?! Видимо шрифт кривой , в браузере. Сорри я не виноват, если что.
Вообще из ринг3 вот так, (хотя зачем? что может быть в ЖС): GetThreadSelectorEntry(...) ReadProcessMemory(......) Ессно у дескрипторов процесса и потока должны быть все необходимые права.
Блин!!! Она же NtQueryInformationThread вызывает!!!! Три дня потерял, ковыряя ядро, - ничего не нашел )) _Serega_ спасибо агромадное
Если интересно, то FS указывает на TLB. А функцию GetThreadSelectorEntry, обычно используют отладчики для получения соответствующего виртуального адреса TLB, по FS.
Всегда рад помочь, коллеге , кстати видимо интересными вещами занимаешься... стукни в аську , мой ид щас будет в привате
Собс-но, оттуда нужно всего-лишь Peb вытащить. Голову три раза уже сломал, как его вытянуть (Peb32 в смысле, ZwQueryInformationProcess не катит)
NtQueryInformationThread под Win64 возвращает STATUS_NOT_IMPLEMENTED В мануале на Amd64 написано, что базы FS и GS хранятся в MSR`ах. Могут быть какие-нибудь еще способы вытащить базы этих сегментов?
Хороший вопрос. Вероятнее всего, нет, тем более под WOW64. Но хочется написать по-возможности наиболее универсальный код, чтобы обезопаситься от странных апдейтов и сервис-паков
Я в том смысле, что если каждый раз, когда нужно получить Peb, создавать поток, система работать быстрее не станет С кешированием и синхронизацией с созданием/удалением процессов возиться желания тоже нет. Думаю, попробую все ж проверить, меняется ли адрес Peb по версиям... ЗЫ: Из ядра, если писать загрузчик с нуля, было бы далеко не 5 строк
gilg Хочешь сказать что функция GetThreadSelectorEntry под Win64 тоже не работает? А как отладчики? Не могу представить себе функциональность такого отладчика. Не может быть! У меня протестить негде.... Но это полная ерунда, создавать ось в которой невозможно создать полноценный отладчик.
_Serega_ Код (Text): .text:0000000078DA0420 ; BOOL __stdcall GetThreadSelectorEntry(HANDLE hThread,DWORD dwSelector,LPLDT_ENTRY lpSelectorEntry) .text:0000000078DA0420 public GetThreadSelectorEntry .text:0000000078DA0420 GetThreadSelectorEntry proc near .text:0000000078DA0420 sub rsp, 28h .text:0000000078DA0424 mov ecx, 0C00000BBh .text:0000000078DA0429 call sub_78D6E660 ; RtlNtStatusToDosError() .text:0000000078DA042E xor eax, eax .text:0000000078DA0430 add rsp, 28h .text:0000000078DA0434 retn .text:0000000078DA0434 GetThreadSelectorEntry endp
Юзер-модным отладчиком по крайней мере такого больше сделать нельзя. WinDbg в юзер-моде НЕ может прочитать память по адресу вида CS:<valid address>, хотя содержимое сегментных регистров показывает. Т.е. ZwGetContextThread работает, а зарезолвить дескриптор он не может.