能力值:
( LV9,RANK:290 )
|
-
-
2 楼
初学驱动 参考网上代码
XP3 下编译通过 希望对你有帮助
#define PROCESS_ID_OFFSET 0x84
#define IMAGE_NAME_OFFSET 0x174
#define PROCESS_LINK_OFFSET 0x88
#define PROCESS_EXITTIME 0x78
void GetAllProcess()
{
ULONG curr, next, per;
PLIST_ENTRY ActiveProcessLinks;
int i = 1;
curr = (ULONG)IoGetCurrentProcess();//PsGetCurrentProcess();
ActiveProcessLinks = (PLIST_ENTRY)((PUCHAR)curr + PROCESS_LINK_OFFSET);
next = (ULONG)((PCHAR)(ActiveProcessLinks->Flink) - PROCESS_LINK_OFFSET);
DbgPrint("EPROCESS --> [0x%08X] PID ---> [%d] ImageName %s", curr, *(PULONG)((PUCHAR)curr + PROCESS_ID_OFFSET),
((PUCHAR)curr + IMAGE_NAME_OFFSET));
while(next != 0)
{
if(!MmIsAddressValid((PVOID)next))
break;
//如果EPROCESS 的 ExitTime 不等于0 说明进程退出了
if( *(LONGLONG*)((PUCHAR)next + PROCESS_EXITTIME) == 0) {
//正常来说PID 会小于 0xFFFF 除非是 Idle 进程 (纯属猜测)
if(*(PULONG)((PUCHAR)next + PROCESS_ID_OFFSET) < 0xFFFF) {
DbgPrint("EPROCESS --> [0x%08X] PID ---> [%d] ImageName %s", next, *(PULONG)((PUCHAR)next + PROCESS_ID_OFFSET),
((PUCHAR)next + IMAGE_NAME_OFFSET));
} else {
DbgPrint("EPROCESS --> [0x%08X] PID ---> [0] ImageName Idle", next);
}
i ++;
}
ActiveProcessLinks = (PLIST_ENTRY)((PUCHAR)next + PROCESS_LINK_OFFSET);
next = (ULONG)((PCHAR)(ActiveProcessLinks->Flink) - PROCESS_LINK_OFFSET);
if(next == curr)
break;
}
DbgPrint("进程数量: %d", i);
}
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
我说的是通用的方法..不是硬编码...
不是还是谢谢你..
|
能力值:
( LV9,RANK:380 )
|
-
-
4 楼
摘自《寒江独钓——Windows内核编程与信息安全》
// 这个函数必须在DriverEntry中调用,否则cfCurProcName将不起作用。
static size_t s_cf_proc_name_offset = 0;
void cfCurProcNameInit()
{
ULONG i;
PEPROCESS curproc;
curproc = PsGetCurrentProcess();
// 搜索EPROCESS结构,在其中找到字符串
for(i=0;i<3*4*1024;i++)
{
if(!strncmp("System",(PCHAR)curproc+i,strlen("System")))
{
s_cf_proc_name_offset = i;
break;
}
}
}
// 以下函数可以获得进程名。返回获得的长度。
ULONG cfCurProcName(PUNICODE_STRING name)
{
PEPROCESS curproc;
ULONG i,need_len;
ANSI_STRING ansi_name;
if(s_cf_proc_name_offset == 0)
return 0;
// 获得当前进程PEB,然后移动一个偏移得到进程名所在位置。
curproc = PsGetCurrentProcess();
// 这个名字是ansi字符串,现在转化为unicode字符串。
RtlInitAnsiString(&ansi_name,((PCHAR)curproc + s_cf_proc_name_offset));
need_len = RtlAnsiStringToUnicodeSize(&ansi_name);
if(need_len > name->MaximumLength)
{
return RtlAnsiStringToUnicodeSize(&ansi_name);
}
RtlAnsiStringToUnicodeString(name,&ansi_name,FALSE);
return need_len;
}
上面代码是获取进程名。
lkd> dt _EPROCESS
nt!_EPROCESS
+0x000 Pcb : _KPROCESS
+0x06c ProcessLock : _EX_PUSH_LOCK
+0x070 CreateTime : _LARGE_INTEGER
+0x078 ExitTime : _LARGE_INTEGER //这里就是退出时间
.
.
.
|
能力值:
( LV9,RANK:260 )
|
-
-
5 楼
ZwQuerySystemInformation遍历进程,功能号:SystemProcessInformation
退出时间我只会硬编码
|
能力值:
( LV4,RANK:50 )
|
-
-
6 楼
好象只能硬编码 。。。
|
能力值:
( LV5,RANK:70 )
|
-
-
7 楼
ZwQueryInformationProcess
|
能力值:
( LV9,RANK:260 )
|
-
-
8 楼
ZwQueryInformationProcess不能获取退出时间吧
|
|
|