【vc++精品源码栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。
网学会员整理了vc++精品源码-进程模块枚举方法附源码 - 软件工程的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
进程模块枚举方法附源码枚举系统进程是一项很有用的功能,它有很多种实现的方法,仅在 ring3级常见的就有四五种,例如系统快照、psapi API、WTS API、NTDLL 等。
学习各种外挂制作技术,马上去百度搜索 魔鬼作坊 点击第一个站进入、快速成为做挂达人。
本毕业设计程序中我使用的是 paspi API,因为 VC 6.0的 SDK 版本太老,因此使用这个系列函数时需要动态调用,不过我已经从新版本 SDK 中相关的头文件“psapi.h”和静态库文件“paspi.lib”整理出来了,在使用的使用只要将这两个文件包含到自己的工程里,即可直接使用相关函数。
演示程序如下所示:includeincludeinclude psapi.hpragma commentlibpsapi.libint main DWORD ProcessCount DWORD cbNeeded DWORD ProcessId1024 EnumProcessesProcessIdsizeofProcessIdcbNeeded ProcessCount cbNeeded/sizeofDWORD HMODULE hModule char szPathMAX_PATH forDWORD i 0 i ProcessCount i HANDLE hProcess OpenProcessPROCESS_QUERY_INFORMATION PROCESS_VM_READFALSEProcessId ifhProcess EnumProcessModuleshProcesshModulesizeofhModulecbNeeded GetModuleFileNameExhProcesshModuleszPathsizeofszPath printfPID:d tsnProcessId szPath else continue return 0 在上述程序里面,我们首先定义一个 ProcessId1024数组,因为我们不确定系统中的进程数量有多少,但在绝大多数情况下是不可能超过1024个进程的,因此定义一个这么大的数组完全是够用了(当然不排除有极端情况),然后我们调用 EnumProcesses 函数得到系统中的进程信息,它会把所有存在的进程 ID 依次放到 ProcessId 中,然后我们根据它返回的 cbNeeded 计算出进程数目 , (总字节/单个元素的字节)这样我们就可以通过一个循环读出所有的进程信息。
但这样并没有结束,因为这时我们只是得到了进程的 PID 信息,要想得到更详细的信息,还需要调用 EnumProcessModules 函数,它需要传递进去一个 HANDLE 参数,这个参数我们可以通过 OpenProcess 获得,OpenProcess 需要 PID 参数,而 PID 我们已经知道了,因此我们可以最终通过 EnumProcessModules 获得进程的完整路径,它通过第二个参数返回一个模块句柄 HMODULE,我们利用该值调用 GetModuleFileNameEx 函数即可得到完整路径。
下面我们再来看枚举模块信息的方法,枚举进程模块其实是很简单的,我为了偷懒没有再使用 paspi 而是使用了早期的系统快照函数,代码如下所示: MODULEENTRY32 me32 0 me32.dwSize sizeofMODULEENTRY32 BOOL bRet FALSE char szTempMAX_PATH char szFileMAX_PATH HANDLE hModuleSnap CreateToolhelp32SnapshotTH32CS_SNAPMODULEnPId int i 0 bRet Module32FirsthModuleSnapme32 ifbRet m_lstModule.InsertItem0 strFile NULL m_lstModule.SetItemText0 1 Error m_lstModule.SetItemText0 2 strPath whilebRet memsetszTemp0sizeofszTemp memsetszFile0sizeofszFile ExtractFileNameme32.szExePathszFile sprintfszTempdme32.th32ModuleID m_lstModule.InsertItemi szFile NULL m_lstModule.SetItemTexti 1 szTemp m_lstModule.SetItemTexti 2 me32.szExePath i 1 bRet Module32NexthModuleSnapme32 这个方法特别容易使用,我们首先调用 CreateToolhelp32SnapshotTH32CS_SNAPMODULEnPId来获取模块快照,它需要一个参数 nPId 来标识需要枚举的进程,前面我们已经介绍了获取 PID 的方法,而参数 TH32CS _SNAPMODULE 指示系统给我们复制一份指定进程的当前模块列表快照,当然我们还需要通过两个函数把快照信息从链表里面读出:Module32First 和 Module32Next,首先调用 Module32First 函数指向链表中的第一个节点,我们读取完信息后再手动调用 Module32Next 读取下一个节点的内容,知道该函数返回为 NUL L时说明已经到了尽头,退出循环。
以上就简单介绍了如何通过编程来枚举系统进程和指定进程中的模块信息,blogbus 的文章编辑功能不太舒服,因此就不想修改了,代码里面还没有添加注释,懒得加了,自己看吧,反正不难。
程序运行结果如下图所示:
上一篇:
snort源代码分析帮助手册(概要版本)V1.0版本
下一篇:
国外高校后勤用工现状及存在问题研究University Logistics Research question the status quo and the presence of foreign l