Доброго времено суток! Есть проблема с сабжевой ВМ: при попытке поставить хук на свап получаю бсод в девяти попытках из десяти. Пробовал с boot start ставить - работает безотказно, а когда драйвер стартует с прогой - бсод наверняка На реальной машине хук ставится хоть как, да и на M$ Virtual PC пашет как надо. Винда во всех случаях XPSP2 Код (Text): ptmp = PBYTE(ULONG(HookHandler) - ULONG(HookTarget) - 5); writeenable(); // drop cr0 WP flag __asm { mov eax, HookTarget mov edx, ptmp mov byte ptr [eax], 0xe9 // jump mov dword ptr [eax + 1], edx } writedisable(); // set cr0 WP Имхо вмвара кэширует инструкции не так как реальный процессор, что и возможно приводит к порче кода. Кто-нибудь сталкивался с таким? Есть ли решение?
FreeHunter Что-то ты не так делаешь (ИМХО). У меня таких проблем не возникало. Как там у тебя обстоят дела с блокировкой проца? cli/sti текущего треда, или DPC используешь для lock-а ? Такое чуство, что ты вообще нифига не лочишь, кстати джамп лучше вписывать одной инструкцией.
в ProcessHunter косяк с макросом, который сбрасывает WP bit, в последней версии (с PowerKill - ом) вроде исправленно уже.
Тогда бы везде бсодил, не так ли? Вот из исходника PH, который у меня есть: Код (Text): #define MemOpen() __asm cli; __asm mov eax, cr0; __asm mov oData, eax; \ __asm and eax, 0xFFFEFFFF; __asm mov cr0, eax; #define MemClose() __asm mov eax, oData; __asm mov cr0, eax; __asm sti; Где здесь баг?
Я тестировал на 5.5, 6.0. результат один - бсод. На реальных машинах и на VPC работает стабильно. Давайте по существу. Что за идея с DPC?
видимо в реализации баг, у меня ничего не падает... попробуй суспендить все потоки перед патчингом кода ф-ции
Не так, бсодить будет только на машинах, где память защищена от записи. Вот так правильнее: Код (Text): void MemOpen( OUT ULONG *OldCr0 ) { __asm { cli mov eax, cr0 mov ebx, OldCr0 mov [ebx], eax and eax, 0xFFFEFFFF mov cr0, eax } } void MemClose( IN ULONG OldCr0 ) { __asm { mov eax, OldCr0 mov cr0, eax sti } } А вообще попробуй еще убрать ; из макросов. Вообще-то SwapContext(); выполняется на высоких IRQL, (в ХР = DISPATCH_LEVEL, а Vista32 и того выше, кажется PROFILE_LEVEL), это означает что исполняющий функцию поток не может прерваться, следовательно отпадает необходимость в проверке EIP других потоков на принадлежность заменяемому участку кода, и можно реализовать безопасный сплайсинг. Для этого нужно заблокировать на момент патча все ядра, сделать это можно послав каждому ядру DPC, через KeSetTargetProcessorDpc/KeInsertQueueDpc. Учти, что в обработчике хука не все функции можно вызывать, - только те, которые работают на этих IRQL.
Вобще то, SwapContext всегда и везде выполняется на SYNCH_LEVEL. То, о чем ты говоришь - частный случай для UP системы, там SYNCH==DISPATCH. Кроме того, аффтару топика нужно учесть, что SwapContext - naked функция, причем параметры передаются нестандартно, а именно через esi, edi и ebx.
Во первых - сам аффтар. Во вторых - как будто я это сам не знал. Если нечего по делу сказать, то нечего соваться со соими советами. @Deyton мой код Код (Text): DWORD cr0_save; __declspec(naked) void writeenable() { __asm { cli mov eax, cr0 mov cr0_save, eax and eax, 0xfffeffff mov cr0, eax retn } } __declspec(naked) void writedisable() { __asm { mov eax, cr0_save mov cr0, eax sti retn } } В чём принципиaльная разница?
Zufyxe Интересно, здесь теперь все топик-стартеры с вопросами автоматически становятся "аффтарами"? Имхо не слишком умно. А так по теме - dpc, конечно рулят
FreeHunter, Аффтар, а как иначе мне называть человека, который пытается похучить SwapContext на PASSIV-е, не знает как используют DPC, и считает, что VmWare кэширует инструкции процессора??? Учи мат часть, аффтар. По твоему делу мне больше нечего сказать. EP_X0FF, вобще-то я предполагал, что это общепринятый термин в рунете, обозначающий в том числе и топикстартера.