Сейчас на форуме: jinoweb, bartolomeo, rmn (+5 невидимых) |
eXeL@B —› Программирование —› Обработка TLS |
Посл.ответ | Сообщение |
|
Создано: 01 августа 2017 23:13 · Личное сообщение · #1 Возникли проблемы с обработкой TLS загружаемого образа. Перед обработкой TLS я проделал такие шаги: 1) Загрузил дисковый PE-образ в память 2) Выделил память в куче и спроецировал туда секции и заголовки 3) Обработал релоки и импорт Теперь надо обработать TLS, если он имеется. Я написал такой код: Code:
Пытался исправить его и написал так: Code:
Но при вычислении условия цикла программа крашится. Что у меня не так? Кроме того, я не до конца понимаю механизм работы TLS, хотя сегодня и прочитал несколько статей. В директории TLS имеется структура с указателями на данные и на массив адресов коллбэков. Коллбэки вызываются загрузчиком, а что делать с адресами данных? Где и для чего выделять память под индекс? Блок данных можно получить при помощи _readfswdord(0x2C). Что с ним делать дальше? Code:
Что копировать, откуда и куда? Непонятно. >Третье поле AddressOfIndex - это адрес, куда загрузчик запишет индекс блока данных потока Какого блока данных? Как получить его адрес? >создаваемого при запуске программы, этот индекс, соответсвенно будет равен нулю А потом как будет меняться этот индекс? >В это поле необходимо поместить адрес из секции данных Секция данных большая, какой именно адрес? >Первым делом нужно найти указатель на блок данных, чтобы скопировать реальные данные Копировать откуда и куда? >Указатель на массив адресов (адресов блоков данных) можно получить из структуры TIB Ок, получил. Что с ним делать? >но помня, что индекс первого потока равен нулю, получаем А если потоков много, кто будет именять индекс? |
|
Создано: 02 августа 2017 08:41 · Личное сообщение · #2 Почитайте инфу от разработчика сей штуки, тогда вам станет ясно что за данные и для чего. ----- Everything is relative... |
|
Создано: 02 августа 2017 12:58 · Личное сообщение · #3 Прочитал Code:
Я получил таблицу TLS-слотов из TEB и в нулевой ячейке выделил память для необходимого числа переменных. Скорее всего, я что-то сделал не так. |
|
Создано: 06 августа 2017 02:07 · Поправил: difexacaw · Личное сообщение · #4 Эта задача не может быть корректно решена. Это частный случай Run-PE через реинит процесса. Вы можите только эмулировать среду(TLS), но такая обработка не полноценна. Для норм реализации загрузчик должен быть вызван повторно, для такого вызова должны быть сброшены его переменные. И первый облом при этом происходит на установке соединения с csrss STATUS_PORT_CONNECTION_REFUSED ----- vx |
|
Создано: 06 августа 2017 22:02 · Личное сообщение · #5 >Эта задача не может быть корректно решена. Это частный случай Run-PE через реинит процесса Ты путаешь понятия. RunPE это инжект в другой процесс, иначе называется process hollowing. Я пишу код, который проецирует PE-файл на адресное пространство того же процесса. Хотя я согласен насчет того, что такой загрузчик реализуется рекурсивно: например, для того, чтобы этим же загрузчиком загрузить необходимые DLL (ведь подразумевается, что другого загрузчика нет, а DLL грузить надо). |
|
Создано: 06 августа 2017 23:14 · Личное сообщение · #6 Aoizora Нет, не путаю. Это вы не понимаете - что бы запустить полноценную обработку некоторых механизмов, нужно рестартить загрузчик. Тоесть если он уже отработал, то механизм уже не запустить или это можно сделать сложным путём, доставать интернал структуры из модуля. В случае с тлс эмулировать его видимо лучший способ. ----- vx |
|
Создано: 06 августа 2017 23:58 · Личное сообщение · #7 |
|
Создано: 07 августа 2017 03:40 · Личное сообщение · #8 Aoizora Это как вы и делаете, тоесть не система это всё обрабатывает. Я тут покопался, получается следующее. В 10-ке тлс обрабатывается при загрузке модуля LdrpSnapModule -> LdrpDoPostSnapWork -> LdrHandleTlsData, таким образом вызываются тлс колбеки при обычной загрузке, даже если exe не содержит тлс. Аналогично в 7 и 8. Это значит что если загрузчик сделан грамотно, как обёртка над системным загрузчиком, то тлс механизм поддерживается без проблем. Иначе можно попробовать вызвать принудительно загрузочные апи для обработки тлс. 9a91_07.08.2017_EXELAB.rU.tgz - Tls.zip ----- vx | Сообщение посчитали полезным: plutos |
eXeL@B —› Программирование —› Обработка TLS |