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

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

  1. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    тада какож фига все валится?
    Ну кто-нибудь, ответьте...
     
  2. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    только что у себя проверил
    vmware workstation 5.5.3-34685
    windows XP professional version 2002 service pack 2
    computer Intel(R) Xeon(TM) CPU 2.40Ghz 2.39Ghz 256 MB of RAM
    код точь-в-точь как у тебя, только не инлайн а .asm (мне надо и 32 и 64)
    все работает
    на серверных системах давно протестили а на ХП - вот специально посмотрел
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    ATTEMPTED_WRITE_TO_READONLY_MEMORY - мне кажется, или ты пытаешься писать в readonly память? =)
     
  4. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Тада надо сравнить всю систему побитно... :derisive:
    буду рыть далее... посмотрю что айс меняет при инсталяции
     
  5. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    вот нашел и я ХП где падает
    уже стало очень интересно
     
  6. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Ты нашел причину или просто место где падает?
    Если раньше не падало а сча начало падать -- что менял помниш?
     
  7. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    разобрался очень приблизительно
    значицца так
    на той варе где упало было PAE
    я его выключил (boot.ini - /nopae /noexecute=alwaysoff)
    падать перестало
    рядом вара win2003x64sp1 там PAE всегда ON - и там все идеально работало и работает
    вывод делаю такой - vmware.exe чего-то свое хачит и ПО_ФАКТУ_НЕ_СЕТТИТ_WP_в_CR0_в_XPSP2
    вообще говоря это АХТУНГ
     
  8. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Под VmWare с WinXP, WinXP SP2, Win2003 аналогичный код работает без вопросов. С PAE, без PAE, с DEP`ом и без него. Дизасм-листинг куска от cli до sti запости, плз
     
  9. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    я же постил уже, глянь выше...
     
  10. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    sasha_s
    Точно, в первом посте, проглядел. Подумал, что может быть фича компилятора с тем, что он не сохраняет регистры между последовательными __asm.
    Еще вариант - попробуй под Driver Verifier`ом прогнать. Может быть он что-нибудь более полезное в баг-чеке напишет.
     
  11. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    wp.asm

    Код (Text):
    1. ;хотите BSOD? вызовите restore без предварительного disable
    2. ifdef _WIN64
    3.  
    4. .code
    5.  
    6. public disable_write_protect
    7. disable_write_protect proc
    8. mov rax,cr0
    9. mov qword ptr protect,rax
    10. btr rax,10h
    11. mov cr0,rax
    12. ret
    13. disable_write_protect endp
    14.  
    15. public restore_write_protect
    16. restore_write_protect proc
    17. mov rax,qword ptr protect
    18. mov cr0,rax
    19. ret
    20. restore_write_protect endp
    21.  
    22. .data
    23. protect dq 0
    24.  
    25. else
    26.  
    27. .486p
    28. .model flat
    29. .code
    30.  
    31. public disable_write_protect
    32. disable_write_protect proc
    33. mov eax,cr0
    34. mov dword ptr protect,eax
    35. btr eax,10h
    36. mov cr0,eax
    37. ret
    38. disable_write_protect endp
    39.  
    40. public restore_write_protect
    41. restore_write_protect proc
    42. mov eax,dword ptr protect
    43. mov cr0,eax
    44. ret
    45. restore_write_protect endp
    46.  
    47. .data
    48. protect dd 0
    49. endif
    50.  
    51. end
    вызывается так:

    Код (Text):
    1. KeEnterCriticalRegion( );
    2. disable_write_protect( );
    3. *( TYPE_AcceptSecurityContext* )ptr = hook_AcceptSecurityContext;
    4. restore_write_protect( );
    5. KeLeaveCriticalRegion( );
    VMWare Server 1.0.0 build 28343
    Computer AMD Opteron(TM) Processor 246
    2.0 Ghz 256 Mb RAM
    версию ХП я писал выше

    на варе НИКОГДА не устанавливался софтайс
    с PAE падает но вроде с PAGE_FAULT, сейчас смотрю дамп
    без PAE - просто работает
     
  12. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Код (Text):
    1. ULONG_PTR
    2. UnprotectMemory()
    3. {
    4.     ULONG_PTR   oldCr0;
    5.  
    6.     _disable();
    7.     oldCr0 = __readcr0();
    8.     __writecr0(oldCr0 & (ULONG_PTR) 0xFFFFFFFFFFFEFFFF);
    9.     _enable();
    10.     return oldCr0;
    11. }
    12.  
    13. VOID
    14. ProtectMemory(IN ULONG_PTR oldCr0)
    15. {
    16.     _disable();
    17.     __writecr0(oldCr0);
    18.     _enable();
    19. }
    Работает везде. Разницы хоть убей не вижу

    ЗЫ: VmWare Workstation 5.5.3, два разных билда
     
  13. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Блин как я мог забыть про Verifier... сча попробую
     
  14. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    к сожалению не вижу как я могу этот твой код себе вставить
    собери маленький дрв и приаттач если интересно я проверю на падучей лабе
     
  15. sasha_s

    sasha_s New Member

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

    без Айса падает
    с Айсом не падает
    Без Айса с /nopae тоже падает
    С Айсом и с Verifier-ом не падает
     
  16. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    z0mailbox
    А смысла нет. Код генерится практически такой же.
    sasha_s
    Предположение: когда падает в баг-чек посмотри содержимое Cr0. Может быть WP оказывается установлен?
     
  17. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    попытка прочитать и понять это
    http://kb.vmware.com/vmtnkb/search.do?cmd=displayKC&docType=kc&externalId=1889&sliceId=SAL_Public&dialogID=4901574&stateId=0%200%204899268&doctag=Author,%20KB%20Article
    привело к тяжелому ступору
    пойду выпью чего-нибудь
    завтра перечитаю
     
  18. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    http://www.win2osx.net/forum/archive/index.php/t-1690.html
    Там по поводу Mac`ов под VmWare обсуждение. Фишка такая же - игра с флагом paevm и включением-выключением PAE в гостевой ОС приводит к странненьким результатам (здесь работает - а здесь... не работает...).
    По ходу дела, косяк VmWare. Может попробовать на версиях до 5.5 также держать его включенным?
     
  19. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    короче народ я разобрался конкретно в моем случае. ВМВара и XP непричем...

    а дело в следующем:

    для сброса/востановления этого бита я использовал следующие макросы

    #define DISABLE_BIT(CR0Reg) \
    __asm cli; \
    __asm mov eax, cr0; \
    __asm mov CR0Reg, eax; \
    __asm and eax, 0xFFFEFFFF; \
    __asm mov cr0, eax; \


    #define ENABLE_BIT(CR0Reg) \
    __asm mov eax, CR0Reg; \
    __asm mov cr0, eax; \
    __asm sti; \


    соответственно код выглядел так:

    ULONG CR0Reg;

    DISABLE_BIT(CR0Reg);

    //какие-то манипуляции

    ENABLE_BIT(CR0Reg) ;

    вся ляля в том что этот бит не сбрасывался! А почему?!

    я поставил опцию для компилера (Visual Studio 6.0) "/EP" (Copies preprocessor output to standard output)
    посмотрел этот вывод... на месте макросов были строки:

    __asm cli; __asm mov eax, cr0; __asm mov CR0Reg, eax; __asm and eax, 0xFFFEFFFF; __asm mov cr0, eax;;
    и
    __asm mov eax, CR0Reg; __asm mov cr0, eax; __asm sti;;

    Но этот код не линкуется в бинарник.
    Вот сча глянул бинарник и обалдел, нет там этого кода, там от этих макросов тока по первой комманде:
    __asm cli;
    и
    __asm mov eax, CR0Reg;

    После вставки кода напрямую в исходник, без макросов -- все заработало!
    Макросы -- это ЗЛО!

    ВСЕМ СПАСИБО ЗА УЧАСТИЕ...
     
  20. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    мдаа..
    это в VS такой компилер кривой?
    или так и было задумано?