找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 5495|回复: 2

发几个R3枚举进程的代码

[复制链接]

21

主题

110

回帖

4

精华

铂金会员

积分
7522
发表于 2012-2-12 20:20:52 | 显示全部楼层 |阅读模式
本帖最后由 KMSRussian 于 2012-2-12 20:28 编辑

还有R3下的方法没涉及到CoCreateInstance(),ConnectServer(),ExecQuery()等
  1. ///////////////////////////////////////////////////////////////
  2. // 02ProcessList.cpp文件


  3. #include "stdafx.h"
  4. #include <windows.h>
  5. #include <tlhelp32.h> // 声明快照函数的头文件

  6. int main(int argc, char* argv[])
  7. {
  8.         PROCESSENTRY32 pe32;
  9.         // 在使用这个结构之前,先设置它的大小
  10.         pe32.dwSize = sizeof(pe32);
  11.        
  12.         // 给系统内的所有进程拍一个快照
  13.         HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  14.         if(hProcessSnap == INVALID_HANDLE_VALUE)
  15.         {
  16.                 printf(" CreateToolhelp32Snapshot调用失败! \n");
  17.                 return -1;
  18.         }
  19.        
  20.         // 遍历进程快照,轮流显示每个进程的信息
  21.         BOOL bMore = ::Process32First(hProcessSnap, &pe32);
  22.         while(bMore)
  23.         {
  24.                 printf(" 进程名称:%s \n", pe32.szExeFile);
  25.                 printf(" 进程ID号:%u \n\n", pe32.th32ProcessID);

  26.                 bMore = ::Process32Next(hProcessSnap, &pe32);
  27.         }

  28.         // 不要忘记清除掉snapshot对象
  29.         ::CloseHandle(hProcessSnap);
  30.         return 0;
  31. }
复制代码
  1. #include "windows.h"
  2. #include <stdio.h>
  3. #include <iostream.h>
  4. #include <tchar.h>
  5. typedef bool (_stdcall *EnumProcesses)(DWORD* pProcessIds, DWORD cb, DWORD* pBytesReturned );
  6. typedef bool (_stdcall *EnumProcessModules)(HANDLE hProcess,HMODULE* lphModule,DWORD cb,LPDWORD lpcbNeeded);
  7. typedef DWORD  (_stdcall *GetModuleFileNameEx)( HANDLE hProcess, HMODULE hModule,LPTSTR lpFilename, DWORD nSize);
  8. typedef DWORD (_stdcall *GetModuleBaseName)( HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName,  DWORD    nSize);



  9. HMODULE h1=LoadLibrary("PSAPI.DLL");
  10. EnumProcesses pEnumProcesses=(EnumProcesses)::GetProcAddress(h1,"EnumProcesses");  //注意大小写
  11. EnumProcessModules pEnumProcessModules =(EnumProcessModules)GetProcAddress(h1, "EnumProcessModules");
  12. GetModuleFileNameEx pGetModuleFileNameEx =(GetModuleFileNameEx)GetProcAddress(h1, "GetModuleFileNameExA");
  13. GetModuleBaseName pGetModuleBaseName=(GetModuleBaseName)GetProcAddress(h1,"GetModuleBaseNameA");



  14. //注意第三个函数名GetModuleFileNameExA,在Dll里有以A和W结尾区分函数,A指采用的是ANSI字符串方式,W则是UNICODE方式。于是,我们可以用下面的语句枚举进程:

  15. bool RaisePrivilege()
  16. {
  17.         HANDLE hToken = NULL;
  18.         bool bRes = OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken );
  19.         if( !bRes )
  20.         {
  21.                 cout<<"OpenProcessToken"<<endl;
  22.                 return false;
  23.         }
  24.         TOKEN_PRIVILEGES tps = {0};
  25.         LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &tps.Privileges[0].Luid );
  26.         tps.PrivilegeCount = 1;
  27.         tps.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  28.        
  29.         bRes = AdjustTokenPrivileges( hToken, false, &tps, sizeof(tps), NULL, NULL );
  30.         if( bRes == 0 )
  31.         {
  32.                 cout<<"AdjustTokenPrivileges false"<<endl;
  33.                 return false;
  34.         }
  35.        
  36.         CloseHandle( hToken );
  37.         return true;
  38. }

  39. void GetProcessPathById( DWORD PId )
  40. {
  41.         TCHAR szProcessName[MAX_PATH] = _T("_Unknow_");
  42.         bool bRes = RaisePrivilege();
  43.         if( bRes )
  44.         {
  45.                 HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, false, PId );
  46.                 DWORD dw = GetLastError();
  47.                 if( hProcess != NULL )
  48.                 {
  49.                         HMODULE hModule = NULL;
  50.                         //DWORD dw = 0;
  51.                         bool bGetModule = pEnumProcessModules( hProcess, &hModule, sizeof(HMODULE), &dw );

  52.                         dw = GetLastError();
  53.                         if( bGetModule )
  54.                         {
  55.                                 int len = pGetModuleBaseName( hProcess, hModule, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) );
  56.                                
  57.                         }
  58.                 }
  59.                 CloseHandle( hProcess );
  60.         }
  61.         cout<<"PId:"<<PId<<"\t"<<"PathNam:"<<szProcessName<<endl;
  62.        
  63. }

  64. void main()
  65. {
  66.         DWORD dProcessIds[1024] = {0};
  67.         DWORD dRet = 0;
  68.         DWORD dRes = 0;
  69.        
  70.         dRes = pEnumProcesses( dProcessIds, sizeof(dProcessIds), &dRet );
  71.         if( dRes == 0 )
  72.         {
  73.                 cout<<"EnumProcesses1 False"<<endl;
  74.                 return;
  75.         }
  76.         int ProcessNums = dRet/sizeof(DWORD);
  77.        
  78.         for( int i = 0; i < ProcessNums; i++ )
  79.                 GetProcessPathById( dProcessIds[i] );
  80.        
  81.         cout<<"Process Nums:"<<ProcessNums<<endl;
  82.         FreeLibrary(h1);
  83. }
复制代码
  1. #include "windows.h"
  2. #include <stdio.h>
  3. #include <iostream.h>
  4. #include <tchar.h>
  5. //声明一下psapi.dll中包含的这几个函数
  6. typedef bool (_stdcall *EnumProcesses)( DWORD* pProcessIds, DWORD cb,DWORD* pBytesReturned );
  7. typedef bool (_stdcall *EnumProcessModules)(HANDLE hProcess,HMODULE* lphModule,DWORD cb,LPDWORD lpcbNeeded
  8. );
  9. typedef DWORD  (_stdcall *GetModuleFileNameEx)( HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename,DWORD nSize
  10. );
  11. typedef DWORD (_stdcall *GetModuleBaseName)(HANDLE hProcess,HMODULE hModule,LPTSTR lpBaseName,DWORD nSize
  12. );
  13. typedef DWORD  (_stdcall *GetProcessImageFileName)( HANDLE hProcess, LPTSTR lpImageFileName,  DWORD nSize );





  14. HMODULE h1=LoadLibrary("PSAPI.DLL");
  15. EnumProcesses pEnumProcesses=                 (EnumProcesses)::GetProcAddress(h1,"EnumProcesses");  //注意大小写
  16. EnumProcessModules pEnumProcessModules =      (EnumProcessModules)GetProcAddress(h1, "EnumProcessModules");
  17. GetModuleFileNameEx pGetModuleFileNameEx =    (GetModuleFileNameEx)GetProcAddress(h1, "GetModuleFileNameExA");
  18. GetModuleBaseName pGetModuleBaseName=         
  19. (GetModuleBaseName)GetProcAddress(h1,"GetModuleBaseNameA");
  20. GetProcessImageFileName pGetProcessImageFileName=(GetProcessImageFileName)GetProcAddress(h1,"GetProcessImageFileNameA");
  21. //注意第三个函数名GetModuleFileNameExA,在Dll里有以A和W结尾区分函数,A指采用的是ANSI字符串方式,W则是UNICODE方式。于是,我们可以用下面的语句枚举进程:
  22. //不要忘记使用FreeLibrary 好多人都不使用
  23. bool RaisePrivilege()
  24. {
  25.         HANDLE hToken = NULL;
  26.         bool bRes = OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken );
  27.         if( !bRes )
  28.         {
  29.                 cout<<"OpenProcessToken"<<endl;
  30.                 return false;
  31.         }
  32.         TOKEN_PRIVILEGES tps = {0};
  33.         LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &tps.Privileges[0].Luid );
  34.         tps.PrivilegeCount = 1;
  35.         tps.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  36.        
  37.         bRes = AdjustTokenPrivileges( hToken, false, &tps, sizeof(tps), NULL, NULL );
  38.         if( bRes == 0 )
  39.         {
  40.                 cout<<"AdjustTokenPrivileges false"<<endl;
  41.                 return false;
  42.         }
  43.        
  44.         CloseHandle( hToken );
  45.         return true;
  46. }

  47. void GetProcessPathById( DWORD PId )
  48. {
  49.         TCHAR szProcessName[MAX_PATH] = _T("_Unknow_");
  50.         bool bRes = RaisePrivilege();
  51.         if( bRes )
  52.         {
  53.                 HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, false, PId );
  54.                 DWORD dw = GetLastError();
  55.                 if( hProcess != NULL )
  56.                 {
  57.                         HMODULE hModule = NULL;
  58.                         //DWORD dw = 0;
  59.                         bool bGetModule = pEnumProcessModules( hProcess, &hModule, sizeof(HMODULE), &dw );
  60.                         dw = GetLastError();
  61.                         if( bGetModule )
  62.                         {
  63.                                 int len = pGetModuleBaseName( hProcess, hModule, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) );
  64.                         }
  65.                 }
  66.                 CloseHandle( hProcess );
  67.         }
  68.         cout<<"PId:"<<PId<<"\t"<<"PathNam:"<<szProcessName<<endl;
  69.        
  70. }

  71. void main()
  72. {
  73.         //提升进程权限
  74.         RaisePrivilege();
  75.         for( int i = 0; i <0xffff; i++ )
  76.         {
  77.                 HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, false, i );
  78.                 if( hProcess )
  79.                 {
  80.                         char ProcessName[MAX_PATH] = {0};
  81.                         pGetProcessImageFileName( hProcess, ProcessName, MAX_PATH );
  82.                        
  83.                         cout<<"PID:"<<i<<"\t"<<"Path:"<<ProcessName<<endl;
  84.                 }
  85.         }
  86.         ::FreeLibrary(h1);
  87. }
复制代码
  1. #include "windows.h"
  2. #include <stdio.h>
  3. #include <iostream.h>
  4. #include <tchar.h>
  5. typedef struct _WTS_PROCESS_INFO {  
  6.         DWORD SessionId;  
  7.         DWORD ProcessId;  
  8.         LPTSTR pProcessName;  
  9.         PSID pUserSid;
  10. } WTS_PROCESS_INFO,  *PWTS_PROCESS_INFO;
  11. typedef HANDLE (_stdcall *WTSOpenServer)( LPTSTR pServerName );

  12. typedef bool (_stdcall *WTSEnumerateProcesses)(HANDLE hServer, DWORD Reserved, DWORD Version, PWTS_PROCESS_INFO*  ppProcessInfo, DWORD* pCount);
  13. //存放我们要的进程名和ID 存放ppProcessInfo里面WTS_PROCESS_INFO结构数量指针



  14. HMODULE h1=LoadLibrary("wtsapi32.dll");
  15. WTSOpenServer         pWTSOpenServer          =(WTSOpenServer)GetProcAddress(h1,"WTSOpenServerA");
  16. WTSEnumerateProcesses pWTSEnumerateProcesses  =
  17. (WTSEnumerateProcesses)GetProcAddress(h1,"WTSEnumerateProcessesA");

  18. void main()
  19. {
  20.         char *szServerName="Li";  
  21.         HANDLE        h2=pWTSOpenServer(szServerName);
  22.         PWTS_PROCESS_INFO pWtspi;
  23.         DWORD dwCount;
  24.         if(!pWTSEnumerateProcesses(h2,0,1,&pWtspi,&dwCount))
  25.         {
  26.                 printf("enum process error: %d\n",GetLastError());
  27.                 return;
  28.         };
  29.         for (int i=0; i<dwCount;i++)
  30.         {
  31.                 printf("PsId: %d\t\tPsName: %s\n",pWtspi[i].ProcessId,pWtspi[i].pProcessName);
  32.         }
  33.        
  34. }









复制代码

21

主题

110

回帖

4

精华

铂金会员

积分
7522
 楼主| 发表于 2012-2-12 20:32:47 | 显示全部楼层
killvxk的驱动查进程:
1.native api获得进程表a
2.通过activelist获得进程表b
3.通过pspCidTable获得进程表c
4.通过handletablelisthead获得进程表d
5.通过csrss的handletable用2种方法枚举获得进程表e和f
6.通过扫描当前进程的handletable获得进程表g
7.遍历表c的每一个进程的SessionProcessLinks获得进程表h
8.遍历表c的每一个进程Vm.WorkingSetExpansionLinks获得进程表i
9.通过Typelist分别取process和thread的表j和表k
10.通过表k得到进程表l
11.搜索内存中的threadobject和processobject得到进程表m
12.通过Wait/Dispatch得到进程表n
13.如果系统是Win2003以上遍历表c的每一个进程的MmProcessLinks得到表o
14.综合上面的进程表得到表p
15.对表p每一个进程做HandleTable,Vm.WorkXX,MmProcessXX,SessionProcessList扫描得到表q
16.枚举HWNDHandle得到进程表r
17.枚举JobObject得到表s
18.综合得表t,此时枚举结束~~
有空再整理下 上面这些

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2013-6-21 21:49:45 | 显示全部楼层
LZ好久没来了啊。

WIN64系统上在R0隐藏进程直接引发蓝屏,终结了“进程捉迷藏”这种无聊的游戏。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表