获取所有进程的映像路径以及命令行参数

来源:互联网 发布:js获取css样式 编辑:程序博客网 时间:2024/05/22 00:12

/*****************************************************************************************
    在网上,我们似乎很难找到关于获取其他进程命令行的方案或源代码,呵呵~,反正我找了很久还是找不着~~~。废话就不说了,开始进入正题。
    我们知道,如果获取本进程命令行的话,可以通过调用 GetCommandLine 获得, GetCommandLine 返回的是LPTSTR类型的数据,该返回值便是本进程命令行的内存首地址。那么,我们可以让远程执行 GetCommandLine 这个函数,然后获取远程进程中这个函数的返回值,再通过 ReadProcessMemory 把远程进程的命令行读出来就得到我们想要的了。
    具体实现步骤如下:
        1、通过 GetProcAddress 取得 GetCommandLineA 的地址。
        2、用 CreateRemoteThread 启动远程线程,使远程进程执行 GetCommandLineA 。
        3、用 WaitForSingleObject 等待远程线程结束。
        4、用 GetExitCodeThread 取得远程线程退出代码,其实就是远程进程中 GetCommandLineA 函数的返回值,这是远程进程命令行的首地址。
        5、通过 GetProcAddress 取得 lstrlenA 的地址。
        6、用 CreateRemoteThread 启动远程线程,使远程进程执行 lstrlenA 。
        7、用 WaitForSingleObject 等待远程线程结束。
        8、用 GetExitCodeThread 取得远程线程退出代码,其实就是远程进程中 lstrlenA 函数的返回值,这是远程进程命令行的文本长度。
        9、使用 ReadProcessMemory 把远程进程的命令行读取出来。
        10、收工!
 ·若要转载,请保持该文章的完整性。
******************************************************************************************/

//////////////////////////////////////////////////////////////////////////////////////////
//功能:获取所有进程的映像路径以及命令行参数                                           
//作者:梁增健(lzj85@163.com)                                                          
//MyQQ:184186651                                                                      
//日期:2007.06.11                                                                     
//////////////////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <tlhelp32.h>
#include <iostream.h>

//定义命令行信息结构体
typedef struct tagCOMMANDLINEINFO {
 DWORD dwDestCommand_addr;  //目标进程命令行的起始地址
 DWORD iDestCommandLength;  //目标进程命令行的长度
} COMMANDLINEINFO;

//函数声明
BOOL UpgradeProcessPrivilege(HANDLE, LPCTSTR);
BOOL GetProcessCommandLineInfo(HANDLE, COMMANDLINEINFO *);

//主函数
int main( int argc, char *argv[ ], char *envp[ ] )
{
 UpgradeProcessPrivilege(GetCurrentProcess(),SE_DEBUG_NAME); //提升本进程的权限

 HANDLE hSnapshot, hProcess;
 hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); //创建进程快照
 
 PROCESSENTRY32 pe;
 ZeroMemory(&pe,sizeof(PROCESSENTRY32));
 pe.dwSize = sizeof(PROCESSENTRY32);
 BOOL bFirstProcess = TRUE, bSucceed = FALSE;
 do
 {
  if(bFirstProcess)
   bFirstProcess = !(bSucceed = Process32First(hSnapshot, &pe)); //获取第一个进程的信息
  else
   bSucceed = Process32Next(hSnapshot, &pe); //获取下一个进程的信息
  if(bSucceed)
  {
   hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID); //打开进程
   if(hProcess!=0)
   {
    char *strDestCommand;
    COMMANDLINEINFO cli;
    ZeroMemory(&cli, sizeof(COMMANDLINEINFO));
    if(GetProcessCommandLineInfo(hProcess,&cli)) //获取进程的命令行信息
    {
     try
     {
      strDestCommand = new char[cli.iDestCommandLength + 1];
      ZeroMemory(strDestCommand, cli.iDestCommandLength + 1);
      //读取目标进程的命令行文本
      ReadProcessMemory ( hProcess,
       (const void *)cli.dwDestCommand_addr,
       strDestCommand,
       cli.iDestCommandLength,
       NULL);
      cout<<"程序名:"<<pe.szExeFile<<"/n命令行:"<<strDestCommand<<"/n"<<endl;
      delete []strDestCommand;
     }
     catch(...)
     {
      cout<<"发生异常!/n"<<endl;
     }
    }
    else
    {
     cout<<"程序名:"<<pe.szExeFile<<"/n"<<endl;
    }
    CloseHandle(hProcess); //关闭进程句柄
   }
  }
 }while(bSucceed);
 CloseHandle(hSnapshot);  //关闭快照句柄

 return 0;
}

/****************************************************************************************/
/*****************************************子程序*****************************************/
/****************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////
//名称:UpgradeProcessPrivilege                                                        
//功能:提升进程权限                                                                   
//作者:梁增健(lzj85@163.com)                                                          
//MyQQ:184186651                                                                      
//日期:2007.06.11                                                                     
//////////////////////////////////////////////////////////////////////////////////////////
BOOL UpgradeProcessPrivilege(HANDLE hProcess,
        LPCTSTR lpPrivilegeName = SE_DEBUG_NAME)
{
 HANDLE hToken = NULL;
 if(OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, &hToken))
 {
  LUID Luid;
  if(LookupPrivilegeValue(NULL, lpPrivilegeName, &Luid))
  {
   TOKEN_PRIVILEGES tp;
   tp.PrivilegeCount = 1;
   tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
   tp.Privileges[0].Luid = Luid;
   return( AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL) );
  }
 }
 return FALSE;
}

//////////////////////////////////////////////////////////////////////////////////////////
//名称:GetProcessCommandLineInfo                                                      
//功能:获取进程命令行信息                                                             
//作者:梁增健(lzj85@163.com)                                                          
//MyQQ:184186651                                                                      
//日期:2007.06.11                                                                     
//////////////////////////////////////////////////////////////////////////////////////////
BOOL GetProcessCommandLineInfo(HANDLE hProcess, COMMANDLINEINFO *CommandLineInfo)
{
 if(IsBadReadPtr(CommandLineInfo,sizeof(COMMANDLINEINFO))) //判断指针是否有效
  return FALSE;

 FARPROC GetCommandLineA_addr, lstrlenA_addr;
 HANDLE hThread;

 //获取 GetCommandLineA 的地址
 GetCommandLineA_addr = GetProcAddress(GetModuleHandle("Kernel32.dll"), "GetCommandLineA");
 if(GetCommandLineA_addr == 0)
  return FALSE;
 //启动远程线程,使远程进程执行 GetCommandLineA 函数
 hThread = CreateRemoteThread(hProcess, NULL, 0,
  (LPTHREAD_START_ROUTINE)GetCommandLineA_addr,NULL, 0, NULL);
 if(hThread == 0)
  return FALSE;
 WaitForSingleObject (hThread, INFINITE); //等待远程线程结束
 //作者:梁增健  Email:lzj85@163.com  MyQQ:184186651
 //获取远程 GetCommandLineA 的返回值,若正常返回,则该值为远程进程命令行的首地址
 GetExitCodeThread (hThread, &(CommandLineInfo->dwDestCommand_addr));
 CloseHandle (hThread);
 if(CommandLineInfo->dwDestCommand_addr == 0)
  return FALSE;

 //获取 lstrlenA 的地址
 lstrlenA_addr = GetProcAddress( GetModuleHandle ("Kernel32.dll"), "lstrlenA");
 if(GetCommandLineA_addr == 0)
  return FALSE;
 //启动远程线程,使远程进程执行 lstrlenA 函数
 hThread = CreateRemoteThread(hProcess, NULL, 0,(LPTHREAD_START_ROUTINE)lstrlenA_addr,
  (void *)CommandLineInfo->dwDestCommand_addr, 0, NULL);
 if(hThread == 0)
  return FALSE;
 WaitForSingleObject (hThread, INFINITE);
 //获取远程 lstrlenA 的返回值,若正常返回,则该值为远程进程命令行文本的长度
 GetExitCodeThread (hThread, &(CommandLineInfo->iDestCommandLength));
 CloseHandle (hThread);

 return TRUE;
}
/*************************************************************************************/
/****************************************子程序***************************************/
/*************************************************************************************/ 

源代码下载:http://download1.csdn.net/down3/20070611/11010645834.rar