开发文章

获取进程(EXE)已加载模块(dll)

在工作中,可能需要判断某个进程是否加载了指定的DLL,可能你会想到读取pe头的方式获取,但这只能得到静态加载进去的  动态的就无法得到,所谓动态的是指 LoadLibrary函数加载到进程地址空间的

下面的函数将动态获取进程所加载的 DLL

 

C/C++ Code
  1. BOOL  GetProcessModuleNames( DWORD dwPID, std::vector<CString> &vecModuleLists )   
  2. {   
  3.     HANDLE hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE , dwPID);   
  4.   
  5.     if ( INVALID_HANDLE_VALUE == hSnapshot )   
  6.     {   
  7.         return FALSE;   
  8.     }   
  9.   
  10.     MODULEENTRY32  module32;   
  11.   
  12.     module32.dwSize = sizeof(MODULEENTRY32);   
  13.        
  14.     CString str;   
  15.     ::LoadLibrary   
  16.     if ( ::Module32First(hSnapshot, &module32) )   
  17.     {   
  18.         do  
  19.         {   
  20.             str = module32.szModule;   
  21.             vecModuleLists.push_back( str );   
  22.         }while(::Module32Next(hSnapshot, &module32));   
  23.     }   
  24.   
  25.     ::CloseHandle( hSnapshot );   
  26.   
  27.     return TRUE;   
  28. }  

以上函数使用方法

 

C/C++ Code
  1. void CShowProcessModuleDlg::OnBnClickedOk()   
  2. {   
  3.     // TODO: Add your control notification handler code here   
  4.     //OnOK();   
  5.     CString str;   
  6.   
  7.     m_edit_PID.GetWindowText( str );   
  8.   
  9.     DWORD dwPID = _wtol( str );   
  10.   
  11.     if ( 0 == dwPID )   
  12.     {   
  13.         dwPID = ::GetCurrentProcessId();   
  14.     }   
  15.     //提升进程的权限   
  16.     AdvancePrivilegeValue();   
  17.   
  18.     std::vector<CString> vecModuleLists;   
  19.        
  20.     GetProcessModuleNames( dwPID, vecModuleLists );   
  21.        
  22.     m_list.ResetContent();   
  23.   
  24.     forint i=0; i<vecModuleLists.size(); i++ )   
  25.     {   
  26.         m_list.AddString(vecModuleLists[i]);   
  27.     }   
  28.     vecModuleLists.clear();   
  29. }  

 

文章信息

发布时间:2012-05-13

发布者:aquwcw

浏览次数: