当前位置:主页>仓库管理软件> 列表

Hook能截到一个进程启动的消息吗? 找初级会计电算化软件

记账软件版1楼: 如题,我现在想拦截或者说过滤一个应用程序,在他创建进程时屏蔽他.这个程序不一定使用CreateWindow之类创建窗体的函数,所以想直接拦截进程CreateProcess启动的消息.

2楼: 定一下,那位大哥帮帮忙.... 如用友财务软件试用版

3楼: 直接hook createprocess 这个 api 就可以了。

4楼: 能具体说明一下吗,我是新手,是使用函数跳转吗?

5楼: 我再顶.

6楼: 哪位大哥给个例子啊.

记账软件版7楼: 我现在实现了这个功能,可是问题又出来了,为什么拦截的lpApplicationName内是空,其他的值都正常.

{-------------------Hook.dpr----------------------}
library Hook;

uses
SysUtils,
windows,
Messages,
APIHook in ''APIHook.pas'';

var
DllHook: HHOOK;

procedure HookProc(nCode, wParam, lParam: LongWORD);stdcall;
begin
CallNextHookEx(DllHook, nCode, wParam, lParam);
end;

function InstallHook: Boolean; stdcall;
begin
DllHook := SetWindowsHookEx(WH_GETMESSAGE, @HookProc, Hinstance, 0);
Result := DllHook > 0;
end;

procedure UnHook; stdcall;
begin
UnHookAPI;
UnhookWindowsHookEx(DllHook);
end;

procedure MyDLLHandler(Reason: Integer);
begin
case Reason of
DLL_PROCESS_ATTACH: HookAPI;
DLL_PROCESS_DETACH: UnHook;
end;
end;

exports
InstallHook;

begin
DLLProc := @MyDLLHandler;
MyDLLhandler(DLL_PROCESS_ATTACH);
end.

{------------------APIHook.pas---------------------}

unit APIHook;

interface

uses
SysUtils, Windows, WinSock, Dialogs;

type
{ 要HOOK的API函数定义 }
TCreatePA = function (lpApplicationName: PAnsiChar; lpCommandLine: PAnsiChar;
lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
lpCurrentDirectory: PAnsiChar; const lpStartupInfo: TStartupInfo;
var lpProcessInformation: TProcessInformation): BOOL; stdcall;

TCreatePW = function (lpApplicationName: PWideChar; lpCommandLine: PWideChar;
lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
lpCurrentDirectory: PWideChar; const lpStartupInfo: TStartupInfo;
var lpProcessInformation: TProcessInformation): BOOL; stdcall;


procedure HookAPI;
procedure UnHookAPI;

var
ProcessHandle: HWND;
BaseAddress: array [0..2] of Pointer;
OldProc: array [0..2] of array [0..7] of Byte;
NewPorc: array [0..2] of array [0..7] of Byte;

implementation

function MyCreatePA(lpApplicationName: PAnsiChar; lpCommandLine: PAnsiChar;
lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
lpCurrentDirectory: PAnsiChar; const lpStartupInfo: TStartupInfo;
var lpProcessInformation: TProcessInformation): BOOL; stdcall;
var
nSize: Cardinal;
begin
MessageBoxA(0, lpApplicationName, lpCurrentDirectory, 0);
WriteProcessMemory(ProcessHandle, BaseAddress[0], @OldProc[0], 8, nSize);


Result := CreateProcessA(lpApplicationName, lpCommandLine, lpProcessAttributes,
lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment,
lpCurrentDirectory, lpStartupInfo, lpProcessInformation);
WriteProcessMemory(ProcessHandle, BaseAddress[0], @NewPorc[0], 8, nSize);
end;

function MyCreatePW(lpApplicationName: PWideChar; lpCommandLine: PWideChar;
lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
lpCurrentDirectory: PWideChar; const lpStartupInfo: TStartupInfo;
var lpProcessInformation: TProcessInformation): BOOL; stdcall;
var
nSize: Cardinal;
begin
MessageBoxW(0, lpCommandLine ,lpApplicationName , 0);
WriteProcessMemory(ProcessHandle, BaseAddress[1], @OldProc[1], 8, nSize);
Result := CreateProcessW(lpApplicationName, lpCommandLine, lpProcessAttributes,
lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment,
lpCurrentDirectory, lpStartupInfo, lpProcessInformation);

WriteProcessMemory(ProcessHandle, BaseAddress[1], @NewPorc[1], 8, nSize);
end;

procedure HookAPI;
var
DLLModule: THandle;
nSize: Cardinal;
Dat: DWORD;
Tmp : array [0..3] of Byte;
begin
ProcessHandle := DWORD(-1);
DLLModule := LoadLibrary(''kernel32.dll'');

BaseAddress[0] := GetProcAddress(DLLModule, ''CreateProcessA'');
Dat := DWORD(@MyCreatePA);
Move(Dat, Tmp, 4);
NewPorc[0][0] := $B8;
NewPorc[0][1] := Tmp[0];
NewPorc[0][2] := Tmp[1];
NewPorc[0][3] := Tmp[2];
NewPorc[0][4] := Tmp[3];
NewPorc[0][5] := $FF;
NewPorc[0][6] := $E0;
NewPorc[0][7] := 0;
ReadProcessMemory(ProcessHandle, BaseAddress[0], @OldProc[0], 8, nSize);
WriteProcessMemory(ProcessHandle, BaseAddress[0], @NewPorc[0], 8, nSize);

BaseAddress[1] := GetProcAddress(DLLModule, ''CreateProcessW'');
Dat := DWORD(@MyCreatePW);
Move(Dat, Tmp, 4);
NewPorc[1][0] := $B8;
NewPorc[1][1] := Tmp[0];
NewPorc[1][2] := Tmp[1];


NewPorc[1][3] := Tmp[2];
NewPorc[1][4] := Tmp[3];
NewPorc[1][5] := $FF;
NewPorc[1][6] := $E0;
NewPorc[1][7] := 0;
ReadProcessMemory(ProcessHandle, BaseAddress[1], @OldProc[1], 8, nSize);
WriteProcessMemory(ProcessHandle, BaseAddress[1], @NewPorc[1], 8, nSize);
end;

procedure UnHookAPI;
var
nSize: Cardinal;
begin
WriteProcessMemory(ProcessHandle, BaseAddress[0], @OldProc[0], 8, nSize);
WriteProcessMemory(ProcessHandle, BaseAddress[1], @OldProc[1], 8, nSize);
end;

end.

8楼: 怎么都没人回答一下啊!失望!

9楼: 我顶,大家帮忙.

10楼: 不要沉。

11楼: 你得代码注释都这么少,而且注释得都是无关痛痒得东西,多写一些关键注释让我们路过得菜鸟们学习学习嘛!

12楼: to 在世寻欢:
代码存在未知错误,不能误倒大家啊。我加了写自己理解的注解...

我现在把这个问题定期提前,希望哪位高手来救救我啊。 如仓库管理软件破解版

13楼: 高手快出现!

记账软件版14楼: 试试lpCommandLine

15楼: lpCommandLine 是有内容的,就是那个lpApplicationName是空的/...

16楼: 顶顶,高手....

17楼: 有的系统调用createprocessW这个函数,并不是调用createprocessA这个函数,你试试看,另外当用命令行启动一个程序是这个hook也是无效的,不知道你试过珊瑚虫版的qq没有,正常启动时你也拦截不到QQ.exe的进程。

18楼: 我已经改写了W,A两个,不过基本都是W的,9X的应该是A的。QQ我倒没测过,不过我现在想知道的是为什么lpApplicationName是空的。

19楼: 很正常啊,其实CreateProcess的时候不一定传递每一个参数的,我调用CreateProcess


的时候就习惯把lpApplicationName置为nil,而用lpCommandLine来传递要加载的文件名

20楼: 帮顶!

╭=========================================╮

80G海量源代码,控件,书籍全免费狂下不停!

http://www.source520.com

╰=========================================╯

记账软件版21楼: 现在的问题是,在我的电脑是我双击所有的应用程序都无法显示lpApplicationName,不知道为什么?我的是2000 Server SP4的.

22楼: 代码没仔细看,比较同意tseug兄的说法,比如,如果没有lpApplicationName但是有lpCommandLine,那么是正常的啊。。 :) 如初级会计电算化软件

23楼: 小心按键CTRL+ESC,hook会停止

24楼: to 41426277:我试过了hook没有停止,你是怎么得出这个结论呢

25楼: 我在自己的XP下测试,发现lpApplicationName有值....

26楼: 唔,关注!
偶以前也想拦截程序启动的消息,因为看见Delphi自己的WinSignt工具能拦截WM_Create
自己写的程序却拦不到,郁闷.
一楼的方法似乎又是另外一条希望之路

继续呀!

27楼: 我刚才测试了一下,珊瑚版的QQ启动是可以拦截到的。


我把它存放在文本文件里,内容如下:
"E:\Program Files\Super Rabbit\MagicSet\MagicSet.exe"
"C:\Program Files\Internet Explorer\iexplore.exe"
"E:\Program Files\firefox\firefox.exe"
"E:\Program Files\Tencent\qq\CoralQQ.exe"
"E:\Program Files\FlashFXP\flashfxp.exe"
"C:\Program Files\Internet Explorer\IEXPLORE.EXE"
"E:\Program Files\Tencent\qq\CQQCfg.exe"
"E:\Program Files\Tencent\qq\QQ.exe"
"E:\Program Files\Tencent\qq\CoralQQ.exe"

原本定义的格式是: [文件名] [命令行]
下载[文件名]全是空值,[命令行]正常.

记账软件版28楼: 帮顶!

╭=========================================╮

80G海量源代码,控件,书籍全免费狂下不停!

http://www.source520.com

╰=========================================╯

29楼: to:linfinder:你没有明白我的意思,我说的是如果你打开珊瑚虫版的qq,你只能拦截到CoralQQ.exe,但却拦截不到qq.exe,在任务管理器里我们也可以看到是qq。exe在运行,并不是CoralQQ.exe运行,我的疑问就是如果你用CreateprocessW拦截进程,你是拦截不到qq。exe的启动的,腾讯他们是怎么做到由CoralQQ.exe变化到QQ.exe。


我用你的程序试了,也是只能拦截CoralQQ.exe,并不是qq。exe。

30楼: 你这个代码只能拦载到部分的由CreateProcessW,CreateProcessA创键的进程,并不是
所有的CreateProcessW,CreateProcessA创建的进程都能得到。注意一个问题,SetWindowsHookEx(WH_GETMESSAGE),WH_GETMESSAGE只能尽可能多的让你的DLL注入到其他进行进程创建的程序。并不是注入所有的程序。
用WinExec或其他办法创建的进程你这个代码更不可能得到。


来自:hzm7512, 时间:2006-2-13 12:06:06, ID:3351903
to:linfinder:你没有明白我的意思,我说的是如果你打开珊瑚虫版的qq,你只能拦截到CoralQQ.exe,但却拦截不到qq.exe,在任务管理器里我们也可以看到是qq。exe在运行,并不是CoralQQ.exe运行,我的疑问就是如果你用CreateprocessW拦截进程,你是拦截不到qq。exe的启动的,腾讯他们是怎么做到由CoralQQ.exe变化到QQ.exe。
我用你的程序试了,也是只能拦截CoralQQ.exe,并不是qq。exe。

能拦载到CORALQQ。EXE而不是QQ。EXE,有几个可能,一个可能是你的DLL没来得及注入
Coralqq.exe(GETMESSAGE的HOOK还没拦到Coralqq.exe的消息),CoralQQ就已经用CreateProcess创建了QQ.EXE进程。又或者你的DLL已经进入Coralqq.exe但是Coralqq.exe


是用WinExec或别的办法启动QQ.EXE,所以你没有得到QQ.EXE的进程名).是哪一个原因用OBDG
调试一下CroalQQ.exe就知道了。

31楼: 多人接受答案了。