//////////////////////////////////////////////////////////////////////
//
名称: MyGetFunAddress
//
功能: 获取函数地址
//
参数: 函数名称字符串指针
//
返回: 函数地址
//////////////////////////////////////////////////////////////////////
ULONG MyGetFunAddress( IN PCWSTR FunctionName)
{
UNICODE_STRING UniCodeFunctionName;
RtlInitUnicodeString( &UniCodeFunctionName, FunctionName );
return
(ULONG)MmGetSystemRoutineAddress( &UniCodeFunctionName );
}
//
执行卸载
VOID DriverUnload(IN PDRIVER_OBJECT pDriverObject)
{
KdPrint((
"Enter DriverUnload\n"
));
}
//////////////////////////////////////////////////////////////////////
//
名称: WPOFF
//
功能: 清除CR0
//
参数:
//
返回:
//////////////////////////////////////////////////////////////////////
VOID WPOFF()
{
__asm
{
cli
mov eax,cr0
and eax,not 10000h
mov cr0,eax
}
}
//////////////////////////////////////////////////////////////////////
//
名称: WPON
//
功能: 恢复CR0
//
参数:
//
返回:
//////////////////////////////////////////////////////////////////////
VOID WPON()
{
__asm
{
mov eax,cr0
or eax,10000h
mov cr0,eax
sti
}
}
//////////////////////////////////////////////////////////////////////
//
名称: MyHook_KdDisableDebugger
//
功能: 修改KdDisableDebugger函数起始处导致所有的调用者都返回0
//
参数: 无
//
返回: 状态
//////////////////////////////////////////////////////////////////////
NTSTATUS MyHook_KdDisableDebugger()
{
KIRQL Irql;
BYTE *KdDisableDebuggerAddress = NULL;
BYTE No1Code[2] = {0x33,0xc0};
//xor
eax,eax 这句汇编语句的机器码
BYTE No2Code[1] = {0xc3};
//retn
的机器码
//
获取KdDisableDebugger地址
KdDisableDebuggerAddress = (BYTE*)MyGetFunAddress(L
"KdDisableDebugger"
);
if
(KdDisableDebuggerAddress == NULL)
return
FAILED_TO_OBTAIN_FUNCTION_ADDRESSES;
//KdPrint
((
"%0X\n\n"
,KdDisableDebuggerAddress));
WPOFF();
//
清除CR0
//
提升IRQL中断级
Irql=KeRaiseIrqlToDpcLevel();
//
写入
RtlCopyMemory(KdDisableDebuggerAddress,No1Code,2);
RtlCopyMemory(KdDisableDebuggerAddress+2,No2Code,1);
//
恢复Irql
KeLowerIrql(Irql);
WPON();
//
恢复CR0
return
STATUS_SUCCESS;
}
//////////////////////////////////////////////////////////////////////
//
名称: DriverEntry
//
功能: 入口函数
//
参数: DriverObject:驱动对象
//
RegistryPath:设备服务键名称(注册表)
//
返回: 状态
//////////////////////////////////////////////////////////////////////
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath )
{
NTSTATUS status;
//
设置卸载函数
DriverObject->DriverUnload = DriverUnload;
status = MyHook_KdDisableDebugger();
if
(status == FAILED_TO_OBTAIN_FUNCTION_ADDRESSES)
KdPrint((
"获取函数地址失败!\n\n"
));
//status
= KdDisableDebugger();
//KdPrint
((
"======%0X\n"
,(ULONG)status));
return
STATUS_SUCCESS;
}