Сейчас на форуме: zds, UniSoft (+5 невидимых)

 eXeL@B —› Программирование —› Функции из ntdll для настройки статического TLS.Есть вопросы.
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 31.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 16 августа 2011 18:21 · Поправил: Yotsi
· Личное сообщение · #1

Скачал сорцы win2k,смотрю в ldrinit.c ,и меня терзает смутное ощущение что чего то нехватает...
1.Я правильно понимаю что весь апи системного загрузчика находится в ntdll ?
2.Функция LdrpInitializeProcess готовит только адресное пространство для процесса?Или еще настраивает образ экзешника этого самого будущего процесса?
3.Функции LdrpInitializeTls(для длл) и LdrpAllocateTls(для потоков процесса) выделяют память под TLS переменные в ап процесса,и копируют туда содержимое этих переменных?
4.А для чего тогда LdrpCallTlsInitializers ?
5.И мне совсе непонятно какой код приводит изначальные "адреса" TLS переменных в коде образа экзешника,к VA которые были выделенны LdrpInitializeTls и LdrpAllocateTls

ЗЫ:надеюсь найдется добрый человек который хоть частично в направлении истины направит )




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 16 августа 2011 18:33 · Поправил: PE_Kill
· Личное сообщение · #2

Yotsi пишет:
А для чего тогда LdrpCallTlsInitializers

Это по моему для дерганья TLS Callbacks.

Yotsi пишет:
И мне совсе непонятно какой код приводит изначальные "адреса" TLS переменных в коде образа экзешника,к VA которые были выделенны

Плохо смотришь. Я когда эмулировал TLS полностью весь механизм смотрел в сорсах win2k. Только там с потоками настоящая жопа, мне в итоге проще стало TLS отдать загрузчику, чем эмулировать весь процесс самому. Если приложение однопоточное, то вот такого кода будет вполне достаточно:
Code:
  1.   mov    esi, RVA_TLS
  2.   test   esi, esi
  3.   je     @process_iat
  4.   add    esi, D [esp+4]
  5.   mov    ecx, D [esi+4]      ; endofrawdata
  6.   sub    ecx, D [esi+0]      ; startofrawdata
  7.   push   ecx                      ;save size for movsb
  8.   add    ecx, 4            ; size+SizeOf(Pointer)
  9.   push   PAGE_READWRITE
  10.   push   MEM_COMMIT
  11.   push   ecx
  12.   push   0
  13.   call   @MyVirtualAlloc  
  14.   assume fs:  nothing
  15.   pop    ecx                              ; end-start
  16.   mov    edi, eax      ; pMem
  17.   scasd                                 ; mov pos of edi
  18.   mov    [eax],edi            ; save to pMem, pointer to Mem2
  19.   mov    fs:[2Ch],eax               ; TlsMem
  20.   mov    edx,[esi+8]                        ; Index
  21.   mov    dword ptr [edx],0   ; Zero index
  22.   mov    esi,[esi]            ; move start tls to mem
  23.   rep    movsb


-----
Yann Tiersen best and do not fuck




Ранг: 31.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 16 августа 2011 19:13
· Личное сообщение · #3

PE_Kill пишет:
мне в итоге проще стало TLS отдать загрузчику

Ты это сделал путем копирования TLS секции и структур содержащих инфу о инициализации тлс перменных,в образ своего загрузчика?Или манипуляциями через ntdll ?




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 16 августа 2011 20:02
· Личное сообщение · #4

Просто перенес в PE заголовок конечного файла. Ты хочешь грузить образ полностью сам? Или есть минимальный образ, который грузит винда, как в пакерах/протекторах?

-----
Yann Tiersen best and do not fuck




Ранг: 31.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 16 августа 2011 20:50 · Поправил: Yotsi
· Личное сообщение · #5

"минимальный образ" грузится по нужной базе,загружает дллку и вызывает из неё ф-цию.Которая настраивает образ нужного экзе ,пишет его поверх "минимального" и соотвественно передает управление на точку входа перезаписанного образа.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 16 августа 2011 21:26
· Личное сообщение · #6

Ну у меня было так же. К сожалению сорсов не сохранилось. Про TLS только помню, что на тот момент вариант был только хукать создание и убиение потоков. Можно конечно легко перенести TLS в новый PE заголовок минимального образа, но тебя наверное так не устроит.

-----
Yann Tiersen best and do not fuck




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 17 августа 2011 02:55 · Поправил: bowrouco
· Личное сообщение · #7

http://www.wasm.ru/forum/viewtopic.php?pid=438705#p438705

Есть семпл, но требует большого движка, посему скажу ищите по референсу на строки:

"LDR: Tls Found in %wZ at %p",LF
LdrpInitializeTls

"LDR: TlsVector %x Index %d = %x copied from %x to %x",LF
LdrpAllocateTls

"LDR: Tls Callbacks Found. Imagebase %p Tls %p CallBacks %p",LF,""
"LDR: Calling Tls Callback Imagebase %p Function %p",LF,""
LdrpCallTlsInitializers



Ранг: 31.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 17 августа 2011 18:07
· Личное сообщение · #8

А разве от этих ф-ций может быть толк,если они выполняються не загрузчиком?



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 17 августа 2011 20:12
· Личное сообщение · #9

Yotsi
А есть разница кем они исполняются ?




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 18 августа 2011 00:18
· Личное сообщение · #10

Есть. Менеджер потоков свой будете писать?

-----
Yann Tiersen best and do not fuck




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 18 августа 2011 00:33
· Личное сообщение · #11

PE_Kill
Для чего ?




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 18 августа 2011 07:31
· Личное сообщение · #12

Для подготовки TLS при создании нового потока и удаление при убиении потока. Или ты знаешь как переложить это на загрузчик винды?

-----
Yann Tiersen best and do not fuck




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 18 августа 2011 08:07
· Личное сообщение · #13

PE_Kill
Нет никаких проблем использовать нотифи, да хоть дллмейн какогонить модуля в простейшем случае, нтдлл подойдёт. После инициализации нотификаторы будут не нужны.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 18 августа 2011 08:58 · Поправил: PE_Kill
· Личное сообщение · #14

DLL main в смысле хукать битхаком? Такой вариант не подходит, ибо проблемы с AV и похожим софтом.

PS По мне так проще при заполнении IAT нового образа вписать вместо потоковых API и GetProcAddress свои обертки, но это не будет 100% работоспособность, особенно с засранчегами.

-----
Yann Tiersen best and do not fuck




Ранг: 31.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 18 августа 2011 14:15
· Личное сообщение · #15

В юзер моде нельзя ловить обращения к определенным VA в своем ап?




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 18 августа 2011 16:34
· Личное сообщение · #16

Yotsi внутри одного процесса можно.

-----
[nice coder and reverser]




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 18 августа 2011 20:23 · Поправил: Модератор
· Личное сообщение · #17

PE_Kill
> DLL main в смысле хукать битхаком? Такой вариант не подходит, ибо проблемы с AV и похожим софтом.
Не вижу проблем переписать ссылку в лдр на ентрипоинт нтдлл. Вообще в ... вас, бред какойто пишите. От модератора: вас тоже, пока на сутки, ведите себя прилично

Yotsi
Можно конечно, но это более сложно чем вбить в скрипт одно имя виньапи.)




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 19 августа 2011 09:32
· Личное сообщение · #18

bowrouco пишет:
Не вижу проблем переписать ссылку в лдр на ентрипоинт нтдлл

Ага, про это я как то подзабыл, спасибо что напомнил.

bowrouco пишет:
бред какойто пишите

Почему бред? Вроде всё логично.

Yotsi пишет:
В юзер моде нельзя ловить обращения к определенным VA в своем ап?

Механизмы: KiUserExcaptionDispatcher, Vectored Exception Handling
Методы: Hardware Breakpoints, Page Guard, Page Access

Но это дерьмовое решение.

-----
Yann Tiersen best and do not fuck




Ранг: 31.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 19 августа 2011 21:19 · Поправил: Yotsi
· Личное сообщение · #19

bowrouco пишет:
Не вижу проблем переписать ссылку в лдр на ентрипоинт нтдлл.

Менять нада в ПЕ заголовке образа нтдлл ?Я правильно понял?
Или же в своей длл на ЕП нтдлл?




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 19 августа 2011 22:35
· Личное сообщение · #20

ldr

-----
Yann Tiersen best and do not fuck




Ранг: 31.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 21 августа 2011 18:14
· Личное сообщение · #21

PE_Kill пишет:
ldr

Что имеется ввиду под этим словом??PEB_LDR_DATA ?Или нечто иное?




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 21 августа 2011 18:51
· Личное сообщение · #22

Yotsi извини писал на экранной клавиатуре. Вот код, о котором идет речь:
Code:
  1.   mov    eax, D fs:[30h]     ; TEB.PEB
  2.   mov    eax, D [eax+0Ch]    ; PEB.Ldr (vPEB_LDR_DATA)
  3.   mov    edi, [eax._PEB_LDR_DATA].InLoadOrderModuleListFlink
  4.   mov    eax, FIND_DLL_BASE ; Base of DLL
  5.   .while [edi._LDR_DATA_TABLE_ENTRY].DllBase != eax
  6.          mov edi, [edi._LDR_DATA_TABLE_ENTRY].InLoadOrderLinksFLink
  7.   .endw
  8.   mov    [edi._LDR_DATA_TABLE_ENTRY].EntryPoint, NewDllMain


-----
Yann Tiersen best and do not fuck




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 22 августа 2011 07:38 · Поправил: bowrouco
· Личное сообщение · #23

PE_Kill
LdrLockLoaderLock() + LdrFindEntryForAddress(), пишем ссылку и чистим LDR_DONT_CALL_FOR_THREADS для статически прилинкованных модулей.



Ранг: 31.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 22 августа 2011 10:23
· Личное сообщение · #24

Это нормально когда на 7ке у ntdll точка входа 0 ?



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 22 августа 2011 18:17
· Личное сообщение · #25

Yotsi
Нет, это проблемы у вас в коде.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 22 августа 2011 18:37 · Поправил: PE_Kill
· Личное сообщение · #26

bowrouco пишет:
LdrLockLoaderLock

ИМХО если мы не инжектимся, а получаем управление от загрузчика, то зачем лочить?

bowrouco пишет:
чистим LDR_DONT_CALL_FOR_THREADS для статически прилинкованных модулей

Это для чего, есть теория?

-----
Yann Tiersen best and do not fuck




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 22 августа 2011 18:50 · Поправил: bowrouco
· Личное сообщение · #27

PE_Kill
> ИМХО если мы не инжектимся, а получаем управление от загрузчика, то зачем лочить?
Всякая операция с загрузчиком должна быть атомарной, иначе пока один тред там чтото изменяет, другой тоже изменяет или читает, что в конце концов приведёт к не определённым последствиям.

> Это для чего, есть теория?
Для динамически подключаемых модулей может быть запрещена нотификация(LdrDisableThreadsLibraryCalls(), тоесть взведён этот флаг). Так как линк переписывается(у вас в семпле произвольны адрес), то следует разрешить её доставку.

Хотите узнать больше - rootkits.su




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 22 августа 2011 19:18
· Личное сообщение · #28

bowrouco пишет:
Хотите узнать больше - rootkits.su

Да не, мне так по скольку по скольку, по мере надобности. Кстати что то там как то тухло, твой что ли? Домен 3 августа пореган.

-----
Yann Tiersen best and do not fuck




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 22 августа 2011 20:58
· Личное сообщение · #29

PE_Kill
Ага



Ранг: 31.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 22 августа 2011 21:42 · Поправил: Yotsi
· Личное сообщение · #30

bowrouco пишет:
Нет, это проблемы у вас в коде.

Открывал в LordPE,там то же 0 =/ Мог ли RemoveWAT пропатчить дллку???


. 1 . 2 . >>
 eXeL@B —› Программирование —› Функции из ntdll для настройки статического TLS.Есть вопросы.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати