gpt4 book ai didi

windows - 如何识别应用程序打算执行/运行文件?

转载 作者:可可西里 更新时间:2023-11-01 13:28:28 24 4
gpt4 key购买 nike

我需要在应用程序执行或运行文件时识别并触发事件。我知道我可以通过 Hook windows 程序来做到这一点,但我不知道 windows 触发什么程序或事件。例如,当一个自动运行文件要执行时,我的应用程序应该识别它,就像防病毒应用程序一样。

我不确定 Hook 是否对我的目的有用,如果解决方案不是 Hook ,请给我一个真正的解决方案。

最佳答案

尝试使用 PsSetCreateProcessNotifyRoutine , 此函数将驱动程序提供的回调例程添加到要在创建或删除进程时调用的例程列表中,或从中删除。

您可以在此链接中找到一个用 C++ 编写的非常好的示例

Detecting Windows NT/2K process execution

更新

另一个选项是使用 WMI 事件,检查 Win32_Process类,ExecNotificationQuery方法和 SWbemEventSource.NextEvent功能。

检查此示例在 delphi 7 和 Windows 7 中测试,您必须从 Delphi IDE 外部运行此应用程序或禁用 EOleException 异常的异常通知(检查此 link ),以避免 EOleException 被 IDE 拦截。

program GetWMI_InstanceCreationEvent;

{$APPTYPE CONSOLE}

uses
SysUtils
,Windows
,ComObj
,ActiveX
,Variants;


Function KeyPressed:boolean; //detect if an key is pressed
var
NumEvents : DWORD;
ir : _INPUT_RECORD;
bufcount : DWORD;
StdIn : THandle;
begin
Result:=false;
StdIn := GetStdHandle(STD_INPUT_HANDLE);
NumEvents:=0;
GetNumberOfConsoleInputEvents(StdIn,NumEvents);
if NumEvents<> 0 then
begin
PeekConsoleInput(StdIn,ir,1,bufcount);
if bufcount <> 0 then
begin
if ir.EventType = KEY_EVENT then
begin
if ir.Event.KeyEvent.bKeyDown then
result:=true
else
FlushConsoleInputBuffer(StdIn);
end
else
FlushConsoleInputBuffer(StdIn);
end;
end;
end;


function VarStrNUll(VarStr:OleVariant):string;//dummy function to handle null variants
begin
Result:='';
if not VarIsNull(VarStr) then
Result:=VarToStr(VarStr);
end;

function GetWMIObject(const objectName: String): IDispatch; //create a wmi object instance
var
chEaten: Integer;
BindCtx: IBindCtx;
Moniker: IMoniker;
begin
OleCheck(CreateBindCtx(0, bindCtx));
OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));
OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
end;

Procedure GetWin32_InstanceCreationEvent;
var
objWMIService : OLEVariant;
colMonitoredProcesses : OLEVariant;
objLatestProcess : OLEVariant;
begin
objWMIService := GetWMIObject('winmgmts:\\localhost\root\cimv2');
colMonitoredProcesses := objWMIService.ExecNotificationQuery('Select * From __InstanceCreationEvent Within 1 Where TargetInstance ISA ''Win32_Process'''); //Get the event listener
while not KeyPressed do
begin
try
objLatestProcess := colMonitoredProcesses.NextEvent(100);//set the max time to wait (ms)
except
on E:EOleException do
if EOleException(E).ErrorCode=HRESULT($80043001) then //Check for the timeout error wbemErrTimedOut 0x80043001
objLatestProcess:=Null
else
raise;
end;

if not VarIsNull(objLatestProcess) then
begin
Writeln('Process Started '+VarStrNUll(objLatestProcess.TargetInstance.Name));
Writeln('CommandLine '+VarStrNUll(objLatestProcess.TargetInstance.CommandLine));
Writeln('PID '+VarStrNUll(objLatestProcess.TargetInstance.ProcessID));
end;
end;
end;



begin
try
CoInitialize(nil);
try
Writeln('Press Any key to exit');
GetWin32_InstanceCreationEvent;
finally
CoUninitialize;
end;

except
on E:Exception do
Begin
Writeln(E.Classname, ': ', E.Message);
Readln;
End;
end;
end.

关于windows - 如何识别应用程序打算执行/运行文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3489501/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com