能力值:
( LV3,RANK:20 )
在线值:
2 楼
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
typedef unsigned long NTSTATUS;
typedef unsigned short USHORT;
typedef unsigned long ULONG;
typedef unsigned long DWORD;
typedef long LONG;
typedef __int64 LONGLONG;
typedef struct {
USHORT Length;
USHORT MaxLen;
USHORT *Buffer;
} UNICODE_STRING;
struct process_info {
ULONG NextEntryDelta;
ULONG ThreadCount;
ULONG Reserved1[6];
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ProcessName;
ULONG BasePriority;
ULONG ProcessId;
};
typedef NTSTATUS (__stdcall *NtQuerySystemInformation1)(
IN ULONG SysInfoClass,
IN OUT PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG RetLen
);
int main()
{
HINSTANCE hNtDll;
NtQuerySystemInformation1 NtQuerySystemInformation;
NTSTATUS rc;
ULONG ulNeed = 0;
void *buf = NULL;
size_t len = 0;
struct process_info *p ;
int done;
hNtDll = LoadLibrary ("NTDLL");
if (!hNtDll)
return 0;
NtQuerySystemInformation = (NtQuerySystemInformation1)GetProcAddress (hNtDll,
"NtQuerySystemInformation");
if (!NtQuerySystemInformation)
return 0;
do {
len += 0x1000;
buf = realloc (buf, len);
if (!buf)
return 0;
rc = NtQuerySystemInformation (5, buf, len, &ulNeed);
} while (rc == 0xc0000004);// STATUS_INFO_LEN_MISMATCH
if (rc <0) {
free (buf);
return 0;
}
printf("\nProcessName ProcessID");
p = (struct process_info *)buf;
done = 0;
while (!done) {
if ((p->ProcessName.Buffer != 0))
{
printf("\n%-20S%d",p->ProcessName.Buffer,p->ProcessId);
}
done = p->NextEntryDelta == 0;
p = (struct process_info *)(((char *)p) + p->NextEntryDelta);
}
free (buf);
FreeLibrary (hNtDll);
return 0;
}
能力值:
( LV4,RANK:50 )
3 楼
Zw要在内核下调用,Nt可直接调用
能力值:
( LV12,RANK:300 )
4 楼
2楼的代码已经很详细了,主要注意的问题:
1.ZwQuerySystemInformation的第二个参数:
IN OUT PVOID
2.ZwQuerySystemInformation第一次调用必定不成功,从返回的size参数中得到所需要的字节数,然后再重新给pBuffer分配内存,再调用才会成功。
不知道楼主所指的报错,具体是怎么样的,是报什么样的错。