首页
社区
课程
招聘
[求助]用DLL安装HOOK后呼出窗口的问题,请高手帮忙看看
发表于: 2009-5-4 10:18 7587

[求助]用DLL安装HOOK后呼出窗口的问题,请高手帮忙看看

2009-5-4 10:18
7587
【求助】用DLL安装HOOK后呼出窗口的问题,请高手帮忙看看



小可写了一个DLL, (Delphi) 里面有一个窗口, 窗口里面有N个函数和过程, 窗口在运行时会再开多一些线程。 我使用键盘钩子注入程序A后,按一特定的键可以正常呼出。 由于我是在注入的时候就专门创建了一个隐藏的窗体来处理消息队列的线程, 这个DLL的窗体就是在这个线程中创建的,所以不会造成程序A反应变慢的情况。

但是在这个DLL的窗口关闭后,程序A会出现假死的情况, 小可初步判断可能是因为消息队列被打乱且未恢复正常。想请教各位大侠,给我一点解决的思路吧。如果有代码就最好了。 谢谢啊。


[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我写程序HOOK时遇到崩溃是 循环调用 的问题,你的我不怎么清楚。
2009-5-4 11:44
0
雪    币: 155
活跃值: (29)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
如果只是为了实现呼出窗口功能的话
用API注册热键在监视消息队列进行处理
invoke RegisterHotKey,hWinMain,IDA_HOTKEY,MOD_CONTROL or MOD_SHIFT,'J'     ;注册系统热键

    .elseif eax == WM_HOTKEY       ;处理热键消息
   
        invoke SetForegroundWindow,hWinMain
                    invoke SetFocus,hWinMain

MSDN   http://msdn.microsoft.com/en-us/library/ms646309.aspx
2009-5-4 14:18
0
雪    币: 225
活跃值: (173)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
发给我,帮里调试一下。
2009-5-4 16:36
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢楼上贴出代码。 只是小可的程序可能会面对多个程序A运行的情况, 所以用热键不怎么合理, 现在的情况是哦出和使用基本正常, 只是DLL卸载后程序A会假死。

继续寻找高手帮忙。。。
2009-5-4 16:36
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我找到了问题点, 是因为在我的DLL注入后, 还会再开别的线程, 然后退出的时候这些线程却无法正常关闭,进入假死状态。 我试着用 CloseHandle(hwnd) 来关闭线程, 这样线程是关了, 可是在DLL卸载的时候,程序A也跟着关闭了。 好郁闷啊。
2009-5-4 22:19
0
雪    币: 129
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
卸载在哪里卸载呢?

你的DELPHI的不知道,如果你是在DLL里自己卸载自己的话肯定是会假死的...

你得等你的DLL里所有线程都退完了才可以卸载..

你得把过程出来看看..注入后,就自动创建一个窗口了..

你卸DLL的时候这个窗口线程肯定还没退.
2009-5-5 00:28
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼上说的有道理, 我在退出的时候是这样的:

//卸载Hook
procedure UninitHook();
begin
  try
    EndHook;  //去掉这一句也不行
    if Assigned(myRunWindow) then SendMessage(myRunWindow.Handle, WM_CLOSE, 0, 0);
    myRunWindow.Free;
  except
  end;
end;

//环境处理
procedure DllEntry(dwResaon: DWORD);
begin
  case dwResaon of
    DLL_PROCESS_ATTACH: InitHook;   //DLL载入
    DLL_PROCESS_DETACH: UninitHook; //DLL删除
  end;
end;

也就是先发一个消息给DLL加载时就自动创建的隐藏窗体, 然后在隐藏窗体收到消息后对真正的DLL中的窗体进行卸载操作。 也就是这个时候, 在DLL的窗口运行过程中创建一个线程无法正常关闭, 导致注入DLL的窗体和程序A都出现假死的情况。
2009-5-5 15:25
0
雪    币: 22
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
那就还剩关闭出问题是吧,全部关。
asm
add esp,0
end;

单独关。我不关。我都隐藏的。好久前遇见过的事。忘记了。你看能讲究用不。
2009-5-6 02:23
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
  传说中的许胜大侠,膜拜一下先。 我再研究了。
2009-5-6 07:23
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
我发一个例子给你看吧

function HookProc(nCode:Integer;WParam: WPARAM;LParam:LPARAM):LRESULT;stdcall;
begin
//接收按键F8开始挂钩DLL
if (bShow=1) And (wParam=VK_F8) then
    begin
bShow:=5;
Form1:=TForm1.Create(Application);
Form1.Show;
ShowCursor(true);
end;
if (bShow=2) And (wParam=VK_F8) then
    begin
bShow:=6;
Form1.Free;
end;

if (bShow=3) And (wParam=VK_F8) then
    begin
bShow:=2;
end;

if (bShow=4) And (wParam=VK_F8) then
    begin
bShow:=1;
end;
if (bShow=5) then bShow:=3;
if (bShow=6) then bShow:=4;
Result := CallNextHookEx(hHk,nCode,WParam,LParam);
end;

function HookOn(lpHwnd:HWND;lpType:Longint): Longint;stdcall; export;
begin
hThread :=GetWindowThreadProcessId(lpHwnd,hmod);
//注入开始
hHk :=SetWindowsHookEx(lpType,@HookProc,hInstance,hThread); // WH_KEYBOARD
Result :=hHk
end;
2009-5-6 07:52
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
此问题已经解决, 不是楼上各位所说的原因, 问题在于, 在Delphi 中创建对象时, 应当将对象的事件接口在最后才指定, 不能在对象还未初始化完全的时候就设置对外事件, 那样很可能因为在事件中的一些代码而出错, 我的代码问题 就在这里, 修改之后一切正常了。 如果你觉得还有什么问题也可以指出, 谢谢。
2009-10-2 00:07
0
游客
登录 | 注册 方可回帖
返回
//