怎么获取进程 C++

想通过C++对一个进程进行操作设想的是:对所有进程进行一次遍历,然后得到目标进程的ID,然后操作的参数就是那个ID,怎么样来实现呢... 想通过C++对一个进程进行操作
设想的是:
对所有进程进行一次遍历,然后得到目标进程的ID,然后操作的参数就是那个ID,怎么样来实现呢
展开
 我来答
匿名用户
2013-07-18
展开全部
DWORD GetProcessIdFromName(LPCTSTR name) //通过执行文件名获得进程ID的方法
{
PROCESSENTRY32 pe;
DWORD id = 0;

HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
pe.dwSize = sizeof(PROCESSENTRY32);
if( !Process32First(hSnapshot,&pe) )
return 0;

do
{
pe.dwSize = sizeof(PROCESSENTRY32);
if( Process32Next(hSnapshot,&pe)==FALSE )
break;
if(strcmp(pe.szExeFile,name) == 0)
{
id = pe.th32ProcessID;
break;
}

} while(1);

CloseHandle(hSnapshot);

return id;
}

上面的函数通过程序获取ID
有这个ID就可以操作这个进程了
比如,关闭一个进程:QQ.exe

DWORD dwQQID = GetProcessIdFromName("QQ.exe");
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwQQID); //打开进程
if(!hProcess)
{
TerminateProcess(hProecss, 0); //关闭进程
}
CloseHandle(hProcess);
匿名用户
2013-07-18
展开全部
#include " stdafx.h "
#include " Injection.h "
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// 唯一的应用程序对象

CWinApp theApp;

using namespace std;

typedef struct _RemotePara{ // 参数结构
char pMessageBox[ 12 ];
DWORD dwMessageBox;
}RemotePara;
// 远程线程
DWORD __stdcall ThreadProc (RemotePara * lpPara){
typedef int (__stdcall * MMessageBoxA)(HWND,LPCTSTR,LPCTSTR,DWORD); // 定义MessageBox函数
MMessageBoxA myMessageBoxA;
myMessageBoxA = (MMessageBoxA) lpPara -> dwMessageBox ; // 得到函数入口地址
myMessageBoxA(NULL,lpPara -> pMessageBox ,lpPara -> pMessageBox, 0 ); // call
return 0 ;
}
void EnableDebugPriv(); // 提升应用级调试权限

int _tmain( int argc, TCHAR * argv[], TCHAR * envp[])
{
const DWORD THREADSIZE = 1024 * 4 ;
DWORD byte_write;
EnableDebugPriv(); // 提升权限
HANDLE hWnd = ::OpenProcess (PROCESS_ALL_ACCESS,FALSE, 760 );
if ( ! hWnd) return 0 ;
void * pRemoteThread = ::VirtualAllocEx(hWnd, 0 ,THREADSIZE,MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);
if ( ! pRemoteThread) return 0 ;
if ( ! ::WriteProcessMemory(hWnd,pRemoteThread, & ThreadProc,THREADSIZE, 0 ))
return 0 ;

// 再付值
RemotePara myRemotePara;
::ZeroMemory( & myRemotePara, sizeof (RemotePara));
HINSTANCE hUser32 = ::LoadLibrary ( " user32.dll " );
myRemotePara.dwMessageBox = (DWORD) ::GetProcAddress (hUser32 , " MessageBoxA " );
strcat(myRemotePara.pMessageBox, " hello\0 " );
// 写进目标进程
RemotePara * pRemotePara = (RemotePara * ) ::VirtualAllocEx (hWnd , 0 , sizeof (RemotePara),MEM_COMMIT,PAGE_READWRITE); // 注意申请空间时的页面属性
if ( ! pRemotePara) return 0 ;
if ( ! ::WriteProcessMemory (hWnd ,pRemotePara, & myRemotePara, sizeof myRemotePara, 0 )) return 0 ;

// 启动线程
HANDLE hThread = ::CreateRemoteThread (hWnd , 0 , 0 ,(DWORD (__stdcall * )( void * ))pRemoteThread ,pRemotePara, 0 , & byte_write);
if ( ! hThread){
return 0 ;
}
return 0 ;
}

void EnableDebugPriv( void )
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;

if ( ! OpenProcessToken( GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, & hToken ) )
return ;
if ( ! LookupPrivilegeValue( NULL, SE_DEBUG_NAME, & sedebugnameValue ) ){
CloseHandle( hToken );
return ;
}
tkp.PrivilegeCount = 1 ;
tkp.Privileges[ 0 ].Luid = sedebugnameValue;
tkp.Privileges[ 0 ].Attributes = SE_PRIVILEGE_ENABLED;
if ( ! AdjustTokenPrivileges( hToken, FALSE, & tkp, sizeof tkp, NULL, NULL ) )
CloseHandle( hToken );
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式