[zt]Delphi API HOOK完全说明(修正及说明)
2009-04-21 15:25
501 查看
从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都是大家转来转去,原文出处我已经找不到了。
这篇文章写的很不错,但最后部分“PermuteFunction 的终极版本”描述的不太清楚,完全按照该文章代码执行,是不行的。需要修改mess.pas中代码才行。
其实文中提到的一个结构,代码中并没有使用
type
PIMAGE_IMPORT_DESCRIPTOR = ^
IMAGE_IMPORT_DESCRIPTOR;
IMAGE_IMPORT_DESCRIPTOR = packed record
OriginalFirstThunk : DWORD;
TimeDateStamp : DWORD;
ForwarderChain : DWORD;
Name : DWORD;
FirstThunk : DWORD;
end;
mess.pas中要修改的部分主要是
procedure API_Hookup;
begin
if @OldMessageBoxA = nil then
@OldMessageBoxA := TrueFunctionAddress(@messageboxA);
if @OldMessageBoxW = nil then
@OldMessageBoxW := TrueFunctionAddress(@messageboxW);
PermuteFunction(FuncMessageboxA.AddressOfPointerToFunction, @MyBoxA);
PermuteFunction(FuncMessageboxW.AddressOfPointerToFunction, @MyBoxW);
end;
这里应该是
PermuteFunction(@messageboxA @MyBoxA);
PermuteFunction(@messageboxA, @MyBoxW);
当然Un_API_hook部分也要做响应修改。
另外在mess.pas中声明的“FuncMessageboxA, FuncMessageboxW: PImportCode;”也是没用了。
修改后的代码,大家可以到 http://download.csdn.net/source/575736 下载。
代码里,我故意加了一个 MB_YESNO并且标题为“are you sure”的messagebox,执行的话,可以看到这个messagebox并不会弹出,而是直接显示一个showmessage('yes')或者showmessage('no')。
这样也就是说我们可以拦截第三方程序的特定messagebox,并使其产生我们预期的结果值,从而控制目标程序流程。
另外按照这种方式进行Hook,当程序退出的时候,总是会导致资源管理器异常(explorer.exe),一直困扰我,不知道该怎么解决。
有朋友知道解决办法的话,还请告知,非常感谢。
ppccqq 发表于2009年4月9日 21:47:12 IP:举报多
谢代码共享,我测试了一下,如果将函数GetMsgProc改成如下所示,将不会报错,请各位指教。function
GetMsgProc(Code: UINT; WParam: WPARAM; LParam: LPARAM): LRESULT;
stdcall;begin if Code = HC_ACTION then begin end; Result :=
CallNextHookEx(HookHandle, Code, WParam, LParam);end;ppccqq 发表于2009年4月9日 21:48:41 IP:举报我指的是程序退出的时侯不会报错。可能一般说来还是需要调用下一个勾子,将消息传给系统处理。是否如此,请各位指教
这篇文章写的很不错,但最后部分“PermuteFunction 的终极版本”描述的不太清楚,完全按照该文章代码执行,是不行的。需要修改mess.pas中代码才行。
其实文中提到的一个结构,代码中并没有使用
type
PIMAGE_IMPORT_DESCRIPTOR = ^
IMAGE_IMPORT_DESCRIPTOR;
IMAGE_IMPORT_DESCRIPTOR = packed record
OriginalFirstThunk : DWORD;
TimeDateStamp : DWORD;
ForwarderChain : DWORD;
Name : DWORD;
FirstThunk : DWORD;
end;
mess.pas中要修改的部分主要是
procedure API_Hookup;
begin
if @OldMessageBoxA = nil then
@OldMessageBoxA := TrueFunctionAddress(@messageboxA);
if @OldMessageBoxW = nil then
@OldMessageBoxW := TrueFunctionAddress(@messageboxW);
PermuteFunction(FuncMessageboxA.AddressOfPointerToFunction, @MyBoxA);
PermuteFunction(FuncMessageboxW.AddressOfPointerToFunction, @MyBoxW);
end;
这里应该是
PermuteFunction(@messageboxA @MyBoxA);
PermuteFunction(@messageboxA, @MyBoxW);
当然Un_API_hook部分也要做响应修改。
另外在mess.pas中声明的“FuncMessageboxA, FuncMessageboxW: PImportCode;”也是没用了。
修改后的代码,大家可以到 http://download.csdn.net/source/575736 下载。
代码里,我故意加了一个 MB_YESNO并且标题为“are you sure”的messagebox,执行的话,可以看到这个messagebox并不会弹出,而是直接显示一个showmessage('yes')或者showmessage('no')。
这样也就是说我们可以拦截第三方程序的特定messagebox,并使其产生我们预期的结果值,从而控制目标程序流程。
另外按照这种方式进行Hook,当程序退出的时候,总是会导致资源管理器异常(explorer.exe),一直困扰我,不知道该怎么解决。
有朋友知道解决办法的话,还请告知,非常感谢。
ppccqq 发表于2009年4月9日 21:47:12 IP:举报多
谢代码共享,我测试了一下,如果将函数GetMsgProc改成如下所示,将不会报错,请各位指教。function
GetMsgProc(Code: UINT; WParam: WPARAM; LParam: LPARAM): LRESULT;
stdcall;begin if Code = HC_ACTION then begin end; Result :=
CallNextHookEx(HookHandle, Code, WParam, LParam);end;ppccqq 发表于2009年4月9日 21:48:41 IP:举报我指的是程序退出的时侯不会报错。可能一般说来还是需要调用下一个勾子,将消息传给系统处理。是否如此,请各位指教
相关文章推荐
- [zt]Delphi API HOOK完全说明(存在错误的原文,含修正)
- [zt]Delphi API HOOK完全说明(存在错误的原文,含修正)
- Delphi API HOOK完全说明(存在错误的原文,含修正)
- Delphi API HOOK完全说明(修正及说明)
- 截取程序的网络封包(Delphi Hook API) 转自 http://peirenlei.javaeye.com/blog/417993
- Delphi修改窗口类名(HookAPI)
- API Hook完全手册
- 另一个HookAPI 源码,来自EurekaLog for Delphi中的EHook.pas
- 截取程序的网络封包(Delphi Hook API)
- delphi apihook
- [转] Delphi API HOOK 完全说明
- hook api for delphi
- Delphi API HOOK完全说明
- Delphi API HOOK完全说明
- Delphi中Hook API进行进程保护
- Delphi Hook API 已疯狂
- Delphi中用MessageBox()API函数做倒计时对话框(使用Hook安装CBTHookCallback,计时器更改文字,SetWindowText API真正修改文字,引用未知函数)good
- 截取程序的网络封包(Delphi Hook API)
- DelphiHookApi(经典)
- Delphi Hook API 已疯狂