1. 程式人生 > >win下SysEnter-hook

win下SysEnter-hook

名稱 pro run ref point 進程pid cli IV 保護

#include <ntifs.h> VOID DriverUnload(PDRIVER_OBJECT pDriver); ULONG g_OldKiFastCallEntry = 0; ULONG g_uSSDT_Index; PCLIENT_ID g_pClientPID; ULONG g_uProtectPID; PULONG g_pAccessMask; //需要一個自己的KiFastCallEntry _declspec(naked) void MyKiFastCallEntry() { // 1. 在EDX指向的用戶空間棧中取出對應參數,以下是ZwOpen- // Process的棧構造(暫時無需考慮其他調用函數的棧情況)。 // +00 用戶空間Call返回地址 // +04 用戶空間Call返回地址 // +08 參數1 ( ProcessHandle:進程句柄 ) // +12 參數2 ( DesiredAccess:訪問權限 ) // +16 參數3 ( ObjectName:對象名稱 ) // +20 參數4 ( ClientId:保存有進程PID與線程ID的結構體 ) _asm push DWORD PTR[EDX + 4 * 5]; // 4*5 = 參數4 _asm pop g_pClientPID; // 保存參數4到ClientPID _asm push EDX; _asm add DWORD PTR[ESP], 4 * 3; // 4*3 = 參數2 _asm pop g_pAccessMask; // 保存參數2到AccessMask // 2. 保護指定PID的進程不被結束 _asm pushad; // 2.1 判斷否為ZwOpenProcess的調用號0xBE,是則執行保護 _asm mov g_uSSDT_Index, eax; if (g_uSSDT_Index == 0xBE) { // 2.2 判斷所操作進程是否為受保護進程,並同時判斷訪問權 // 限中是否包含可結束進程權限PROCESS_TERMINATE, // 是的話修改其參數,去掉此權限 if (((ULONG)g_pClientPID->UniqueProcess == g_uProtectPID)) { *g_pAccessMask = 0; } } _asm popad; // 3. 跳轉到系統原KiFastCallEntry函數中執行剩余操作 _asm jmp g_OldKiFastCallEntry; } void InitInfo() { g_uSSDT_Index = *((CHAR*)ZwOpenProcess + 1); g_uSSDT_Index = 0xBE; g_uProtectPID = 3920; _asm { push eax; push ecx; mov ecx, 0x176; rdmsr;//調用完這個指令,176號msr的值就被放入了edx:eax中 mov g_OldKiFastCallEntry,eax; pop ecx; pop eax; } } void OnHook() { _asm { push eax; push ecx; mov ecx, 0x176; mov eax, MyKiFastCallEntry; wrmsr;//調用完這個指令,就把edx:eax中的數放到176號的msr寄存器中了 pop ecx; pop eax; } } void OffHook() { _asm { push eax; push ecx; mov ecx, 0x176; mov eax, g_OldKiFastCallEntry; wrmsr;//調用完這個指令,就把edx:eax中的數放到176號的msr寄存器中了 pop ecx; pop eax; } } NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver,PUNICODE_STRING pPath) { UNREFERENCED_PARAMETER(pPath); DbgBreakPoint(); InitInfo(); OnHook(); pDriver->DriverUnload = DriverUnload; return STATUS_SUCCESS; } VOID DriverUnload(PDRIVER_OBJECT pDriver) { OffHook(); UNREFERENCED_PARAMETER(pDriver); }

win下SysEnter-hook