Чтение памяти загруженного модуля ядра

Тема в разделе "WASM.NT.KERNEL", создана пользователем Leksey, 7 апр 2007.

  1. Leksey

    Leksey New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2006
    Сообщения:
    33
    Из драйвера нужно прочитать память ntoskrnl.exe и сделать ее копию.
    С помощью ZwQueryInformation я нашел адрес по которому он загружен и его размер.
    При попытке простого чтения памяти получаю BSOD - PAGE FAULT.
    Пытаюсь создать MDL:
    mdl = IoAllocateMdl(ntoskrnlInfo->imageBase, ntoskrnlInfo->size, FALSE, TRUE, NULL);
    MmProbeAndLockPages(mdl,UserMode,IoReadAccess);

    на этой функции получаю exception 0xc0000005(Acess Violation ??? )

    все это делаеться в DriverEntry, память для копии выделяю ExAllocatePool(NonPagedPool,modInfo->size);

    В чем может быть ошибка?

    p.S. в контексте какого процесса выполняеться DriverEntry?
    Если я создам буфер ExAllocom в DriverEntry , а обращаться к нему буду из системного потока, созданного PsCreateSystemThread - все будет нормально?
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Leksey
    Во первых:
    IoAllocateMdl(... FALSE, FALSE,NULL);
    Проверка вызвращаемого значения!!!
    Далее MmProbeAndLockPages(mdl,KernelMode,IoReadAccess);
    И эта процедура должна быть заключена в SEH фрейм
    И далее надо промапить память!
    RetAddr = MmMapLockedPages(mdl,KernelMode);
    Далее можно обращаться к RetAddr (не забываем проверить на ошибку)

    На счет ntoskrnl.exe не уверен, не проверял. Но должно работать.
    DriverEntry в контексте системы вызывается.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    IoAllocateMdl просто так ноль обычно не возвращает) по крайней мере мне не разу не удавалось увидеть, чтобы создание MDL провалилось. хотя проверки я всегда ставлю)

    вообщем
    Код (Text):
    1.     __try
    2.     {
    3.         Mdl = IoAllocateMdl(
    4.             Buffer,
    5.             BufferSize,
    6.             FALSE,
    7.             FALSE,
    8.             NULL
    9.             );
    10.         if( !Mdl ) __leave;
    11.  
    12.         MmProbeAndLockPages( Mdl, KernelMode, IoReadAccess );
    13.  
    14.         MappedBuffer = MmMapLockedPagesSpecifyCache(
    15.             Mdl,
    16.             KernelMode,
    17.             MmCached,
    18.             NULL,
    19.             FALSE,
    20.             NormalPagePriority
    21.             );
    22.  
    23.         if( !MappedBuffer ) __leave;
    24.     }
    25.     __except( EXCEPTION_EXECUTE_HANDLER )
    26.     {
    27.         ....
    28.     }
     
  4. Leksey

    Leksey New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2006
    Сообщения:
    33
    проверка возвращаемых значений, и SEH фрейм вокруг MmProbeAndLockPages у меня есть, просто не запостил, чтобы не загромождать пост... Вот переписал на такой вариант:
    Код (Text):
    1.     PMDL mdl = NULL;
    2.     bool result = true;
    3.     byte* buffer = 0;
    4.     mdl = IoAllocateMdl(ntoskrnlInfo->imageBase, ntoskrnlInfo->size,  FALSE, FALSE, NULL);
    5.     if(!mdl) return false;
    6.     try
    7.     {
    8.         MmProbeAndLockPages(mdl,KernelMode,IoReadAccess);
    9.     }
    10.     except(EXCEPTION_EXECUTE_HANDLER)
    11.     {
    12.         DbgPrint( "Exception while locking buf 0X%08X\n", GetExceptionCode());
    13.         result = false;
    14.     }
    15.     if (result)
    16.     {
    17.         buffer = MmGetSystemAddressForMdlSafe(mdl, NormalPagePriority );
    18. //В буфере по идее должно быть то что надо....
    19.          }
    В результате BSod.... Правда не успеваю посмотреть какой- VMWare почему то сразу
    перегружаеться:dntknw:
    При чем пробовал закоменитть все после try/except и все равно BSOD.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    уверен, что указатель ntoskrnlInfo верен?
     
  6. Leksey

    Leksey New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2006
    Сообщения:
    33
    Похоже на правду:
    Ntoskrnl.exe Image Address = 804D7000 Size = 2182784
    При появлении BSOD пишет Page Fault in Non Paged Area.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ты хоть крешдамп смотрел?
    !analyze -v и сюда
     
  8. Leksey

    Leksey New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2006
    Сообщения:
    33
    Конечно не смотрел, я же beginner....
    Вот теперь посмотрел:

    PAGE_FAULT_IN_NONPAGED_AREA (50)
    Invalid system memory was referenced. This cannot be protected by try-except,
    it must be protected by a Probe. Typically the address is just plain bad or it
    is pointing at freed memory.
    Arguments:
    Arg1: 8066b000, memory referenced.
    Arg2: 00000000, value 0 = read operation, 1 = write operation.
    Arg3: 804f5906, If non-zero, the instruction address which referenced the bad memory
    address.
    Arg4: 00000000, (reserved)

    READ_ADDRESS: 8066b000

    FAULTING_IP:
    nt!MmProbeAndLockPages+f1

    Там еще всего много... но думаю это не так важно.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    не, важно)
    покажи стек вызовов.

    кстати, ты собрался мапировать все ядро целиком?
     
  10. Leksey

    Leksey New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2006
    Сообщения:
    33
    Мне нужна полная и точная копия ntoskrnl загруженного в память.
    Вот собственно стек вызовов:
    LAST_CONTROL_TRANSFER: from 805328e7 to 804e3b25

    STACK_TEXT:
    fa2fe62c 805328e7 00000003 8066b000 00000000 nt!RtlpBreakWithStatusInstruction
    fa2fe678 805333be 00000003 806ee298 c02019ac nt!KiBugCheckDebugBreak+0x19
    fa2fea58 805339ae 00000050 8066b000 00000000 nt!KeBugCheck2+0x574
    fa2fea78 805246fb 00000050 8066b000 00000000 nt!KeBugCheckEx+0x1b
    fa2feac4 804e1ff1 00000000 8066b000 00000000 nt!MmAccessFault+0x6f5
    fa2feac4 804f5906 00000000 8066b000 00000000 nt!KiTrap0E+0xcc
    fa2febd4 fa4e7993 811702a0 00000000 00000000 nt!MmProbeAndLockPages+0xf1
    fa2fec1c fa4e77d0 fa2fec4c fa2fec3c ffb0cd48 thHide!CreateModuleImageCopy+0x83 [g:\drivers\kernelmodule.c @ 59]
    fa2fec7c 805a69d3 ffb0cd48 ffa5a000 00000000 thHide!DriverEntry+0x130 [g:\drivers\driver.c @ 186]
    fa2fed4c 805a6ca8 000007d4 00000001 00000000 nt!IopLoadDriver+0x66c
    fa2fed74 804e47fe 000007d4 00000000 8131b020 nt!IopLoadUnloadDriver+0x45
    fa2fedac 8057dfed fa386cf4 00000000 00000000 nt!ExpWorkerThread+0x100
    fa2feddc 804fa477 804e4729 00000001 00000000 nt!PspSystemThreadStartup+0x34
    00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    строка 59 насколько я понимаю это
    Код (Text):
    1. MmProbeAndLockPages(mdl,KernelMode,IoReadAccess);
    ?
    хм...
     
  12. Leksey

    Leksey New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2006
    Сообщения:
    33
    Да, именно она....
    Старнно получаеться - ядро может быть загружено не непрерывным куском памяти?
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Leksey
    ну вообще может, между секциями может быть промежуток свободной памяти
     
  14. Leksey

    Leksey New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2006
    Сообщения:
    33
    Ну вот :dntknw: Придеться похоже с диска читать.
    Great большое спасибо за то что помог разобраться, к сожалению ничего кроме спасибо предложить не могу :dntknw:
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    хм я вообще начал сомневаться в том, что я тока что сказал =)
    у меня не вышло создать pe'шник, чтобы секции в памяти располагались вокруг невыделенного промежутка... Exeшник просто отказывался грузиться, мол, someshit.exe is not a valid Win32 application =\

    хотя по логике вещей наверное секции могут так располагаться. короче хз)
     
  16. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    промежутков между секциями быть не должно.. хотя хз, относится ли это к ntoskrnl
    а так вообще часть страниц может быть выгружена принудительно, тем более сегменты .reloc И INIT
    во-вторых, я может и ошибаюсь, но MmProbeAndLockPages, у которой второй параметр UserMode, всегда вернет access violation для mdl, выделенных в памяти ядра. разве нет?
    а если указать kernel mode, и эта память не будет доступна, bsod'а не избежать все равно..
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    там уже KernelMode =)
    а как тогда проверять то =)
    а поскольку они в области Non-paged, будет бсод сразу.. page fault in non paged area.. скорее всего это и есть причина
     
  18. Leksey

    Leksey New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2006
    Сообщения:
    33
    получаеться нельзя скопировать загруженное ядро целиком?
     
  19. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Leksey
    Хм, яб посмотрел что сайс пишет. Попробуй сайсом поковырять, если память доступна, то какие регионы...
    И из этого можно уже драйвер замутить попробовать.
    А еще попробуй ради интереса вызвать MmBuildMdlForNonPagedPool. до того как MmProbeAndLockPages вызовешь
     
  20. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    тогда MmProbeAndLockPages не нужна. MmBuildMdlForNonPagedPool и так блокирует память.
    а вообще она только для nonpaged pool. сомневаюсь, что ядро лежит в пуле неподкачиваемой памяти