И так в приложении стартует поток, у каждого потока есть свой контекст если я правильно понимаю. Вот строка Код (Text): // // This section is specified/returned if the // ContextFlags word contians the flag CONTEXT_SEGMENTS. // DWORD SegGs; DWORD SegFs; DWORD SegEs; DWORD SegDs; Это как я понимаю селекторы сегментных регистров, так вот можно ли для потока выполняемого сделать следующее... Есть некий базовый(ые) адреса памяти и некий код который там сидит (не вирусня) к примеру имеем такой вариант Код (Text): fld dword ptr ds:[....] тут к примеру загружаем float число из какого нить участка памяти по смещению (там где ..., если я правильно понимаю суть) или тут располагается абсолютный адрес того что хотим грузить... имеем тот же выполняемый поток, можно ли сделать так чтобы не использовался абсолютная адресация а некое смещение чтоли от того же самого базового адреса к пример 186h. Есть ли литература пример по работе с селекторами потоков его контекстом и LDT_ENTRY... и если можно пример
dev001 Адресация относительная, все сегменты по дефолту имеют нулевые базы, за исключением указателя на среду(Fs/Gx(x64)). Можно смещать сегмент, для этого есть 3 вроде сервиса и одно прерывание(KiGetTickCount, но если уже юзается лдт). На смещение сегментов запилен такое элитный функционал как IDP.
Нашел на wasm пример анти отладочной фичи... но там мало что понятно... по ldt_entry инфмы нормальной тоже найти не могу (или плохо ищу)... я так понимаю с помощью нативных nt функций можно создавать ldt но везде где все таки находил инфу говорят что селектор нужно восстанавливать при вызове api - ных функций (тоже самое и crt касается?) и еще момент если все же базовый адрес при создании дескриптора установим, то в селекторах можно ли использовать 186h значение вместо 0x00410200? Как ОС тут поступает? она для каждого процесса создает свою таблицу? или?
dev001 Селектор это номер дескриптора сегмента в дескрипторной таблице(GDT|LDT) и флаги(тип таблицы и уровень привилегий), он хранится в сегментных регистрах и занимает 16 бит. Что такое 0x00410200 не понятно, походу это какойто адрес, он никакого отношения не имеет с сегменту. Адрес формируется из базы сегмента, который индексируется дескриптором и смещением. В вашем случае в NT адрес равен базе сегмента + 0x00410200, но так как база равна нулю, то адрес совпадает со смещением. Вообще это очень простая тема, но если не пытаться понять, то вы продолжите нести подобный бред.
Если это простая тема пример с созданием ldt для NT платформы и перезаписью селектора для потока можете привести? и так чтобы это можно было использовать с вызовами api функций без восстановление прежнего скажем ds?
dev001 1. Нужно хотя бы понимать принципы адресации. Вы явно не понимаете что такое сегмент, селектор етц. Это основы! 2. NTAPI позволяют создать свой дескриптор в LDT. Так как среда мультизадачная, то планировщику необходима некоторая инфа, которую он будет использовать для загрузки таблицы при переключении на задачу. Это всё делается через один сервис. Передаёте свой дескриптор и ось его загрузит. NtSetLdtEntries получает в аргументах селектор и соответствующий дескриптор для него(точнее два сразу можно ставить). Есть есчо ProcessLdtInformation. Сервисы ядра восстанавливают селекторы. Тоесть при формировании т-фрейма в ядре для сисколов сохраняются не текущие значения селекторов, а стандартные системный и при возврате они восстанавливаются. В следствии этого после возврата из сервиса селекторы следует восстановить. А это нельзя сделать легально из юзермода. Посему способ один - маршрутизация, но для не определнного кода это не может применяться. Единственный способ это отлов трапов.
Извините что вмешиваюсь в вашу беседу... dev001 Вы хочите делать вместо (допустим): mov al,byte ptr ds:[401020h] ; VA of some code/etc for PE UserMode 32 Примерно: mov al,byte ptr ds:[557A1020h] ; VA" of some code/etc for PE UserMode 32 - the same memory, valid? (DS is not as DS from first example) Навскидку не помню какая именно, но должна быть API (работает) которая действительно позволяет создавать новый локальный селектор (что впрочем уже было сказано выше). Если нужно, могу посмотреть хотя гуглить типа "LDS" "New local selector" "windows" .... should help.
Без восстановления прежнего, скажем ds довольно проблематично скажем так будет вам вызывать апи-функции ибо их кодес нихрена не знает о том что селектор в сегментном регистре указывает не на нулевое смещение от которого высчитываеца адрес, а стало быть адреса формирующиеса будут указывать куда то в жёппу. Автор той стотьи что вы тут прочитале говорит (как вы тоже прочитале, я думаю) что канешна можно по релокам пересчитать смещения базозависимых мест кода во всех загруженных модулях, но эт палюбас не единственное что придется сделать. И что то мне подсказывает что получится как всегда хунта какаянить