Скрыть ldr

Тема в разделе "WASM.WIN32", создана пользователем Flasher, 31 мар 2009.

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Несекрет что можно скрыть ldr от любопытных tasklist'ов с помощью следующего нехитрого кода:
    Код (Text):
    1.      local Protect:ULONG,ProtectBaseAddress:PVOID,ProtectBufferLength:ULONG
    2.        assume fs:nothing
    3.        mov eax,fs:[TEB.Peb]
    4.        mov eax,PEB.Ldr[eax]
    5.        mov ProtectBaseAddress,eax
    6.        mov ProtectBufferLength,5
    7.        lea eax,Protect
    8.        push eax
    9.        push PAGE_NOACCESS
    10.        lea eax,ProtectBufferLength
    11.        push eax
    12.        lea eax,ProtectBaseAddress
    13.        push eax
    14.        push -1
    15.        call ZwProtectVirtualMemory
    Но дело в то что моей проге потом могет понадобится обращаться к ldr.
    Самый оптимальный вариант наверное хукнуть KiUserExceptionDispatcher и в своём диспетчере обработать исключение. Вот это и хочу узнать, как узнать что ислючение произашло именно в этом месте и обращение было локально ?
    Или могет есть более простые способы сокрытия ldr?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Релоад селекторов и пошаговое исполнение обратившейся к загрузчику инструкции. Память под лдр вообще освободить(очистить).
     
  3. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Не знаю что такое "Релоад селекторов" и как реализовать пошаговое исполнение.
    Нуна более доступная к простым смертным инфа :)
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Выделяем память и копируем туда весь блок данных загрузчика, создаём дескриптор в LDT, базу которого указываем равной адресу выделенной памяти под копию загрузчика. Освобождаем оригинальную память загрузчика(лучше в PEB.Ldr забить указатель, за пределами юзермодного ап), так как он в хипе, желательно не освобождать.
    При обращении к загрузчику возникнет исключение STATUS_ACCESS_VIOLATION, извлекаем адрес, к которому произошло обращение, если он не в диапазоне памяти лоадера пропускаем(Chain) исключение. Иначе вычисляем смещение в блоке лоадера, отняв от адреса к которому произошло обращение адрес блока данных лоадера. Это будет смещением в копии блока. Подменяем в контексте селектор данных(обращение черех Ds) на наш и взводим TF в флажках, после чего выполняем возврат(NtContinue). Инструкция будет выполнена есчо раз, но обращение произойдёт к нашему блоку(так как адресуется селектором). После исполнения этой инструкции возникнет трассировочное исключение, в нём нужно восстановить предыдущее значение селектора.
     
  5. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Это вить схема реализации InstallLdrProtectionDebug ?
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Нет. Там был аппаратный останов.