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

Перехваты импорта через ядро

Тема в разделе "WASM.NT.KERNEL", создана пользователем ntcdm, 13 сен 2010.

  1. Bazhan

    Bazhan Андрей

    Публикаций:
    0
    Регистрация:
    8 янв 2008
    Сообщения:
    71
    Адрес:
    Украина
    ntcdm
    >>Почему же у меня меняется эта ДЛЛ-ка в других процессах.

    потому что сброс бита write protect в CR0 позволяет писать(из kernelmode) в страницы только для чтения без возникновения исключения и вызова MmAccessFault->MiCopyOnWrite, к тому же для секций c атрибутами READ EXECUTE механизм copy on write не работает без (usermode) VirtualProtect(с флагом PAGE_WRITECOPY) или (kernelmode) установки 9 бита(CopyOnWrite) в PTE

    >>Какие будут предложения чтобы исправить?

    1.Этот код убираем

    __asm{
    mov eax,CR0
    mov CR0Reg,eax
    and eax,0FFFEFFFFh
    mov CR0,eax
    }

    __asm
    {
    mov eax,CR0Reg
    mov CR0,eax
    }

    2. читаем данные по виртуальному адресу для того чтобы сделать PTE валидным
    3. устанавливаем 9 бит(CopyOnWrite) в PTE
    4. пишем по виртуальному адресу
     
  2. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Bazhan
    Спасибо за подсказку! Наконецто я смогу решить эту проблему.

    Может быть подскажете как мне усстановить 9 бит(CopyOnWrite) в PTE?
    Мне потом этот код надо будет портировать на х64 еще.
     
  3. Bazhan

    Bazhan Андрей

    Публикаций:
    0
    Регистрация:
    8 янв 2008
    Сообщения:
    71
    Адрес:
    Украина
    x86 PTE_BASE = 0xc0000000
    x64 PTE_BASE = 0xFFFFF68000000000UI64

    pPTE = MiGetPteAddress(va) ((PMMPTE)(((((ULONG)(va)) >> 12) << 2) + PTE_BASE))
    pte = *pPTE
    pte = pte | 0x200
    *pPTE = pte
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Bazhan
    Мы рады что у вас есть сурцы венды и знаете как качать пдб, но это бред полнейший. Память разделяема если физическая страница отображена на разные PTE. Это shared-pte механизм. И абсолютно никакого значения не имеют атрибуты доступа к сегментам.
     
  5. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Пробовал вызвать ZwProtectVirtualMemory с изменением NewProtect=PAGE_WRITECOPY, а он дедлочится (там какой-то есть лок который, захватывая функции ZwProtectVirtualMemory и MmMapLockedPagesSpecifyCache лочатся).
     
  6. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    попробовал следующий кодес:
    Код (Text):
    1. ULONG uOld = pdwAddressOfFunctions[funcIndex];
    2.  
    3.  
    4. PMMPTE pPTE = MiGetPteAddress(&pdwAddressOfFunctions[funcIndex]);
    5. MMPTE pte = *pPTE;
    6. pte.u |= 0x200;
    7. *pPTE = pte;
    8.  
    9. pdwAddressOfFunctions[funcIndex] = (PBYTE)g_pVirtualMemory+4 - (PBYTE)dosHeader;
    на последней строчке получаю Access Violation
    Код (Text):
    1. kd> .exr -1
    2. ExceptionAddress: 88f67a47
    3.    ExceptionCode: c0000005 (Access violation)
    4.   ExceptionFlags: 00000000
    5. NumberParameters: 2
    6.    Parameter[0]: 00000001
    7.    Parameter[1]: 77113428
    8. Attempt to write to address 77113428
    Кстати пробовал я и так как Клерк спрашивал - просто ручками в дебуггере поменял адрес.
    Код (Text):
    1. kd> r ecx
    2. ecx=89420004
    3. kd> ed 76c13428
    4. 76c13428 00009790 89420004
    5. 89420004
    6. 76c1342c 00025f85
    7.  
    8. kd> dd 76c13428
    9. 76c13428  89420004 00025f85 00017551 00069239
    10. 76c13438  0002608f 0001c5b9 000765f5 000787c3
    11. 76c13448  000756ef 00078d04 00078931 00075717
    12. 76c13458  0000d3e6 00069380 00065cfb 0000c070
    13. 76c13468  00023305 0000b10d 0001a4f1 0005555f
    14. 76c13478  00026e17 000768c1 0006aa49 00078ea1
    15. 76c13488  00015286 00078ece 0002823c 00028aea
    16. 76c13498  00030c55 0001d354 000251da 00028ac0
    Все равно экспорт меняется и в других процессах, например внутри lsm.exe:
    Код (Text):
    1. Breakpoint 2 hit
    2. 001b:00030004 2000            and     byte ptr [eax],al
    3. kd> u eip
    4. 00030004 2000            and     byte ptr [eax],al
    5. 00030006 0000            add     byte ptr [eax],al
    6. 00030008 0100            add     dword ptr [eax],eax
    7. 0003000a 0000            add     byte ptr [eax],al
    8. 0003000c 2030            and     byte ptr [eax],dh
    9. 0003000e 0000            add     byte ptr [eax],al
    10. 00030010 dc00            fadd    qword ptr [eax]
    11. 00030012 0000            add     byte ptr [eax],al
    Какие еще будут предложения?
     
  7. Clerk

    Clerk Забанен

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

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    отладчик обычный WinDbg, подключенный через IEEE1394.

    Я вот тут подумал что мой нотификатор же вызывается из MiMapViewOfImageSection. Может быть к моменту вызова еще не все атрибуты защиты страниц выставлены как надо в процессе?
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Обычно секция проецируется два раза, первый раз она не образ. Это происходит в LdrpCheckForLoadedDll(), потом данные в проекциях сравниваются. При этом если из ядра записать в проекцию, то это повлияет на проекцию в другом процессе, но только на туже. Вот только ядро выполняет нотификацию только для образов(SEC_IMAGE), иначе нотификатор не вызывается, поэтому это не то.
    Нотифи вызывается в конце работы MiMapViewOfImageSection(). Страницы сразу мапятся с возможностью записи в них.

    Попробуйте из юзермода сделать тоже из другого отладчика.
     
  10. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    939
    ntcdm

    А нельзя ли посмотреть какой физический адрес у всех этих msvcrt.dll в РАЗНЫХ процессах?
     
  11. Bazhan

    Bazhan Андрей

    Публикаций:
    0
    Регистрация:
    8 янв 2008
    Сообщения:
    71
    Адрес:
    Украина
    ntcdm
    теоретическая часть:
    Intel Manual Volume 3A part 1 PROTECTION->PAGE-LEVEL PROTECTION
    и в атаче практическая
     
  12. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Только добрался до тестов предложенного кода.

    Работает, никаких падений, все четко патчится!

    Спасибо огромное, Bazhan