首页
社区
课程
招聘
[原创]遍历内核中的DpcTimer
发表于: 2012-3-20 11:17 30258

[原创]遍历内核中的DpcTimer

2012-3-20 11:17
30258
typedef struct _KTIMER {
	DISPATCHER_HEADER	Header;
	ULARGE_INTEGER		DueTime;	//+0x10
	LIST_ENTRY			TimerListEntry;
	PKDPC				Dpc;		//+0x20
	LONG				Period;		//+0x24
} KTIMER, *PKTIMER, *PRKTIMER;
	// 取KeUpdateSystemTime地址
	RtlInitUnicodeString(&destString,(PWCHAR)L"KeUpdateSystemTime");
	Address = (ULONG)MmGetSystemRoutineAddress(&destString);
	if (Address == 0) return 0;

	// 反汇编找到C_LEA<就是 lea 指令>首次出现的地址
	Address = DisAsmFindFirstSpecialInstructionAddress(Address, C_LEA);
	if ( Address == 0 ) return 0;
	if ( *(PUSHORT)Address != 0x0C8D ) return 0;

	Address = *(PULONG)(Address + 3);
	if ( MmIsAddressValidEx((PVOID)Address) == VCS_INVALID ) return 0;
ULONG DisAsmFindFirstSpecialInstructionAddress(ULONG BeginAddress, ULONG CmdType)
{
	ULONG		DecodedLength = 0;
	ULONG		dw = 0;
	ULONG		Address = 0;
	Disasm		dis;

	while (TRUE)
	{
		if ( MmIsAddressValidEx((PVOID)(BeginAddress + DecodedLength)) == VCS_INVALID ) return 0;

		dw = DisasmCode((PUCHAR)(BeginAddress + DecodedLength),36,&dis);
		DecodedLength = DecodedLength + dw;
		if ( dis.cmdtype != CmdType ) continue;

		Address = BeginAddress + DecodedLength - dw;		//返回指令地址 此时指向指令
		break;
	}

	if ( MmIsAddressValidEx((PVOID)Address) == VCS_INVALID ) Address = 0;
	return Address;
}

//自定义的回传DPC TIMER结构
typedef struct _MyDpcTimer{
	ULONG	TimerAddress;		//KTIMER结构地址
	ULONG	Period;				//循环间隔
	ULONG	DpcAddress;			//DPC结构地址
	ULONG	DpcRoutineAddress;	//例程地址
}MyDpcTimer,*PMyDpcTimer;

#define MAX_DPCTIMER_COUNT 250

#pragma PAGECODE
static ULONG GetDpcTimerInformation_XP(PVOID* pvBuf)
{
	ULONG	NumberOfTimerTable;
	ULONG	i;
	ULONG	ulCount = 0;
	PLIST_ENTRY	pList = NULL;
	PLIST_ENTRY pNextList = NULL;
	MyDpcTimer	MyDpc;
	PKDPCTIMER	pTimer = NULL;

	NumberOfTimerTable = 0x100;																	//_KTIMER_TABLE_ENTRY数量
	pList = (PLIST_ENTRY)GetDpcTimerListHeadForXp_2K3();										//取得链表头
	if (pList == NULL) return 0;

	*pvBuf = CallExAllocatePoolWithTag(PagedPool,MAX_DPCTIMER_COUNT*sizeof(MyDpcTimer),652);		//分配足够大的缓冲
	if (*pvBuf == NULL) return 0;
	RtlZeroMemory(*pvBuf,MAX_DPCTIMER_COUNT*sizeof(MyDpcTimer));

	for ( i = 0; i < NumberOfTimerTable; i++, pList++ )											//NumberOfTimerTable 个list
	{
		if ( MmIsAddressValidEx((PVOID)&pList) == VCS_INVALID ) goto __exit1;


		if ( MmIsAddressValidEx((PVOID)pList->Blink) == VCS_INVALID ) continue;					//如果listentry域地址无效,continue
		if ( MmIsAddressValidEx((PVOID)pList->Flink) == VCS_INVALID ) continue;


		for ( pNextList = pList->Blink; pNextList != pList; pNextList = pNextList->Blink )		//遍历blink链
		{
			pTimer = CONTAINING_RECORD(pNextList,KDPCTIMER,TimerListEntry);						//得到结构首
			
			if ( MmIsAddressValid((PVOID)pTimer) &&
				 MmIsAddressValid((PVOID)pTimer->Dpc) &&
				 MmIsAddressValid((PVOID)pTimer->Dpc->DeferredRoutine) &&
				 MmIsAddressValid((PVOID)&pTimer->Period) )										//过滤
			{
			
				RtlZeroMemory(&MyDpc,sizeof(MyDpcTimer));										//准备更新结构信息
				if ( !MmIsAddressValid((PVOID)pTimer) ) break;
				MyDpc.TimerAddress = (ULONG)pTimer;

				if ( !MmIsAddressValid((PVOID)pTimer->Dpc) ) break;
				MyDpc.DpcAddress = (ULONG)pTimer->Dpc;

				if ( !MmIsAddressValid((PVOID)pTimer->Dpc->DeferredRoutine) ) break;
				MyDpc.DpcRoutineAddress = (ULONG)pTimer->Dpc->DeferredRoutine;

				if ( !MmIsAddressValid((PVOID)&pTimer->Period) ) break;
				MyDpc.Period = pTimer->Period;

				RtlMoveMemory( (PVOID)((ULONG)*pvBuf+ulCount*sizeof(MyDpcTimer)),&MyDpc,sizeof(MyDpcTimer) );
				ulCount++;
				
				// 简单退出了,需要更改为重新分配更大的缓冲
				if (ulCount >= MAX_DPCTIMER_COUNT) goto __exit1;
			}

			if ( !MmIsAddressValid(pNextList->Blink) ) break;									//过滤

		}// end for
	}//end for

	return ulCount * sizeof(MyDpcTimer);

__exit1:
	if (*pvBuf != NULL) ExFreePool(*pvBuf);
	*pvBuf = NULL;
	return 0;
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 6
支持
分享
最新回复 (29)
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
求附件 凑齐字数
2012-3-20 11:44
0
雪    币: 4560
活跃值: (1002)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
不错不错,收藏之
2012-3-20 13:28
0
雪    币: 2830
活跃值: (2638)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
4
lz威武,学习
2012-3-20 13:30
0
雪    币: 2314
活跃值: (2205)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
5
挺详细的,很适合初学者。
2012-3-20 19:37
0
雪    币: 120
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
学习++
2012-3-20 20:44
0
雪    币: 169
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
亲 有附件没?
2012-3-20 21:04
0
雪    币: 1685
活跃值: (709)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢分享~~~~
2012-3-20 21:15
0
雪    币: 2323
活跃值: (4113)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
9
学习,谢谢分享~~
2012-3-20 22:04
0
雪    币: 66
活跃值: (960)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
学习了。
2012-3-21 00:05
0
雪    币: 219
活跃值: (783)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
11
学习.........
2012-3-21 07:12
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不错不错,收藏之
2012-3-21 12:18
0
雪    币: 585
活跃值: (573)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
13
放出源码吧
哈哈,,
2012-3-21 12:43
0
雪    币: 91
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
学习学习,求源码
2012-3-22 13:49
0
雪    币: 278
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
放出附件吧。。大侠
2012-3-23 21:32
0
雪    币: 535
活跃值: (245)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
16
这些就是源码了啊
2012-3-23 22:55
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
17
遍历内核中的DpcTimer mark
2012-3-24 12:16
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
18
求GetKiProcessorBlock
2012-4-2 15:19
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
19
jas。。。你这mark得也忒具体了吧。。。膜拜中
2012-4-2 15:37
0
雪    币: 242
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
很详细的,支持
2012-4-4 21:42
0
雪    币: 615
活跃值: (590)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
21
这种强文怎么能不顶呢,太适合我了
2012-4-18 10:23
0
雪    币: 60
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
Mark Dpc
2012-4-25 09:56
0
雪    币: 381
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
给力好文,支持一个
2012-10-31 17:25
0
雪    币: 778
活跃值: (208)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
24
谢谢分享,楼主太牛了
2012-11-2 22:21
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Edj
25
很详细,非常感谢.MARK
2013-1-30 15:33
0
游客
登录 | 注册 方可回帖
返回
//