最近專案中需要監控目標程序並抓取其資訊,定位對方程序一般有兩種方式:1、hook系統函式createprocess;2、抓取程序快照,採用輪詢的方式獲取目標程序;
此處採用第二種方式,**如下(有簡單注釋):
tmyprocess = class
private
fhandle: cardinal;
fprocessid: cardinal;
fpath :string;
public
property processid:cardinal read fprocessid write fprocessid;
property handle:cardinal read fhandle write fhandle;
property path:string read fpath write fpath;
end;
function findprocess(pname: string;var processinfo: tmyprocess): bool;
var hnd : hwnd;//控制代碼
ahprocess :cardinal;
fprocessentry32 : tprocessentry32; //結構型別的變數
flag,included: boolean; //返回乙個布林值(用來判斷是否找到程序資訊)
processid : dword; //儲存找到的程序id
name,szprocessname: string; //儲存找到的程序名稱 end;
i,index:integer;
info: tmyprocess ;
begin
result := false;
trydebug.debug('監控執行緒開啟');
fprocessentry32.dwsize := sizeof(fprocessentry32); //給tprocessentry32結構的第乙個引數賦值(也可以理解為把這個結構的第乙個引數初始化)
flag := process32first(hnd,fprocessentry32); //使用 process32first函式取得第乙個程序的資訊
while flag = true do //如果 process32first函式執行成功也就是說找到程序列表裡的第乙個程序時開始迴圈
begin
flag := process32next(hnd,fprocessentry32); //取得第下乙個程序資訊
name := fprocessentry32.szexefile; //取得乙個程序的名稱
//設定string物件的長度,否則會寫錯誤
if name = pname then //如果程序名等於這個字串
begin
//開啟已經存在的執行緒,並返回執行緒控制代碼
ahprocess := openprocess(process_all_access, false, fprocessentry32.th32processid);
setlength(szprocessname, max_path);
//獲取程序ip對應的應用程式的路徑
getmodulefilenameex(ahprocess,0,pansichar(szprocessname),max_path);
if processlist.existed(fprocessentry32.th32processid) <0 then
begin
info := tmyprocess.create;
processinfo := info;
processinfo.processid := fprocessentry32.th32processid;
processinfo.handle := ahprocess;
processinfo.state := stnew ;
processinfo.path := szprocessname ;
result := true;
exit;
end;
end;
checkexitprocess;
clearexitprocess;
end;
finally
closehandle(hnd);
end;
end;
以上**使用過程中,記憶體很快被消耗完,淨查閱msdn文件後發現,使用createtoolhelp32snapshot建立程序快照後,需使用closehandle關閉其控制代碼,以釋放記憶體。需要注意的是在winnt中使用closehandle釋放記憶體,而在wince(還有人用嗎,哈哈)中要使用
closetoolhelp32snapshot關閉快照釋放記憶體。
祝好!歡迎斧正,望您不吝賜教!
windows程序監控
最近開發乙個程序監控的服務,由於對windows api不熟,所以折騰了小兩周才完全跑通,特記錄一下 1由於需求需要根據程序名來進行監控,所以首先要根據程序名來獲取程序控制代碼 同名程序可能有多個,比如,起了多個notepad.exe 通過程序名獲取程序控制代碼集 返回值為 同名程序個數 不超過20...
windows下bat實現監控程序
echo off checkservice for f tokens 5 n in qprocess.exe find supernode.exe do if n supernode.exe goto checkmessage else goto restartservice restartserv...
Docker監控平台
目錄docker監控平台由容器監控元件cadvisor 主機監控元件node exporter 時序資料庫prometheus 告警處理元件alertmanager 圖表展示工具grafana構成,所有元件均已容器方式執行。docker run tid name grafana p 3000 300...