源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

c++获取进程信息列表和进程所调用的dll列表

  • 时间:2022-06-11 00:51 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:c++获取进程信息列表和进程所调用的dll列表
[img]http://files.jb51.net/file_images/article/201311/20131124112720.jpg?20131024113217[/img]
[u]复制代码[/u] 代码如下:
// -----------------------// FileName: // ProcessInfo.h // remarks: // 基于应用层实现,有的进程,如杀软进程等获取不到调用的dll列表。 // ----------------------- #pragma once #include <vector> struct ProInfo {     // 保存进程PID     unsigned int uPID;     // 保存进程名     CString strPrceName;     // 保存进程路径     CString strFullPath;     // 保存该进程调用dll名和路径     std::vector<CString> strDLLNameArr; }; class CProcessInfo { private:     // 这个用于提权的     BOOL EnableDebugPrivilege (BOOL fEnable); public:     // 保存进程名     std::vector<ProInfo> strPrceInfoArr;     CProcessInfo();     ~CProcessInfo();     // 获取进程名     void GetProcessName (void); };
[u]复制代码[/u] 代码如下:
// ------------------------------------------------------------------------------------------------------------------------ // FileName: //     ProcessInfo.cpp // remarks: //      基于应用层实现,有的进程,如杀软进程等获取不到调用的dll列表。 // ------------------------------------------------------------------------------------------------------------------------ #include "stdafx.h" #include "ProcessInfo.h" #include "TlHelp32.h" #include "StrSafe.h" #include "Psapi.h" // 防止错误 error LNK2019 #pragma comment(lib, "psapi.lib") CProcessInfo::CProcessInfo() { } CProcessInfo::~CProcessInfo() { } BOOL CProcessInfo::EnableDebugPrivilege(BOOL fEnable) {      BOOL fOk = FALSE;       HANDLE hToken;     // 得到进程的访问令牌     if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,&hToken))     {            TOKEN_PRIVILEGES tp;         tp.PrivilegeCount = 1;         // 查看系统特权值并返回一个LUID结构体         LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);         tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;         // 启用/关闭 特权         AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);         fOk = (GetLastError() == ERROR_SUCCESS);         CloseHandle(hToken);     }     else     {         return 0;     }     return(fOk); } void CProcessInfo::GetProcessName (void) {     HANDLE hProcessSnap = NULL;     HANDLE hProcessDll = NULL;     BOOL bRet = FALSE;     // 初始化dwSize为0,不然Process32First执行失败     PROCESSENTRY32 pe32 = {0};     MODULEENTRY32 me32;     LPVOID lpMsgBuf;     LPVOID lpDisplayBuf;     DWORD dwError;     ProInfo proinfo;     LPCTSTR pszFormat = TEXT("开始服务时遇到错误! %s");     // 创建一个进程快照     if(!EnableDebugPrivilege(1))     {         MessageBox(NULL, _T("提权失败!"), _T("提示"), MB_OK|MB_ICONEXCLAMATION);     }     hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);     if (hProcessSnap == INVALID_HANDLE_VALUE)     {         dwError = GetLastError();         FormatMessage(             FORMAT_MESSAGE_ALLOCATE_BUFFER|             FORMAT_MESSAGE_FROM_SYSTEM|             FORMAT_MESSAGE_IGNORE_INSERTS,             NULL,             dwError,             MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),             LPTSTR(&lpMsgBuf),             0,             NULL);         lpDisplayBuf = (LPVOID)LocalAlloc(             LMEM_ZEROINIT,             (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen(pszFormat))*sizeof(TCHAR));         // 格式化字符串         StringCchPrintf(             (LPTSTR)lpDisplayBuf,             LocalSize(lpDisplayBuf),            // 字节数             pszFormat,             lpMsgBuf);         CString strTemp;         strTemp.Format(TEXT("错误编码为:%d"), dwError);         ::MessageBox(NULL, (LPCTSTR)lpDisplayBuf, strTemp, MB_OK|MB_ICONEXCLAMATION);         // 清理分配的内存         LocalFree(lpMsgBuf);         LocalFree(lpDisplayBuf);         return;     }     pe32.dwSize = sizeof(PROCESSENTRY32);     Module32First(hProcessSnap, &me32);     if (Process32First(hProcessSnap, &pe32))     {         do         {                 WCHAR path[MAX_PATH]={0};             proinfo.uPID = pe32.th32ProcessID;             proinfo.strPrceName = pe32.szExeFile;             HMODULE hModule;             HANDLE hProcess;             DWORD needed;             hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, pe32.th32ProcessID);             if (hProcess)             {                 // 枚举进程                 EnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed);                 // 获取进程的全路径                 GetModuleFileNameEx(hProcess, hModule, path, sizeof(path));                 // 保存路径                 proinfo.strFullPath = path;             }             else             {                 proinfo.strFullPath = _T("无法获得进程路径");             }             strPrceInfoArr.push_back(proinfo);         }         while (Process32Next(hProcessSnap, &pe32));     }     std::vector<ProInfo>::iterator iter;     for (iter = strPrceInfoArr.begin(); iter != strPrceInfoArr.end(); iter++)     {         // 获取该进程的快照         hProcessDll = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, iter->uPID);         me32.dwSize = sizeof(MODULEENTRY32);         if (!Module32First(hProcessDll, &me32 ) || iter->uPID==0)         {             continue;         }         do         {              iter->strDLLNameArr.push_back(me32.szExePath);         }         while( Module32Next(hProcessDll, &me32));     }     // 关闭特权     EnableDebugPrivilege(0);     // 关闭内核对象     CloseHandle(hProcessSnap ); }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部