先说下我的目的:有程序A和B,程序A运行时将DLL注入程序B,DLL作用是监控A的运行,如果A被关闭那就结束B现在向B注入DLL实现了我想要问的就是如何在注入DLL时传入A的PID,或者说有什么好的办法监控A不被关闭,用findwindow肯定不行的吧,有同名的窗体就检测不到了
DLL监控代码library TestDll;uses
Windows,
Classes,
MMSystem;type
TCFThread = class(TThread)
private
timerid:integer;
htimerevent:Thandle;
protected
procedure Execute; override;
public
constructor Create();
procedure SetOver;
destructor Destroy(); override;
published
end;{$R *.res}constructor TCFThread.Create();
begin
FreeOnTerminate := True;
inherited Create(False);
end;procedure TCFThread.SetOver;
begin
timerid := timesetevent(5, 0, TFNTimecallback(htimerevent), 0, time_periodic or time_callback_event_set);
end;destructor TCFThread.Destroy();
begin
inherited Destroy;
end;procedure TCFThread.Execute;
begin
htimerevent := CreateEvent(nil, False, False, nil);
timerid := timesetevent(5*1000, 0, TFNTimecallback(htimerevent), 0, time_periodic or time_callback_event_set);
repeat
if WaitForSingleObject(htimerevent,INFINITE) = WAIT_OBJECT_0 then
begin
if Terminated then break;
MessageBox(0,'测试!','DLL注入成功',0);
end;
until false;
timekillevent(timerid);
CloseHandle(htimerevent);
end;var
Thread: TCFThread;
begin
Thread := TCFThread.Create();
end.
DLL监控代码library TestDll;uses
Windows,
Classes,
MMSystem;type
TCFThread = class(TThread)
private
timerid:integer;
htimerevent:Thandle;
protected
procedure Execute; override;
public
constructor Create();
procedure SetOver;
destructor Destroy(); override;
published
end;{$R *.res}constructor TCFThread.Create();
begin
FreeOnTerminate := True;
inherited Create(False);
end;procedure TCFThread.SetOver;
begin
timerid := timesetevent(5, 0, TFNTimecallback(htimerevent), 0, time_periodic or time_callback_event_set);
end;destructor TCFThread.Destroy();
begin
inherited Destroy;
end;procedure TCFThread.Execute;
begin
htimerevent := CreateEvent(nil, False, False, nil);
timerid := timesetevent(5*1000, 0, TFNTimecallback(htimerevent), 0, time_periodic or time_callback_event_set);
repeat
if WaitForSingleObject(htimerevent,INFINITE) = WAIT_OBJECT_0 then
begin
if Terminated then break;
MessageBox(0,'测试!','DLL注入成功',0);
end;
until false;
timekillevent(timerid);
CloseHandle(htimerevent);
end;var
Thread: TCFThread;
begin
Thread := TCFThread.Create();
end.
var
h: LongWord; //放句柄,中间顺便放下pid。
tmp: LongWord; //占格式,收集垃圾。
DllName: PAnsiChar;
MySize: LongWord; //放字符串长度。
Parameter: Pointer; //放参数的指针(位置在目标进程内)
begin
DllName:='TestDll.dll';
MySize:=StrLen(DllName)+1;
WinExec('notepad',1);
GetWindowThreadProcessId(FindWindow('notepad',nil),@h);
h:=OpenProcess(PROCESS_ALL_ACCESS,False,h);
Parameter:=VirtualAllocEx(h,nil,MySize,MEM_COMMIT,PAGE_READWRITE);
WriteProcessMemory(h,Parameter,Pointer(DllName),MySize,tmp);
CreateRemoteThread(h,nil,0,GetProcAddress(GetModuleHandle('KERNEL32.Dll'),'LoadLibraryA'),Parameter,0,tmp);
end;
var
TestMsg:UINT;TestMsg:=RegisterWindowMessage('测试);
PostMessage(HWND_BROADCAST,TestMsg,0,0);
procedure TForm1.HandleMessage(var Msg:tagMSG;var Handle:Boolean);
begin
if Msg.message=TestMsg then
begin
//
end;
end;
相关的 进程之间互相定时发送 然后等待回复
uses
TLhelp32;
Function GetPID(_GetPID:String):String;
var
h:thandle;
f:boolean;
lppe:tprocessentry32;
begin
h := CreateToolhelp32Snapshot(TH32cs_SnapProcess, 0);
lppe.dwSize := sizeof(lppe);
f := Process32First(h, lppe); //lppe.szExeFile是進程的名字,自己挑選你要的
//lppe.th32ProcessID就是你要的進程號
while integer(f) <> 0 do
begin
//if lppe.szExeFile='QQ.exe' then showmessage('ok');
if lppe.szExeFile = _GetPID then
begin
Result:=(inttostr(lppe.th32ProcessID));
break;
end;
f := Process32Next(h, lppe);
end;
end;