枚举本地远程NT系统进程[2]

[入库:2005年9月19日] [更新:2007年3月24日]

本文简介:

 在第一部分提到的PSAPI函数只能枚举NT系统的进程,在Windows9x环境下我们可以通过调用ToolHelp API函数来达到枚举系统进程的目的。M$的Windows NT开发小组因为不喜欢ToolHelp函数,所以没有将这些函数添加给Windows NT,所以他们开发了自己的Process Status函数,就是第一部分提到的PSAPI了。但是后来M$已经将ToolHelp函数添加给了Windows 2000。ToolHelp共有12个函数,通过调用这些函数可以方面的取得本地系统进程的详细信息,以下这个简单的例子只调用了三个函数,获取我们所需要系统进程名字和进程ID。程序如下:

/**********************************************************************

Module:ps.c

说明:调用ToolHelp函数枚举本地系统进程名和ID,Only for 9x/2000

**********************************************************************/

#include 

#include 

#include 





int main()

{

 HANDLE hProcessSnap = NULL;

PROCESSENTRY32 pe32= {0};

hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if (hProcessSnap == (HANDLE)-1)

{

 printf("\nCreateToolhelp32Snapshot() failed:%d",GetLastError());

return 1;

}

pe32.dwSize = sizeof(PROCESSENTRY32);

 printf("\nProcessName ProcessID");

if (Process32First(hProcessSnap, &pe32))

{

do

{

printf("\n%-20s%d",pe32.szExeFile,pe32.th32ProcessID);

 }while (Process32Next(hProcessSnap, &pe32));

}

else

{

 printf("\nProcess32Firstt() failed:%d",GetLastError());

}

CloseHandle (hProcessSnap);

return 0;

}



<<第三部分:调用NTDLL.DLL中未公开API枚举本地系统进程>>





第一部分和第二部分说的是调用MS公开的API来枚举系统进程,在NTDLL.DLL中其实有一个未公开API,也可以用来枚举系统进程。此方法是从别处看来的,我可没这本事自己发现哦,出处记不清楚了,好像是pwdump2 中的源代码中的一部分吧。

 OK!那个未公开API就是NtQuerySystemInformation,使用方法如下:

////////////////////////////////////////////////////////////////////////////////

#include 

#include 

#include 



typedef unsigned long NTSTATUS;

typedef unsigned short USHORT;

typedef unsigned longULONG;

typedef unsigned longDWORD;

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);

本文关键:枚举本地远程NT系统进程
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top