对进程内核结构(Eprocess)和线程内核结构(EThread)的应用 -----列举一个进程的所有线程信息
山寨冰刃的源码里的一个函数。。 获取进程的线程信息。。。
逻辑:
显示通过进程列表找到要枚举的进程,然后根据Eprocess的内容得到Ethread的偏移, Ethread进行遍历,便可得到所有的线程信息。。
(写的搓搓的 。。。思路不是太清晰。。)
1PTHREAD_INFO GetThread(int Pid)
2{
3
4 //全部定义为ULONG类型
5 ULONG pTargetProcess; //self explanatory
6 ULONG pTargetThread; //thread that can be either alerable or non-alertable
7 ULONG pNotAlertableThread; //non-alertable thread
8 ULONG pSystemProcess; //May not necessarily be the 'System' process
9 ULONG pTempThread;
10 ULONG pNextEntry, pListHead, pThNextEntry,pThListHead,pMyProcess;
11 PTHREAD_INFO PthreadInfo;
12 DWORD dwPidOffset = GetPlantformDependentInfo ( PROCESS_ID_OFFSET ) ;//0x084
13 DWORD dwPNameOffset = GetPlantformDependentInfo ( FILE_NAME_OFFSET ) ; //0x174
14 PTHREAD_INFO temp1,temp2,temp3,Infohead;
15 int bFindTid=0;
16 if (dwPidOffset==0||dwPNameOffset==0)
17 {
18 DbgPrint("Get Offset Fail !");
19 dwPidOffset=0x084;dwPNameOffset=0x174;
20 }
21 if (0==Pid)
22 {
23 return (PTHREAD_INFO)NULL;
24 }
25 Infohead=temp1=(PTHREAD_INFO)ExAllocatePool(NonPagedPool,sizeof(THREAD_INFO));
26 //获得系统进程
27 pMyProcess=pSystemProcess =(ULONG)PsGetCurrentProcess(); //make sure you are running at IRQL PASSIVE_LEVEL
28
29 if(!pSystemProcess)
30 {
31 DbgPrint("KernelExec -> Cannot find 'System' process!");
32 return NULL;
33 }
34 //获取进程列表头(+0x088 ActiveProcessLinks : _LIST_ENTRY)
35 pListHead=pSystemProcess+0x88;
36 //得到下一个EPROCESS结构的ActiveProcessLinks偏移地址
37 pNextEntry=*(ULONG*)pListHead;
38 if(!pNextEntry)
39 DbgPrint("KernelExec -> No processes found!");
40 else
41 {
42
43 while(pNextEntry != pListHead) //start looping through the available processes
44 { //得到EPROCESS的首地址
45 pSystemProcess =pNextEntry-0x88;
46 //进程名偏移
47 //+0x174 ImageFileName:[16] UChar
48 //DbgPrint("ProcessName %s PID:%x\n",(char*)pSystemProcess+dwPNameOffset,*(int*)((char*)pSystemProcess+dwPidOffset));
49
50 //Is this explorer.exe?
51 //DbgBreakPoint();
52
53 //if(_strnicmp((char*)pSystemProcess+dwPNameOffset,"explorer.exe",12)==0)
54 if (*(int*)((char*)pSystemProcess+dwPidOffset)==Pid)
55 { //得到进程的EPROCESS结构的地址
56 bFindTid=1;
57 pTargetProcess = pSystemProcess; //Yes,we have found it!
58 //DbgPrint("yes,we have found explorer.exe!");
59
60 pTargetThread = pNotAlertableThread = 0;
61 //获取线程列表头
62 //+0x050 ThreadListHead : _LIST_ENTRY
63 //也就是_KPROCESS(PCB)中ThreadListHead的偏移地址
64 pThListHead = pSystemProcess+0x50;
65 //得到ETHREAD结构中_KTHREAD(Tcb)的+0x1b0 ThreadListEntry : _LIST_ENTRY地址
66 pThNextEntry=*(ULONG *)pThListHead;
67 //Now we loop through it's threads, seeking an alertable thread
68 while(pThNextEntry != pThListHead)
69 { //所属ETHREAD的首地址
70 pTempThread =pThNextEntry-0x1b0;
71 //DbgPrint("ethread address is:0x%x\n",(ULONG *)pTempThread);
72 //DbgPrint("Start Address is:0x%x\n",*(DWORD *)(pTempThread+0x228));
73 //线程ID
74 //ETHREAD+0x1ec Cid : _CLIENT_ID为进程ID
75 //再向下+4为线程ID
76 //DbgPrint("thread Id is %d\n",*(ULONG *)(pTempThread+0x1f0));
77
78 temp2=(PTHREAD_INFO)ExAllocatePool(NonPagedPool,sizeof(THREAD_INFO));
79 temp2->dwThreadId =*(ULONG *)(pTempThread+0x1f0);
80 temp2->StartAddress=*(int *)(pTempThread+0x228);
81 temp2->pEThread=(ULONG *)pTempThread;
82
83 temp1->Next=temp2;
84 temp1=temp2;
85 pNotAlertableThread =pTempThread;
86
87 //下一个线程块
88 pThNextEntry = *(ULONG *)pThNextEntry; //check next thread
89 }
90 break;
91 }
92 //下一个进程块
93 pNextEntry = *(ULONG *)pNextEntry; //get next process
94 }
95 }
96 if (bFindTid==1)
97 {
98 temp2->Next=NULL;
99
100 temp3=Infohead;
101 Infohead=Infohead->Next;
102 ExFreePool(temp3);
103 //ObfDereferenceObject((PVOID)pMyProcess);
104 return Infohead;
105 }
106 return NULL;
107
108
109}
2{
3
4 //全部定义为ULONG类型
5 ULONG pTargetProcess; //self explanatory
6 ULONG pTargetThread; //thread that can be either alerable or non-alertable
7 ULONG pNotAlertableThread; //non-alertable thread
8 ULONG pSystemProcess; //May not necessarily be the 'System' process
9 ULONG pTempThread;
10 ULONG pNextEntry, pListHead, pThNextEntry,pThListHead,pMyProcess;
11 PTHREAD_INFO PthreadInfo;
12 DWORD dwPidOffset = GetPlantformDependentInfo ( PROCESS_ID_OFFSET ) ;//0x084
13 DWORD dwPNameOffset = GetPlantformDependentInfo ( FILE_NAME_OFFSET ) ; //0x174
14 PTHREAD_INFO temp1,temp2,temp3,Infohead;
15 int bFindTid=0;
16 if (dwPidOffset==0||dwPNameOffset==0)
17 {
18 DbgPrint("Get Offset Fail !");
19 dwPidOffset=0x084;dwPNameOffset=0x174;
20 }
21 if (0==Pid)
22 {
23 return (PTHREAD_INFO)NULL;
24 }
25 Infohead=temp1=(PTHREAD_INFO)ExAllocatePool(NonPagedPool,sizeof(THREAD_INFO));
26 //获得系统进程
27 pMyProcess=pSystemProcess =(ULONG)PsGetCurrentProcess(); //make sure you are running at IRQL PASSIVE_LEVEL
28
29 if(!pSystemProcess)
30 {
31 DbgPrint("KernelExec -> Cannot find 'System' process!");
32 return NULL;
33 }
34 //获取进程列表头(+0x088 ActiveProcessLinks : _LIST_ENTRY)
35 pListHead=pSystemProcess+0x88;
36 //得到下一个EPROCESS结构的ActiveProcessLinks偏移地址
37 pNextEntry=*(ULONG*)pListHead;
38 if(!pNextEntry)
39 DbgPrint("KernelExec -> No processes found!");
40 else
41 {
42
43 while(pNextEntry != pListHead) //start looping through the available processes
44 { //得到EPROCESS的首地址
45 pSystemProcess =pNextEntry-0x88;
46 //进程名偏移
47 //+0x174 ImageFileName:[16] UChar
48 //DbgPrint("ProcessName %s PID:%x\n",(char*)pSystemProcess+dwPNameOffset,*(int*)((char*)pSystemProcess+dwPidOffset));
49
50 //Is this explorer.exe?
51 //DbgBreakPoint();
52
53 //if(_strnicmp((char*)pSystemProcess+dwPNameOffset,"explorer.exe",12)==0)
54 if (*(int*)((char*)pSystemProcess+dwPidOffset)==Pid)
55 { //得到进程的EPROCESS结构的地址
56 bFindTid=1;
57 pTargetProcess = pSystemProcess; //Yes,we have found it!
58 //DbgPrint("yes,we have found explorer.exe!");
59
60 pTargetThread = pNotAlertableThread = 0;
61 //获取线程列表头
62 //+0x050 ThreadListHead : _LIST_ENTRY
63 //也就是_KPROCESS(PCB)中ThreadListHead的偏移地址
64 pThListHead = pSystemProcess+0x50;
65 //得到ETHREAD结构中_KTHREAD(Tcb)的+0x1b0 ThreadListEntry : _LIST_ENTRY地址
66 pThNextEntry=*(ULONG *)pThListHead;
67 //Now we loop through it's threads, seeking an alertable thread
68 while(pThNextEntry != pThListHead)
69 { //所属ETHREAD的首地址
70 pTempThread =pThNextEntry-0x1b0;
71 //DbgPrint("ethread address is:0x%x\n",(ULONG *)pTempThread);
72 //DbgPrint("Start Address is:0x%x\n",*(DWORD *)(pTempThread+0x228));
73 //线程ID
74 //ETHREAD+0x1ec Cid : _CLIENT_ID为进程ID
75 //再向下+4为线程ID
76 //DbgPrint("thread Id is %d\n",*(ULONG *)(pTempThread+0x1f0));
77
78 temp2=(PTHREAD_INFO)ExAllocatePool(NonPagedPool,sizeof(THREAD_INFO));
79 temp2->dwThreadId =*(ULONG *)(pTempThread+0x1f0);
80 temp2->StartAddress=*(int *)(pTempThread+0x228);
81 temp2->pEThread=(ULONG *)pTempThread;
82
83 temp1->Next=temp2;
84 temp1=temp2;
85 pNotAlertableThread =pTempThread;
86
87 //下一个线程块
88 pThNextEntry = *(ULONG *)pThNextEntry; //check next thread
89 }
90 break;
91 }
92 //下一个进程块
93 pNextEntry = *(ULONG *)pNextEntry; //get next process
94 }
95 }
96 if (bFindTid==1)
97 {
98 temp2->Next=NULL;
99
100 temp3=Infohead;
101 Infohead=Infohead->Next;
102 ExFreePool(temp3);
103 //ObfDereferenceObject((PVOID)pMyProcess);
104 return Infohead;
105 }
106 return NULL;
107
108
109}
今天找到一个 开放源码的 hips,没事研究下。。。。