1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

ntdll для подгрузки

Тема в разделе "WASM.WIN32", создана пользователем sn0w, 25 июл 2019.

  1. sn0w

    sn0w Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    668
    тащемта не стал ходить лесом а смапил нтдлл в процесс, затем перекопировал и ребазировал, всякие прямые стабы работают оккей, но вот с ЛДР уже траблы, споткнулся на первой же:
    ntdll!_LdrpResolveDllName
    ...
    .text:6B2D5EF5 mov eax, _NtdllBaseTag
    .text:6B2D5EFA push edi ; Size
    .text:6B2D5EFB add eax, 40000h
    .text:6B2D5F00 push eax ; Flags
    .text:6B2D5F01 push _LdrpHeap ; ; HeapHandle -- uninitialized after raw copy section
    .text:6B2D5F07 call _RtlAllocateHeap@12 ; RtlAllocateHeap(x,x,x)

    тут вроде пофиксил - нужен хендл был кучи, пофиксил, но опять

    ntdll!RtlpLowFragHeapAllocFromContext+0x20e:
    77ec34f4 f646073f test byte ptr [esi+7],3Fh
    пока не вкуривал, ибо в говно - может есть у кого уже наработки, или проясните что я делаю не так?

    это всё касаемо LdrLoadDll
     
  2. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    2.602
    sn0w,

    Логгер включи и не дури мозги. GlobalFlag\ShowSnaps.

    Если косяк с хипом, то для этого есть целый набор системных тулз и механизмов, тогда включается страничная аллокация(PH), на каждом действии с кучей логгер, для этого есть набор штатных тулз. А есчо есть слой верификации. Кури матчасть.
     
    Последнее редактирование: 1 авг 2019
  3. sn0w

    sn0w Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    668
    это я уже курнул, мне надо шобы нтлоадер отрабатывал корректно, насчёт хипа и так понятно, просто я к тому что может ктото тоже такое делал и есть костыли об которые спотыкались
     
  4. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    2.602
    sn0w,

    Вы задачу не описали, только "смапил нтдлл в процесс, затем перекопировал и ребазировал". Когда смапил, что копировал и зачем релоцировал хз, откуда же мне знать. Нужно нормально описывать задачу, если конкретный ответ нужен.

    ntdll не релоцируется, так как там глобальные в системе указатели по фикс. адресам. Это значит что этот модуль релоцировать не нужно, если замапить на другую базу, то адресация останется исходного модуля.

    > LdrpHeap ; ; HeapHandle -- uninitialized after raw copy section

    Что это значит тоже не известно. Пусть потоки не стартовали, не прошла инициализация загрузчика. Но причём там копии проекции тоже хз.

    Опиши норм что делаешь и задачу, иначе это бессмысленный отрывок потока мыслей ваших.
     
  5. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    546
    Адрес:
    подполье
    Действительно, снег, ты не говори чо ты делаешь (в этих словах совсем потеряно, что именно хочешь добиться), скажи что хочешь сделать от ... и ... до, включительно;)
     
  6. sn0w

    sn0w Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    668
    ок)
    возможно что разные экспорты нтдлл похуканы и периодически чекаются сторонними процессами, поэтому мне нужно просто сделать её дубль в этом ап чтобы не пилить оверхеда + пользоваться той же LdrLoadDll. для этого я решил смапить секцию, релоцировать и инициализировать вручную.
    надо чтобы LdrLoadDll корректно отрабатывала в этой новой памяти
     
  7. hiddy

    hiddy New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2019
    Сообщения:
    27
  8. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    2.602
    sn0w,

    Так наоборот ведь, релоцировать не нужно. Если ты релочил, то у тебя модуль окажется не инициализированным, отсюда видимо и ошибки. Без какого либо понятия решил релоцировать :punish:

    Нэйтив никогда не релоцируется, его база фиксед. Если спроецировать на другую базу, то адресация из копии останется в базовую проекцию. Если не понятно, то вот на цифрах:

    7C97B178: _LdrpLoaderLock 7C97B1A0 ntdll._LoaderLockDebug

    Отображаем на другую базу, получится:

    (7C97B178 - 7C900000 + NEWBASE): _LdrpLoaderLock 7C97B1A0 ntdll._LoaderLockDebug

    Релок по 7C97B178 оригинальный и указатель тот же самый.

    7C916633: push offset _LdrpLoaderLock(7C97B178)

    - Адресация в оригинальной проекции.

    (7C916633 - 7C900000 + NEWBASE): push offset _LdrpLoaderLock(7C97B178)

    - Адресация в копии.

    Тоесть все указатели останутся в оригинальную проекцию. Как частный случай останется адресация колбеков, тоесть обратный вызов будет происходить в оригинальную проекцию, тоесть управление выйдет из копии. Что бы это зафиксить необходимо релоцировать ссылки в кодовую секцию(там константы/процедуры).

    Так как адресация переменных абсолютная, а за пределы кодовой секции нет релатив ветвлений, то кодовая секция может перемещаться как строка в памяти. Так например восстанавливал кодовую секцию загрузчик из памяти(lwe).

    > инициализировать вручную.

    Повторную инициализацию нэйтив выполнить не получится. Трабла с серверным соеденением(csrss), подробности я давно на exploit.in описывал, там можно глянуть, если он есчо существует.
     
  9. sn0w

    sn0w Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    668
    блин, да я не совсем идиот в отношении релокаций и статических символов, так вот что к чему подсоединить или пересоздать - вот в чём вопрос
     
  10. OverNight

    OverNight New Member

    Публикаций:
    0
    Регистрация:
    Вчера
    Сообщения:
    1
    не с той стороны зашел. находишь и сохраняешь нужный экспорт в загруженной нтдлл. мапишь нтдлл в память. восстанавливаешь из нее нужный экспорт в загруженную. пользуешься. возвращаешь обратно как было.
     
  11. sn0w

    sn0w Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    668
    я же говорю что в .data там есть неинициализированные поинтеры, такие как ntdll!LdrpHeap, без которого не работает ничего кроме syscall стабов например, то что они не экспортируются - другое дело - но на это просто символьный подгруз можно запилить.