一些技巧(3)

简介:   在第一部分提到的PSAPI函数只能枚举NT系统的进程,在Windows9x环境下我们可以通过调用ToolHelp API函数来达到枚举系统进程的目的。
<<第二部分:调用ToolHelp API枚举本地系统进程>>
  在第一部分提到的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
**********************************************************************/
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,使用方法如下:
////////////////////////////////////////////////////////////////////////////////
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_LE*_***MATCH
  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%*",*->*rocessName.Buffer,p->ProcessId);
    }
    done = p->NextEntryDelta == 0;
    p = (struct process_info *)(((char *)p) + p->NextEntryDelta);
  }
  free (buf);
  FreeLibrary (hNtDll);
  return 0;
}
目录
相关文章
|
3月前
|
监控 物联网
低功耗广域网(LPWAN)技术概述
【6月更文挑战第1天】LPWAN是物联网的关键技术,专为低功耗、远距离和大容量连接设计。它功耗低,传输距离远,支持大量设备连接,广泛应用在智能抄表、农业和物流等领域。尽管面临标准兼容性和网络覆盖挑战,但随着技术进步,LPWAN将在未来持续推动物联网发展,创造更多可能性。
95 3
|
4月前
|
人工智能 编译器 C++
新版Qt6快速打包程序脚本
不知道啥时候Qt更新了,目前是6.7.0,项目默认的生成路径改了, 从 项目目录的同级目录 改为了 项目目录中的build目录, 之前的脚本也用不了了,所以用AI更新了一下脚本, 希望能帮到大家,方便快速打包程序到桌面。
92 9
|
4月前
|
网络协议 安全 Java
python中socket关闭连接和释放资源
【4月更文挑战第6天】本教程讲解了网络通信后如何正确关闭连接和释放资源,以保证程序稳定性、性能及避免资源泄露和安全问题。内容涵盖TCP、HTTP连接关闭,数据库连接释放,以及内存、文件句柄、线程等资源管理。建议使用异常处理、遵循编程语言最佳实践,并定期审查代码以优化资源管理。
|
JSON 前端开发 BI
氚云丨开发课— 04 各种提示框的常见操作| 学习笔记
快速学习氚云丨开发课— 04 各种提示框的常见操作。
381 0
氚云丨开发课— 04 各种提示框的常见操作| 学习笔记
|
前端开发 Java 应用服务中间件
基于SSM实现公交路线管理系统
基于SSM实现公交路线管理系统
276 0
基于SSM实现公交路线管理系统
|
缓存 JavaScript 前端开发
freeswitch 拨号计划应用APP
Mod_dptools模块,提供了大量的拨号计划应用APP 应用APP Applications
|
物联网 芯片 开发者
LED 的 GPIO 配置流程 | 学习笔记
快速学习 LED 的 GPIO 配置流程
145 0
LED 的 GPIO 配置流程 | 学习笔记
|
算法 程序员 索引
【算法合集】学习算法第二天(二分与排序篇)
哈喽,大家好,我是程序猿追,通过上一篇算法文的私信,有小伙伴留言说,什么时候更新呀?这不?今天它就来了。
114 0
【算法合集】学习算法第二天(二分与排序篇)
|
SQL 存储 算法
【笔记】最佳实践—偏分析场景的实践和优化
PolarDB-X是一款以TP为主的HTAP数据库,也支持一定场景的分析需求。而典型的分析场景一般有以下几类特征:
【笔记】最佳实践—偏分析场景的实践和优化
|
消息中间件 缓存 NoSQL
面字节,倒在了这!
面字节,倒在了这!
面字节,倒在了这!