-
-
[求助]Dpc定时器对象枚举的疑惑。
-
发表于:
2011-9-4 13:39
5867
-
看了这篇帖子;
http://hi.baidu.com/andriy_aolala/blog/item/5aba868b235d50749f2fb437.html
还是很疑惑
我按照它的过程自己反汇编看了一下
结果发现得到的DPC定时器在XT里面压根就没有。我不知道是我自己的分析有错误还是怎么的
希望各位知情人士帮助小弟解惑。
-----------------------------------------------
看了代码:
发现它是通过
MmGetSystemRoutineAddress
函数获取
KeUpdateSystemTime
这个函数的地址
------
再通过特征码定位到
KiTimerTableListHead
返回
KiTimerTableListHead它的地址,被保存在变量addr中。
--------下面的我是不是哪里错了--------
for (int i=0;i<0x100;i++) //初始化i为0,范围100,第二次运行生效循环体代码。
{
pnode = (PLIST_ENTRY)(addr+i*8); //KiTimerTableListHead+8.我这里函数KiTimerTableListHead的位置是0x8055d780,这句话运行后pnode就是0x8055d788?并且吧pnode强制为_LIST_ENTRY结构.
lkd> dt _LIST_ENTRY
nt!_LIST_ENTRY
+0x000 Flink : Ptr32 _LIST_ENTRY
+0x004 Blink : Ptr32 _LIST_ENTRY
pnext = pnode->Blink; //_LIST_ENTRY结构第2个成员Blink,pnext=8055D78C?;
while(pnext!=pnode) //如果addr+i*8(Blink?)和addr+i*4(Flink?)相等就跳走。否则运行下面的代码。
{
PKTIMER ptimer = CONTAINING_RECORD(pnext,KTIMER,TimerListEntry);
//上面那句,通过TimerListEntry成员得到KTIME中第一个成员Header的地址。
//pnext是0x18这个成员的地址??不会和上面矛盾吗。
nt!_KTIMER
+0x000 Header : _DISPATCHER_HEADER
+0x010 DueTime : _ULARGE_INTEGER
+0x018 TimerListEntry : _LIST_ENTRY
+0x020 Dpc : Ptr32 _KDPC
+0x024 Period : Int4B
if (MmIsAddressValid(ptimer) //Dpc定时器对象地址是否有效
&& MmIsAddressValid(ptimer->Dpc) //Dpc地址是否有效
lkd> dt _KDPC
nt!_KDPC
+0x000 Type : Int2B
+0x002 Number : UChar
+0x003 Importance : UChar
+0x004 DpcListEntry : _LIST_ENTRY
+0x00c DeferredRoutine : Ptr32 void
+0x010 DeferredContext : Ptr32 Void
+0x014 SystemArgument1 : Ptr32 Void
+0x018 SystemArgument2 : Ptr32 Void
+0x01c Lock : Ptr32 Uint4B
&& MmIsAddressValid(ptimer->Dpc->DeferredRoutine)) //接着检查函数入口地址是否有效.
{
routine = (ULONG)ptimer->Dpc->DeferredRoutine; //函数入口传给routine
DbgPrint("kitimer:0x%x addr:0x%x ",(ULONG)ptimer,routine); //输出DPC定时对象和函数入口地址。
..........省略无关代码............
我在用WINDBG看的时候却发现自己得到的和这个结果不一样。
怎么大家都看热闹不提出个意见啊。。。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!