能力值:
( LV2,RANK:10 )
|
-
-
2 楼
ULONG_PTR ul_ValidAccessMask_Addr = 0; // 调试对象权限地址
ULONG_PTR ul_DebugObjectType_Addr = 0; // 调试对象地址
KTIMER Timer = { 0 }; // 用于全局调试对象权限的计时器
KDPC myDpc = { 0 }; // 用于全局调试对象权限的计时器
//////////////////////////////////////////////////////////////////////////
// 以下全是win7 64 硬编码 相对于内核基址
// 虚拟机:DbgkDebugObjectType 0x45de1c 本机:DbgkDebugObjectType 0045a5fc
ULONG_PTR ul_DebugObjectType_offset = 0x45de1c;
// ValidAccessMask +0x040+0x01c
ULONG_PTR ul_ValidAccessMask_offset = 0x5c;
/********************************************************************/
/* 创建: 2015/03/11
/* 函数名: 驱动开始例程
/* 参数1:
/* 参数2:
/*
/* 返回值:
/*********************************************************************/
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pReg)
{
NTSTATUS state = STATUS_SUCCESS;
LDR_DATA_TABLE_ENTRY *pLdrDataTableEntry;
UNREFERENCED_PARAMETER(pReg);
pDriverObject->DriverUnload = DriverUnload;
InitKillThread();
DbgPrint("驱动加载成功\n");
// 获取内核模块基址
pLdrDataTableEntry = SearchDriver(pDriverObject, L"ntoskrnl.exe");
if (pLdrDataTableEntry)
{
ul_KernelBase = (ULONG_PTR)pLdrDataTableEntry->DllBase;
DbgPrint("内核基址:%p\n", ul_KernelBase);
}
pMyDriverObject = pDriverObject;
// 获取调试对象地址
ul_DebugObjectType_Addr = GetDbgkDebugobjectAddr();
DbgPrint("DbgkDebugObjectType:%p\n", ul_DebugObjectType_Addr);
ul_ValidAccessMask_Addr = *(PULONG_PTR)ul_DebugObjectType_Addr + ul_ValidAccessMask_offset;
DbgPrint("调试对象地址:%p\n", ul_DebugObjectType_Addr);
DbgPrint("调试对象权限地址:%p\n", ul_ValidAccessMask_Addr);
SetDPCTimerByDbgAccess();
return state;
}
/********************************************************************/
/* 创建: 2015/03/11
/* 函数名: 驱动卸载例程
/* 参数1:
/* 参数2:
/*
/* 返回值:
/*********************************************************************/
void DriverUnload(PDRIVER_OBJECT pDriverObject)
{
UNREFERENCED_PARAMETER(pDriverObject);
BOOLEAN bTimer = FALSE;
bTimer = KeCancelTimer(&Timer);
if (bTimer)
{
DbgPrint("DPC定时器卸载成功\n");
}
DbgPrint("驱动卸载完成\n");
}
// 用于全局调试对象权限的计时器 500ms写一次
VOID TimerRoutine(
_In_ struct _KDPC *Dpc,
_In_opt_ PVOID DeferredContext,
_In_opt_ PVOID SystemArgument1,
_In_opt_ PVOID SystemArgument2
)
{
UNREFERENCED_PARAMETER(Dpc);
UNREFERENCED_PARAMETER(DeferredContext);
UNREFERENCED_PARAMETER(SystemArgument1);
UNREFERENCED_PARAMETER(SystemArgument2);
LARGE_INTEGER lTime = { 0 };
ULONG ulMicroSecond = 0;
//将定时器的时间设置为500ms
ulMicroSecond = 500000;
//将32位整数转化成64位整数
lTime = RtlConvertLongToLargeInteger(-10 * ulMicroSecond);
DbgPrint("dpc Timer...\n");
KIRQL irql;
irql = WPOFF();
*(PULONG_PTR)ul_ValidAccessMask_Addr = 0x1f000f;
WPON(irql);
KeSetTimer(&Timer, lTime, &myDpc);
}
|
|
|