Хук SwapContext и VMWare

Тема в разделе "WASM.NT.KERNEL", создана пользователем FreeHunter, 1 июл 2007.

  1. FreeHunter

    FreeHunter New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2007
    Сообщения:
    17
    Доброго времено суток!

    Есть проблема с сабжевой ВМ: при попытке поставить хук на свап получаю бсод в девяти попытках из десяти. Пробовал с boot start ставить - работает безотказно, а когда драйвер стартует с прогой - бсод наверняка :dntknw: На реальной машине хук ставится хоть как, да и на M$ Virtual PC пашет как надо. Винда во всех случаях XPSP2

    Код (Text):
    1.     ptmp = PBYTE(ULONG(HookHandler) - ULONG(HookTarget) - 5);
    2.     writeenable(); // drop cr0 WP flag
    3.     __asm
    4.     {
    5.         mov eax, HookTarget
    6.         mov edx, ptmp
    7.         mov byte ptr [eax], 0xe9 // jump
    8.         mov dword ptr [eax + 1], edx
    9.     }
    10.     writedisable(); // set cr0 WP
    Имхо вмвара кэширует инструкции не так как реальный процессор, что и возможно приводит к порче кода.

    Кто-нибудь сталкивался с таким? Есть ли решение?
     
  2. Deyton

    Deyton Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    94
    FreeHunter
    Что-то ты не так делаешь (ИМХО). У меня таких проблем не возникало. Как там у тебя обстоят дела с блокировкой проца? cli/sti текущего треда, или DPC используешь для lock-а ? Такое чуство, что ты вообще нифига не лочишь, кстати джамп лучше вписывать одной инструкцией.
     
  3. FreeHunter

    FreeHunter New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2007
    Сообщения:
    17
    sti/cli есть. Можно поподробней про DPC?
     
  4. FreeHunter

    FreeHunter New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2007
    Сообщения:
    17
    ProcessHunter на VMWare падает тоже :dntknw:
     
  5. Deyton

    Deyton Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    94
    в ProcessHunter косяк с макросом, который сбрасывает WP bit, в последней версии (с PowerKill - ом) вроде исправленно уже.
     
  6. FreeHunter

    FreeHunter New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2007
    Сообщения:
    17
    Тогда бы везде бсодил, не так ли?

    Вот из исходника PH, который у меня есть:
    Код (Text):
    1. #define MemOpen()  __asm cli; __asm mov eax, cr0; __asm mov oData, eax; \
    2.                    __asm and eax, 0xFFFEFFFF; __asm mov cr0, eax;
    3. #define MemClose() __asm mov eax, oData; __asm mov cr0, eax; __asm sti;
    Где здесь баг?
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    FreeHunter
    PH у меня лично на VMWare не падает.
    Может у тебя версия старая? Я тестирую на 6.0
     
  8. FreeHunter

    FreeHunter New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2007
    Сообщения:
    17
    Я тестировал на 5.5, 6.0. результат один - бсод. На реальных машинах и на VPC работает стабильно. Давайте по существу. Что за идея с DPC?
     
  9. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    видимо в реализации баг, у меня ничего не падает...
    попробуй суспендить все потоки перед патчингом кода ф-ции
     
  10. Deyton

    Deyton Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    94
    Не так, бсодить будет только на машинах, где память защищена от записи.
    Вот так правильнее:
    Код (Text):
    1. void MemOpen(
    2.         OUT ULONG *OldCr0
    3.         )  
    4. {
    5.     __asm
    6.     {
    7.         cli
    8.         mov eax, cr0
    9.         mov ebx, OldCr0
    10.         mov [ebx], eax
    11.         and eax, 0xFFFEFFFF
    12.         mov cr0, eax
    13.     }
    14. }
    15.  
    16. void MemClose(
    17.             IN ULONG OldCr0
    18.             )
    19. {
    20.     __asm
    21.     {
    22.         mov eax, OldCr0
    23.         mov cr0, eax
    24.         sti
    25.     }
    26. }
    А вообще попробуй еще убрать ; из макросов.
    Вообще-то SwapContext(); выполняется на высоких IRQL, (в ХР = DISPATCH_LEVEL, а Vista32 и того выше, кажется PROFILE_LEVEL), это означает что исполняющий функцию поток не может прерваться, следовательно отпадает необходимость в проверке EIP других потоков на принадлежность заменяемому участку кода, и можно реализовать безопасный сплайсинг. Для этого нужно заблокировать на момент патча все ядра, сделать это можно послав каждому ядру DPC, через KeSetTargetProcessorDpc/KeInsertQueueDpc. Учти, что в обработчике хука не все функции можно вызывать, - только те, которые работают на этих IRQL.
     
  11. Zufyxe

    Zufyxe New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    137
    Адрес:
    Russia
    Вобще то, SwapContext всегда и везде выполняется на SYNCH_LEVEL. То, о чем ты говоришь - частный случай для UP системы, там SYNCH==DISPATCH.
    Кроме того, аффтару топика нужно учесть, что SwapContext - naked функция, причем параметры передаются нестандартно, а именно через esi, edi и ebx.
     
  12. FreeHunter

    FreeHunter New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2007
    Сообщения:
    17
    Во первых - сам аффтар. Во вторых - как будто я это сам не знал. Если нечего по делу сказать, то нечего соваться со соими советами.

    @Deyton

    мой код
    Код (Text):
    1. DWORD cr0_save;
    2.  
    3. __declspec(naked) void writeenable()
    4. {
    5.     __asm
    6.     {
    7.         cli
    8.         mov eax, cr0
    9.         mov cr0_save, eax
    10.         and eax, 0xfffeffff
    11.         mov cr0, eax
    12.         retn
    13.     }
    14. }
    15.  
    16. __declspec(naked) void writedisable()
    17. {
    18.     __asm
    19.     {
    20.         mov eax, cr0_save
    21.         mov cr0, eax
    22.         sti
    23.         retn
    24.     }
    25. }
    В чём принципиaльная разница?
     
  13. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    Zufyxe

    Интересно, здесь теперь все топик-стартеры с вопросами автоматически становятся "аффтарами"? Имхо не слишком умно.

    А так по теме - dpc, конечно рулят :)
     
  14. Deyton

    Deyton Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    94
    FreeHunter
    С каким кодом хоть падает?
     
  15. FreeHunter

    FreeHunter New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2007
    Сообщения:
    17
    чаще IRQL_NOT_LESS_OR_EQUAL, но насмотрелся таких кодов, о существовании которых я и не подозревал
     
  16. Zufyxe

    Zufyxe New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    137
    Адрес:
    Russia
    FreeHunter, Аффтар, а как иначе мне называть человека, который пытается похучить SwapContext на PASSIV-е, не знает как используют DPC, и считает, что VmWare кэширует инструкции процессора???
    Учи мат часть, аффтар. По твоему делу мне больше нечего сказать.

    EP_X0FF, вобще-то я предполагал, что это общепринятый термин в рунете, обозначающий в том числе и топикстартера.
     
  17. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    сейчас уже больше аффторами называют тех, про крео которых надо писать кг/ам.
     
  18. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    Zufyxe

    Странный у вас какой-то рунет, батенька.
     
  19. UyTvGauG

    UyTvGauG New Member

    Публикаций:
    0
    Регистрация:
    17 май 2007
    Сообщения:
    49
    Аффтар видимо ничего не слышал про отладчики, вот поэтому и спрашивает х..ню.