win下SysEnter-hook
阿新 • • 發佈:2018-06-23
名稱 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