Сбросс WP бита под XP

Тема в разделе "WASM.NT.KERNEL", создана пользователем sasha_s, 4 дек 2006.

  1. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    пишу драйверок, в котром хукаю пару функций.
    так вот хукаю так:

    cli;
    mov eax, cr0;
    and eax, 0xFFFEFFFF;
    mov cr0, eax;

    Дизассемблирую код и заменяю первые иснрукции на JMP на мой враппер.

    mov eax, cr0;
    or eax, 0x00010000;
    mov cr0, eax;
    sti;

    Сама проблема: под 2к все пашет, ф-ции хукаются и никаких траблов. А вот под XP синий BSOD, естествено валится в том месте где я меняю код (JMP вставляю).

    ДЕТАЛИ: Система не многопроцессорная, проц без гиперсрединга. Прежде чем вставить JMP я дезассемблирую код. Дизассемблер тоже проверенный, правда под ЮзерМодом, да и в ядре под 2к ведь все работает.

    В чем ньюансы? Спецы откликнетесь...
     
  2. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    а что на бсоде пишет?
     
  3. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Врядли это как-то прояснит ситацию... Вот что пишет:

    DRIVER_IRQL_NOT_LESS_OR_EQUAL

    далее "если это в первый раз, то... БЛА-БЛА-БЛА..."

    и

    Technical information:

    *** STOP: 0x000000D1 (0x804DCFA8,0x000000FF,0x00000001,0xF88C43DA)

    далее тычет на мой драйверок и т.д.
     
  4. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    >> or eax, 0x00010000;

    нужно не установить а восстановить бит
     
  5. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    согласен, ошибка... :)

    но до этого даже не доходит, а падает на записи в шапку ф-ции
     
  6. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Возможно, страница находится в подкачиваемой памяти. Посмотри в отладчике ее PTE перед модификацией
     
  7. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    плиз про РТЕ попобробнее...
    вкратце что такое и где почитать...
     
  8. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    если находится в подкачиваемой памяти, то что делать? как ее обратно вернуть? :)
     
  9. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    >> если находится в подкачиваемой памяти, то что делать? как ее обратно вернуть? :)

    может я неправильно представляю как это работает, но вроде как будет достаточно убрать cli/sti (т.е. не отрубать прерывания) тогда если страница будет находится в фацле подкачки, система сама её оттуда вернёт)
    хотя, хз, это вроде тоже не есть гуд, т.к. операция по установке хука должна быть неразрывной
     
  10. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    ИМХО только если IRQL<=DL
     
  11. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Не помогло... По КрэшДампу шапка стека такая:

    KeBugCheckEx
    MmAccessFault
    KiTrap0E
    тут вызывается попытка записи...
     
  12. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Ставь бряк на место изменения кода. Дальше
    В WinDbg:
    !pte <адрес_перехватываемой_функции>

    В SoftIce тоже типа того что-то. И результаты в студию на обсуждение :)
     
  13. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    вот что выдало в WinDbg с открытым КрэшДампом:

    !pte ZwCreateFile
    VA 7c90d682
    PDE at C03007C8 PTE at C01F2434
    contains 00449067 contains 02DAE025
    pfn 449 ---DA--UWEV pfn 2dae ----A--UREV

    с СофтАйсом сча попытаюсь в реалтайме...
     
  14. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    я в непонятках...
    после установки СофтАйса ПЕРЕСТАЛО ПАДАТЬ...
    сам код я не менял.
    поди пойми что было...
     
  15. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    PTE правильный.
    Включай SoftIce в дистрибутив :)
     
  16. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    >> Включай SoftIce в дистрибутив :)
    ага, особенно если это трой/руткит))
     
  17. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Да не руткит это и не троян, а наоборот могет служить средством выявления таких зверей...

    Но тем не менее вопросс остается открытым!
    Я это все тещу на виртуалке VMware 5.5, OS Windows XP Prof. Version 2002 SP2.
    Вот восстановил снапшот без айса -- падает! Поставил айс -- не падает! На 2к -- не падает...
    Я в ауте...
    Мот кто-нидь с таким встречался????
     
  18. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    0x804DCFA8 - адрес функции, которую хукаешь?
    Запости краш-дамп от !analyze -v

    Кстати только что заметил:
    !pte ZwCreateFile
    VA 7c90d682 <----- это адрес из ntdll.dll, а не из ядра
     
  19. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    вот:
    kd> !analyze -v
    *******************************************************************************
    * *
    * Bugcheck Analysis *
    * *
    *******************************************************************************

    ATTEMPTED_WRITE_TO_READONLY_MEMORY (be)
    An attempt was made to write to readonly memory. The guilty driver is on the
    stack trace (and is typically the current instruction pointer).
    When possible, the guilty driver's name (Unicode string) is printed on
    the bugcheck screen and saved in KiBugCheckDriver.
    Arguments:
    Arg1: 804dcfa8, Virtual address for the attempted write.
    Arg2: 004dc121, PTE contents.
    Arg3: f9085b60, (reserved)
    Arg4: 0000000b, (reserved)

    Debugging Details:
    ------------------


    DEFAULT_BUCKET_ID: DRIVER_FAULT

    BUGCHECK_STR: 0xBE

    LAST_CONTROL_TRANSFER: from f8938aa9 to f8938346

    TRAP_FRAME: f9085b60 -- (.trap fffffffff9085b60)
    ErrCode = 00000003
    eax=804dcfa8 ebx=81224178 ecx=000000b8 edx=80010031 esi=ffb15348 edi=811bb230
    eip=f8938346 esp=f9085bd4 ebp=f9085bec iopl=0 nv up ei pl nz na pe nc
    cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00010202
    hooknt!hook_all+0x2c:
    f8938346 8808 mov [eax],cl ds:0023:804dcfa8=b8
    Resetting default scope

    STACK_TEXT:
    f9085bec f8938aa9 00222409 0000000e 00000000 hooknt!hook_all+0x2c [D:\Work\KrnlHook\hooknt\hookfunc.c @ 146]
    f9085c34 804e3d77 8121f030 81224178 806ee2d0 hooknt!DriverDispatch+0x130 [D:\Work\KrnlHook\hooknt\hooknt.c @ 147]
    f9085c44 8056a9ab 812241e8 8121cd50 81224178 nt!IopfCallDriver+0x31
    f9085c58 8057d9f7 8121f030 81224178 8121cd50 nt!IopSynchronousServiceTail+0x60
    f9085d00 8057fbfa 000007bc 00000000 00000000 nt!IopXxxControlFile+0x611
    f9085d34 804df06b 000007bc 00000000 00000000 nt!NtDeviceIoControlFile+0x2a
    f9085d34 7c90eb94 000007bc 00000000 00000000 nt!KiFastCallEntry+0xf8
    0012fcb8 7c90d8ef 7c801671 000007bc 00000000 ntdll!KiFastSystemCallRet
    0012fcbc 7c801671 000007bc 00000000 00000000 ntdll!ZwDeviceIoControlFile+0xc
    0012fd1c 00402b5d 000007bc 00222409 00000000 kernel32!DeviceIoControl+0xdd
    WARNING: Stack unwind information not available. Following frames may be wrong.
    00000000 00000000 00000000 00000000 00000000 HookRun+0x2b5d


    FOLLOWUP_IP:
    hooknt!hook_all+2c [D:\Work\KrnlHook\hooknt\hookfunc.c @ 146]
    f8938346 8808 mov [eax],cl

    SYMBOL_STACK_INDEX: 0

    FOLLOWUP_NAME: MachineOwner

    SYMBOL_NAME: hooknt!hook_all+2c

    MODULE_NAME: hooknt

    IMAGE_NAME: hooknt.sys

    DEBUG_FLR_IMAGE_TIMESTAMP: 4575333a

    STACK_COMMAND: .trap fffffffff9085b60 ; kb

    FAILURE_BUCKET_ID: 0xBE_hooknt!hook_all+2c

    BUCKET_ID: 0xBE_hooknt!hook_all+2c

    Followup: MachineOwner
    ---------

    ну тут все что и раньше... Сча я сделал тестовый драйверок, вот код на котором падает:

    ULONG CR0Reg;

    __asm cli; //добавление или удаление этой комманды на BSOD не влияет
    __asm mov eax, cr0;
    __asm mov CR0Reg, eax;
    __asm and eax, 0xFFFEFFFF;
    __asm mov cr0, eax;
    {
    char c;
    PCHAR buf0 = (PCHAR)ZwCreateFile;
    c = buf0[0];
    buf0[0] = c; // ПАДАЕТ НА ЭТОЙ КОММАНДЕ
    }
    __asm mov eax, CR0Reg;
    __asm mov cr0, eax;
    __asm sti; //добавление или удаление этой комманды на BSOD не влияет


    КАК ВЕРНУТЬ СТРАНИЦУ ИЗ ПОДКАЧКИ?????
     
  20. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Она не в подкачке: "Arg2: 004dc121, PTE contents" - младший бит 1, значит страница в памяти