• 前面我们曾经介绍过使用PSAPI相关函数枚举进程的方法,但除此之外还有一种方法常用枚举进程的方法,那就是利用ZwQuerySystemInformation函数,这个函数是由NTDLL导出的,但在使用的时候需要我们动态调用,其实该函数的功能很强大,仅仅用来查询进程信息显然是屈才了。
  • Winsock2 SPI允许用户提供两种不同类型的服务提供者:传输者(transport)和名称空间(namespace),而且又同时支持用户开发两种类型的传输服务提供者:基础服务提供者和分层服务提供者。我们一般编写的是分层服务提供者(Layered Transport Provider,LSP)。 Winsock2传输服务提供者是通过标准的Windows动态链接库实现的,在这个动态链接库中必须实现并导出一个名为WSPStartup的函数,在这个函数中会给出其他WSP函数的入口地址分派表。
  • 在Windows XP以上的操作系统,我们很容易实现这个功能,因为操作系统提供了一个名为iphlpapi.dll的动态链接库,它导出了两个函数:AllocateAndGetTcpExTableFromStack和AllocateAndGetUdpExTableFromStack,它们可以输出详尽的信息,包括端口号、地址信息、状态、以及关联进程标识符。
  • 我们主要用到两个函数:EnumServicesStatus和QueryServiceConfig,其中函数EnumServicesStatus可以获取系统中所有服务的基本信息,包括服务名称、显示名称、当前状态,如果想获取更加详细的信息,就需要QueryServiceConfig函数的帮助了,它需要传递一个SC_HANDLE句柄,这个句柄可以用OpenService获得,而OpenService需要的服务名称参数可以通过前面的EnumServicesStatus函数获得,他们配合使用就可以获取非常详尽的信息;
  • 开机自启动的一个最常见方式就是通过【启动】目录,依次单击【开始】——【所有程序】,就能看到【启动】目录,如果它里面有程序的话,这里的程序就会在开机后被自动运行。这个目录在所有用户目录里面都有一个,但只有当前用户和“All Users”这两个用户目录下的【启动】程序才会被启动。这个目录的完整路径是“C:\Documents and Settings\All Users\「开始」菜单\程序\启动”,其中的“All Users”可以被替换成自己的用户名。既然知道了目录的完整路径,我们就可以通过遍历该目录下的所有文件来显示其中存在的启动项了。
  • 枚举系统进程是一项很有用的功能,它有很多种实现的方法,仅在ring3级常见的就有四五种,例如系统快照、psapi API、WTS API、NTDLL等。本毕业设计程序中我使用的是paspi API,因为VC 6.0的SDK版本太老,因此使用这个系列函数时需要动态调用,不过我已经从新版本SDK中相关的头文件“psapi.h”和静态库文件“paspi.lib”整理出来了,在使用的使用只要将这两个文件包含到自己的工程里,即可直接使用相关函数。