在DLL中如何HOOK加载该DLL的应用程序的消息 ( 积分: 200 )

  • 主题发起人 主题发起人 sirous
  • 开始时间 开始时间
S

sirous

Unregistered / Unconfirmed
GUEST, unregistred user!
用CreateRemoteThread成功将C.dll注入B.exe中
窗体A是B.exe的一个窗体
C.DLL在加载以后
想用setWindowsHookEx HOOK该发给窗体A的消息
假设A的caption为'111'
th:=findwindow(nil,'111');
XXX :=GetWindowThreadProcessId(th,nil);
g_hhook := setWindowsHookEx(WH_GETMESSAGE, GetMsgProc,HInstance,XXX);

执行结果显示g_hhook>0 说明HOOK成功
GetMsgProc如下: 也就是收到NEW_MSG消息弹个提示而已
function GetMsgProc(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall;
var
buff:TMSG;
begin
Result := 0;
buff:=PMSG(lParam)^;
if (buff.message=NEW_MSG) then
begin
showmessage('OK');
end;
if Code < 0 then
begin
result := callNexthookEx(g_hhook, code, wparam, lparam);
exit;
end;
end;

然后我在另外一个程序中执行
ty:=findwindow(nil,'111');
SendMessage(ty, NEW_MSG, 0, 0);

SendMessage(HWND_BROADCAST, NEW_MSG, 0, 0);
但全没有反映 没有弹出提示

怎么回事?
 
用CreateRemoteThread成功将C.dll注入B.exe中
窗体A是B.exe的一个窗体
C.DLL在加载以后
想用setWindowsHookEx HOOK该发给窗体A的消息
假设A的caption为'111'
th:=findwindow(nil,'111');
XXX :=GetWindowThreadProcessId(th,nil);
g_hhook := setWindowsHookEx(WH_GETMESSAGE, GetMsgProc,HInstance,XXX);

执行结果显示g_hhook>0 说明HOOK成功
GetMsgProc如下: 也就是收到NEW_MSG消息弹个提示而已
function GetMsgProc(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall;
var
buff:TMSG;
begin
Result := 0;
buff:=PMSG(lParam)^;
if (buff.message=NEW_MSG) then
begin
showmessage('OK');
end;
if Code < 0 then
begin
result := callNexthookEx(g_hhook, code, wparam, lparam);
exit;
end;
end;

然后我在另外一个程序中执行
ty:=findwindow(nil,'111');
SendMessage(ty, NEW_MSG, 0, 0);

SendMessage(HWND_BROADCAST, NEW_MSG, 0, 0);
但全没有反映 没有弹出提示

怎么回事?
 
如果有疑问 可以加QQ10606534联系
或给个例子
马上给分
 
备注
我不想钩全局的
所以不用
setWindowsHookEx(WH_GETMESSAGE, GetMsgProc,HInstance,0);
 
建议这么写
function GetMsgProc(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall;
var
buff:TMSG;
begin
if code = HC_ACTION then
begin
buff:=PMSG(lParam)^;
if (buff.message=NEW_MSG) then
begin
showmessage('OK');
end;
end;
Result := callNexthookEx(g_hhook, code, wparam, lparam);
end;
 
不行啊 哥们
其实我原来就是这么写的
你看我
if (buff.message=NEW_MSG) then
begin
showmessage('OK');
end;
的位置布局就知道 原来外面还有判断语句的
一样没动静哦
但是g_hhook却是返回成功的
 
怎么没人回答呀
 
为什么非得用hook,用subclass就行了
 
谢谢survival~
我是为了学习HOOK用
不是想用setwindowlong这方法
 
给你个库,刚才写的还没有来得及测试。
//Hook 动态库中的API
function ux_SYS_HookAPI(const szModule : PChar; const szApi : PChar; pfnFake : Pointer): Pointer; stdcall; external 'uxSys32.dll';
//Hook 类成员函数
function ux_SYS_HookMember(fnOriginal : Pointer; pfnFake : Pointer): Pointer; stdcall; external 'uxSys32.dll';
//Hook 系统API
function ux_SYS_Hook(pfnApi: Pointer; pfnFake : Pointer): Pointer; stdcall; external 'uxSys32.dll';

使用方法,在注入的dll中替换目标函数到你的函数地址,
l.g.替换Winsock2的send

type FN_SEND = function(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
var fnSend : FN_SEND;
function mysend(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
begin
Result := fnSend(s, Buf, len, flags);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
fnSend := ux_SYS_HookAPI('ws2_32.dll', 'send', @mysend);
end;

ux_SYS_HookMember要注意,别忘了加上成员函数特有的this参数,不然就挂了。有什么问题可以联系我qq:37946203
 
不行啊~ 大家救命啊~
你们不能见死不救啊!!!

setWindowsHookEx(WH_GETMESSAGE, GetMsgProc,HInstance,0);
也一样不行啊
 
自己解决了
 
后退
顶部