技術标簽:挂起方式建立程序 核心句柄表 安全屬性
程式工能說明:通過process.exe建立出兩個程序(run.exe ie.exe),實作通過run.exe控制ie。将run.cpp編譯後将生成的exe路徑複制process.cpp的相應位置,編譯process.cpp并運作完成整個Demo測試,觀察運作的結果。(一個cpp一個項目不要寫到一個項目内)
工具: vs 2008
*字元集:使用多位元組字元集(不用會報錯)
// process.cpp
#include "stdafx.h"
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
char szBuffer[256] = {0};
char szHandle[8] = {0};
SECURITY_ATTRIBUTES ie_sa_p = {0};//
ie_sa_p.nLength = sizeof(ie_sa_p);
ie_sa_p.lpSecurityDescriptor = NULL;
ie_sa_p.bInheritHandle = TRUE;//預設為flase 設定為true則句柄表可繼承
SECURITY_ATTRIBUTES ie_sa_t = {0};
ie_sa_t.nLength = sizeof(ie_sa_t);
ie_sa_t.lpSecurityDescriptor = NULL;
ie_sa_t.bInheritHandle = TRUE;
STARTUPINFO ie_si = {0};
PROCESS_INFORMATION ie_pi;
ie_si.cb = sizeof(ie_si);
TCHAR szCmdLine[] = TEXT("C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe www.baidu.com");
//第三與第四個屬性為安全屬性,可以簡單的了解為未設定為true時目前建立線程、程序的核心句柄表不可被繼承
//打開IE
CreateProcess(
NULL,
szCmdLine,
&ie_sa_p,//程序安全屬性 程序表可被繼承
&ie_sa_t,//線程安全屬性 線程表可被繼承
FALSE,//為true時代表此程序可被繼承
CREATE_NEW_CONSOLE,
NULL,
NULL,
&ie_si,
&ie_pi);
sprintf(szHandle, "%x %x", ie_pi.hProcess, ie_pi.hThread);
sprintf(szBuffer, TEXT("run.exe %s"), szHandle);//拼接cmdLine 将程序和線程的參數拼接到run.exe
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
si.cb = sizeof(si);
//建立程序run.exe控制之前建立的ie
CreateProcess(
NULL,
szBuffer,
NULL,
NULL,
TRUE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&si,
&pi);
return 0;
}
// run.cpp
#include "stdafx.h"
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwProcessHandle = -1;
DWORD dwThreadHandle = -1;
char szBuffer[256] = {0};
//接收指令行參數
memcpy(szBuffer, argv[2], 8);
sscanf(szBuffer, "%x", &dwThreadHandle);
memcpy(szBuffer, argv[1], 8);
sscanf(szBuffer, "%x", &dwProcessHandle);
printf("擷取IE主線程句柄 %0x\n", dwThreadHandle);
printf("擷取IE程序句柄 %0x\n", dwProcessHandle);
Sleep(5000);
//挂起主線程
::SuspendThread((HANDLE)dwThreadHandle);
printf("挂起主線程 %x\n", dwThreadHandle);
Sleep(10000);
//恢複主線程
::ResumeThread((HANDLE)dwThreadHandle);
printf("恢複主線程\n");
Sleep(5000);
//關閉ID程序
::TerminateProcess((HANDLE)dwProcessHandle, 1);
::WaitForSingleObject((HANDLE)dwProcessHandle, INFINITE);
printf("ID程序已經關閉。。。。\n");
Sleep(1000);
return 0;
}
---建議先了解下多線程與建立程序在學習此文章
轉載于:https://www.cnblogs.com/zheh/p/5223697.html