Сейчас на форуме: UniSoft, laslo, bartolomeo (+5 невидимых) |
eXeL@B —› Программирование —› Подменить TEB для потока |
Посл.ответ | Сообщение |
|
Создано: 14 октября 2011 17:40 · Личное сообщение · #1 |
|
Создано: 14 октября 2011 17:56 · Личное сообщение · #2 |
|
Создано: 14 октября 2011 19:42 · Личное сообщение · #3 Archer пишет: Вообще было бы неплохо написать, зачем это нужно. Возможно, задачу решить можно и по-другому. Пытаюсь получить доступ к полностью инициализированному TEB потока,до того как поток начал выполняться.На уровне ZwResumeThread к сожалению всякие там PVOID ведут во всякие места со свойствами страниц PAGE_NOACCESS |
|
Создано: 15 октября 2011 12:46 · Личное сообщение · #4 Yotsi Если поток юзермодный, и был создан вполне стандартно (вызовом CreateThread), то (для ХР) NtCreateThread создаёт этот поток с флагом CREATE_SUSPENDED: Code:
где чуть выше: Code:
Чуть дальше выполняется NtResumeThread, которая и стартует поток. Она принимает аж целых два параметра, и среди них нет ничего, ведущего в ТEB. Code:
О каких PVOID вы говорите? ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 15 октября 2011 16:58 · Личное сообщение · #5 |
|
Создано: 15 октября 2011 17:28 · Личное сообщение · #6 |
|
Создано: 15 октября 2011 23:38 · Поправил: thoufrou · Личное сообщение · #7 Что такое теб - это сегмент. Соответственно он адресуется селектором Fs. Далее что такое подменить - установить новый сегмент или изменить данные в текущем. Он R/W. Изменить адрес можно поменяв его в обьекте(ETHREAD). Либо создав новый сегмент, селектор для него в LDT и установить барьеры в виде нотификаций, которые будут загружать необходимый селектор в Fs. Вот только зачем это нужно ? > Пытаюсь получить доступ к полностью инициализированному TEB потока,до того как поток начал выполняться. Это вырожение само себе противоречит. Инициализация закончится, когда поток покинет загрузчик. До этого времени инициализация выполняется(LdrpInLdrInit = TRUE). ТС криптор кодит: > Сплайсинг RtlCreateUserThread > Функции из ntdll для настройки статического TLS.Есть вопросы. > Отрезать секцию релоков PE файла Нотифи на треды ставится следующими путями: 1. Dll-нотификация("DLLMain"). 2. Синхронизация на куках, кс(LdrpLoaderLock) etc. 3. IDP. ARCHANGEL > xor edi, edi > inc edi Хороший, годный ресерч |
|
Создано: 16 октября 2011 17:29 · Поправил: Smon · Личное сообщение · #8 Да в целом и для криптора эти вещи не особо нужны, есть и множество альтернативных вариантов для реализации неприятного для реверсеров функционала. Скорее человек озадачен практическим применением не самого оптимального варианта реализации какой-то из своих идей ----- "Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels |
|
Создано: 16 октября 2011 18:22 · Личное сообщение · #9 Спасибо что подсказали что это ложный путь.Теперь вопрос - если в NtCreateThreadEx передаются адрес ф-ции потока,и адрес передоваемой в неё переменной.То где эти адреса искать в случае с NtCreateThread ? ЗЫ: Если в случае сплайсинга NtCreateThreadEx ,не вызвать оригинал ф-ции а юзнуть CreateThread ,записать в ThreadHandle то что вернет CreateThread,и вернуть 0.То такой поток будет для системы полноценным?Или нарушится какая то важная цепочка в инициализации потока? |
|
Создано: 16 октября 2011 19:20 · Личное сообщение · #10 Yotsi пишет: Если в случае сплайсинга NtCreateThreadEx ,не вызвать оригинал ф-ции а юзнуть CreateThread И получишь рекурсию. | Сообщение посчитали полезным: PE_Kill |
|
Создано: 16 октября 2011 19:55 · Поправил: thoufrou · Личное сообщение · #11 |
|
Создано: 16 октября 2011 22:41 · Личное сообщение · #12 Yotsi пишет: Теперь вопрос - если в NtCreateThreadEx передаются адрес ф-ции потока,и адрес передоваемой в неё переменной.То где эти адреса искать в случае с NtCreateThread ? Вообще нихрена не хотите дизассемблировать, да? thoufrou Что, не могли не делю подождать, пока из бана выйдете? ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 26 октября 2011 16:27 · Поправил: Yotsi · Личное сообщение · #13 Вот такая вот схема
нормально работает для потока созданного через CreateThread.Что в принципе и неудивительно.Но вот с CRT обертками непонятная для меня проблема.Ведь если _beginthread и _beginthreadex внутри себя всеравно используют CreateThread,то получаетсчя что при правильно прототипе ф-ции все должно быть ОК.Но при typedef void (WINAPI *TrhRoutine)(LPVOID lParam); поточная ф-ция _beginthread после завершения своей работы вызывает исключение - на тему того что какой то адрес памяти нельзя прочитать.Неужели это проблема из за CRT ?? |
|
Создано: 27 октября 2011 12:55 · Личное сообщение · #14 |
|
Создано: 27 октября 2011 14:34 · Личное сообщение · #15 |
|
Создано: 27 октября 2011 15:05 · Личное сообщение · #16 |
|
Создано: 27 октября 2011 15:26 · Поправил: Yotsi · Личное сообщение · #17 тестовое приложение простейшее,непонимаю как может произойти проблема с синхронизацией Code:
Да и соглашение __stdcall ничего неизменило( ЗЫ:как в ольке можно проверить "правильность" стека? |
|
Создано: 28 октября 2011 20:43 · Поправил: Yotsi · Личное сообщение · #18 |
eXeL@B —› Программирование —› Подменить TEB для потока |