-
-
[求助]Win2003下枚举DPC定时器蓝屏!!
-
发表于:
2014-2-20 19:42
3759
-
枚举DPC定时器的关键是定位 KiTimerTableListHead (DPC定时器数组)
WinXP下这个数组元素有256个
Win2003下这个数组元素有512个
定位到KiTimerTableListHead后,遍历它即可
//这里获取到的KiTimerTableListHead的地址打印出来是对的,到这里没问题不蓝屏
//遍历KiTimerTableListHead数组得到所有DPC定时器
//下面代码蓝屏,和WinXP下比只改动了一处
irql = KeRaiseIrqlToDpcLevel();
for(j = 0; j < 0x200; j++) //只改动这里,j为数组元素个数,WinXP下把0x200换成0x100就能正确枚举出来
{
pnode = (LIST_ENTRY *)(addr + j * 8); //addr为KiTimerTableListHead地址
pnext = pnode->Blink;
while(pnext != pnode)
{
PKTIMER ptimer = CONTAINING_RECORD(pnext, KTIMER, TimerListEntry);
if(MmIsAddressValid(ptimer) && MmIsAddressValid(ptimer->Dpc) && MmIsAddressValid(ptimer->Dpc->DeferredRoutine)) //过滤
{
routine = (ULONG)ptimer->Dpc->DeferredRoutine;
DbgPrint("DPC Timer对象: 0x%X 入口地址: 0x%X", (ULONG)ptimer, routine);
}
pnext = pnext->Blink; //调试发现蓝屏在这行,WinXP下没问题
}
}
KeLowerIrql(irql);
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)