搜索
查看: 1487|回复: 5

安装进程钩子成功,但是有错误!请大家帮忙看看!

[复制链接]

9

主题

37

帖子

229

积分

二级会员

Rank: 3Rank: 3

积分
229
发表于 2017-10-10 13:44:42 | 显示全部楼层 |阅读模式
安装了个进程钩子,需要当stud_PE.exe点击窗口ID为1099的按钮时弹出一次提示框!
但实际执行如下图:我知道问题出在DLL上,但不知道为什么!if (wmId==1099)这里明明有条件的!

aardio代码如下:
  1. import win.ui;
  2. import process;
  3. import process.apiHook;
  4. /*DSG{{*/
  5. mainForm = win.form(text="aardio form";right=405;bottom=177)
  6. mainForm.add(
  7. button={cls="button";text="安装钩子";left=53;top=23;right=353;bottom=154;z=1}
  8. )
  9. /*}}*/

  10. mainForm.button.oncommand = function(id,event){
  11.         //mainForm.msgbox( mainForm.button.text );
  12.         var prcs = process.apiHook("C:\Users\Administrator\Desktop\StudPE\stud_PE.exe","",)
  13.         var hook = prcs.install("C:\Users\Administrator\Desktop\StudPE\HOOKMSG.DLL","GetSystemTime","bin.dll","_EmptyFunc");        
  14. }

  15. mainForm.show();
  16. return win.loopMessage();
复制代码


DLL代码如下
  1. #include<Windows.h>
  2. #include <string>
  3. #include"resource.h"
  4. using namespace std;

  5. HMODULE g_hModule;
  6. HHOOK hhk;
  7. HWND WND;
  8. HHOOK StartHook();
  9. BOOL EndHook();
  10. LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam);
  11. BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);



  12. BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
  13. {
  14.         switch (ul_reason_for_call)
  15.         {
  16.         case DLL_PROCESS_ATTACH:
  17.         {
  18.                 g_hModule = hModule;
  19.                 hhk = StartHook();
  20.                 if (NULL == hhk)
  21.                 {
  22.                         MessageBox(NULL, L"Set Hook Failed!", L"ERROR", MB_OK);
  23.                         return FALSE;
  24.                 }
  25.                 break;
  26.         }
  27.         case DLL_PROCESS_DETACH:
  28.         {
  29.                 if (FALSE == EndHook())
  30.                 {
  31.                         MessageBox(NULL, L"End Hook Failed!", L"ERROR", MB_OK);
  32.                         return FALSE;
  33.                 }
  34.                 break;
  35.         }
  36.         case DLL_THREAD_ATTACH:
  37.         case DLL_THREAD_DETACH:
  38.                 break;
  39.         }
  40.         return TRUE;
  41. }

  42. HHOOK StartHook()
  43. {
  44.         return SetWindowsHookEx(WH_CALLWNDPROC, HookProc, g_hModule, GetProcessIdOfThread(WND));

  45. }

  46. BOOL EndHook()
  47. {
  48.         return UnhookWindowsHookEx(hhk);
  49. }

  50. LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
  51. {
  52.         if (nCode >= 0)
  53.         {
  54.                 CWPSTRUCT* cwps = (CWPSTRUCT*)lParam;

  55.                 if (WM_COMMAND == cwps->message)
  56.                 {
  57.                         INT wmId = LOWORD(cwps->wParam);
  58.                         if (wmId==1099)
  59.                         {
  60.                                 //DialogBoxParam(g_hModule, (LPCTSTR)IDD_DIALOG, NULL, DlgProc, NULL);
  61.                                 MessageBox(NULL,TEXT("HELLOW"),TEXT("HOOK"),MB_OK);
  62.                         }
  63.                 }
  64.         }

  65.         return CallNextHookEx(hhk, nCode, wParam, lParam);
  66. }



  67. //just for exporting a function
  68. __declspec(dllexport) void EmptyFunc()
  69. {
  70.         //Do nothing
  71. }
复制代码
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13973
发表于 2017-10-10 14:09:07 | 显示全部楼层
一般不要在DLL_PROCESS_ATTACH调用WINAPI。
你如果只是想在目标进程里加载个DLL,并调用函数,aardio里只要简单的调用 raw.remoteApi 就可以,不需要用到API钩子这么复杂。

另外你的问题有些不好理解,
你要弹出对话框,然后你的问题是成功弹出对话框了?!到底啥问题?!
ID错了?! 我提醒你一下,WM_COMMAND 可不一定只是 Click 事件。

类似C代码的问题,调试没有动态语言方便,
试试写日志文件,有条件用VC++什么的附加进程调试,
很多问题,只是看代码看不出来的。
回复

使用道具 举报

9

主题

37

帖子

229

积分

二级会员

Rank: 3Rank: 3

积分
229
 楼主| 发表于 2017-10-10 15:31:16 | 显示全部楼层
Jacen.He 发表于 2017-10-10 14:09
一般不要在DLL_PROCESS_ATTACH调用WINAPI。
你如果只是想在目标进程里加载个DLL,并调用函数,aardio里只 ...

感谢版主回复,的确是需要弹出对话框。
但是这里
  1. if (WM_COMMAND == cwps->message)
  2.                 {
  3.                         INT wmId = LOWORD(cwps->wParam);
  4.                         if (wmId==1099)
  5.                         {
  6.                                 //DialogBoxParam(g_hModule, (LPCTSTR)IDD_DIALOG, NULL, DlgProc, NULL);
  7.                                 MessageBox(NULL,TEXT("HELLOW"),TEXT("HOOK"),MB_OK);
  8.                         }
  9.                 }
复制代码

应该是点一次弹一次啊!为什么点一次会弹很对话框!就是这里有点不明白!
回复

使用道具 举报

9

主题

37

帖子

229

积分

二级会员

Rank: 3Rank: 3

积分
229
 楼主| 发表于 2017-10-10 15:39:22 | 显示全部楼层
Jacen.He 发表于 2017-10-10 14:09
一般不要在DLL_PROCESS_ATTACH调用WINAPI。
你如果只是想在目标进程里加载个DLL,并调用函数,aardio里只 ...

谢谢,我再看看代码!
回复

使用道具 举报

9

主题

37

帖子

229

积分

二级会员

Rank: 3Rank: 3

积分
229
 楼主| 发表于 2017-10-11 13:46:43 | 显示全部楼层
代码修改如下:
DLL:
  1. #include<Windows.h>
  2. #include <string>
  3. #include"resource.h"
  4. using namespace std;

  5. HMODULE GModule;
  6. HHOOK hhk;
  7. HWND WND;
  8. DWORD TID;
  9. HHOOK StartHook();
  10. BOOL EndHook();
  11. LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam);
  12. BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);



  13. BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
  14. {
  15.         switch (ul_reason_for_call)
  16.         {
  17.         case DLL_PROCESS_ATTACH:
  18.         {
  19.                 GModule = hModule;
  20.                 hhk = StartHook();
  21.                 if (NULL == hhk)
  22.                 {
  23.                         MessageBox(NULL, L"Set Hook Failed!", L"ERROR", MB_OK);
  24.                         return FALSE;
  25.                 }
  26.                 break;
  27.         }
  28.         case DLL_PROCESS_DETACH:
  29.         {
  30.                 if (FALSE == EndHook())
  31.                 {
  32.                         MessageBox(NULL, L"End Hook Failed!", L"ERROR", MB_OK);
  33.                         return FALSE;
  34.                 }
  35.                 break;
  36.         }
  37.         case DLL_THREAD_ATTACH:
  38.         case DLL_THREAD_DETACH:
  39.                 break;
  40.         }
  41.         return TRUE;
  42. }

  43. HHOOK StartHook()
  44. {
  45.         
  46.         return SetWindowsHookEx(4, HookProc,GModule,TID);
  47. }

  48. BOOL EndHook()
  49. {
  50.         return UnhookWindowsHookEx(hhk);
  51. }

  52. LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
  53. {
  54.         if (nCode >= 0)
  55.         {
  56.                 CWPSTRUCT* cwps = (CWPSTRUCT*)lParam;

  57.                 if (WM_COMMAND == cwps->message)
  58.                 {
  59.                         INT wmId = LOWORD(cwps->wParam);
  60.                         if (wmId==1)
  61.                         {
  62.                                 //DialogBoxParam(g_hModule, (LPCTSTR)IDD_DIALOG, NULL, DlgProc, NULL);
  63.                                 MessageBox(NULL,TEXT("HELLOW"),TEXT("HOOK"),MB_OK);
  64.                                 nCode=-1;
  65.                         }
  66.                 }
  67.         }

  68.         return CallNextHookEx(hhk, nCode, wParam, lParam);
  69. }



  70. //just for exporting a function
  71. __declspec(dllexport) void EmptyFunc(DWORD TT)
  72. {
  73.         //Do nothing
  74.         MessageBox(NULL,TEXT("111"),TEXT("111"),MB_OK);
  75.         TID=TT;
  76. }
复制代码
AARDIO代码如下:
  1. import win.ui;
  2. import process;
  3. import process.apiHook;
  4. /*DSG{{*/
  5. mainForm = win.form(text="aardio form";right=405;bottom=177)
  6. mainForm.add(
  7. button={cls="button";text="安装钩子";left=53;top=23;right=353;bottom=154;z=1}
  8. )
  9. /*}}*/

  10. mainForm.button.oncommand = function(id,event){
  11.         //mainForm.msgbox( mainForm.button.text );
  12.         var proc=process("C:\Users\Administrator\Desktop\StudPE\Stud_PE.exe");
  13.         var HK = raw.remoteApi(proc.id,"void(INT TT)","C:\Users\Administrator\Desktop\StudPE\HOOKMSG.dll","?EmptyFunc@@YAXK@Z");
  14.         HK(proc.tid);
  15. }

  16. mainForm.show();
  17. return win.loopMessage();
复制代码

最终发现安装的是全局钩子!
回复

使用道具 举报

9

主题

37

帖子

229

积分

二级会员

Rank: 3Rank: 3

积分
229
 楼主| 发表于 2017-10-15 18:21:45 | 显示全部楼层
这两天一直在参照键盘钩子做AARDIO的WH_CALLWNDPROC钩子类,经过版主解释了解到键盘鼠标钩子是特殊钩子,可以在EXE中写,这里也给所有和我一样不知道的小白提醒一下吧!
这是最终的WN_CALLWNDPROC钩子的DLL
  1. #include<Windows.h>
  2. #include <string>
  3. #include"resource.h"
  4. using namespace std;

  5. HMODULE GModule;
  6. HHOOK hhk;
  7. HWND WND;
  8. //DWORD TID;
  9. HHOOK StartHook();
  10. BOOL EndHook();
  11. LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam);
  12. BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);



  13. BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
  14. {
  15.         switch (ul_reason_for_call)
  16.         {
  17.         case DLL_PROCESS_ATTACH:
  18.         {
  19.                 GModule = hModule;
  20.                 //这里可以随便找个非C#程序用SPY++获取到这两个参数!
  21.                 WND=FindWindow(L"#32770",L"stud_PE");
  22.                 hhk = StartHook();
  23.                 if (NULL == hhk)
  24.                 {
  25.                         MessageBox(NULL, L"Set Hook Failed!", L"ERROR", MB_OK);
  26.                         return FALSE;
  27.                 }
  28.                 else
  29.                 {
  30.                         MessageBox(NULL, L"Set Hook Successed!", L"OK", MB_OK);
  31.                 }
  32.                 break;
  33.         }
  34.         case DLL_PROCESS_DETACH:
  35.         {
  36.                 if (FALSE == EndHook())
  37.                 {
  38.                         MessageBox(NULL, L"End Hook Successed!", L"CLOSE", MB_OK);
  39.                         return FALSE;
  40.                 }
  41.                 break;
  42.         }
  43.         case DLL_THREAD_ATTACH:
  44.         case DLL_THREAD_DETACH:
  45.                 break;
  46.         }
  47.         return TRUE;
  48. }

  49. HHOOK StartHook()
  50. {
  51.         return SetWindowsHookEx(4, HookProc,GModule,GetWindowThreadProcessId(WND,NULL));
  52. }

  53. BOOL EndHook()
  54. {
  55.         return UnhookWindowsHookEx(hhk);
  56. }

  57. LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
  58. {
  59.         if (nCode >= 0)
  60.         {
  61.                 CWPSTRUCT* cwps = (CWPSTRUCT*)lParam;

  62.                 if (WM_COMMAND == cwps->message)
  63.                 {
  64.                         INT wmId = LOWORD(cwps->wParam);
  65.                         if (wmId==1099)//这里可以随便找个非C#程序用SPY++获取到控件ID
  66.                         {
  67.                                 //DialogBoxParam(g_hModule, (LPCTSTR)IDD_DIALOG, NULL, DlgProc, NULL);
  68.                                 MessageBox(NULL,TEXT("HELLOW"),TEXT("HOOK"),MB_OK);
  69.                                 nCode=-1;
  70.                         }
  71.                 }
  72.         }

  73.         return CallNextHookEx(hhk, nCode, wParam, lParam);
  74. }

  75. //just for exporting a function
  76. __declspec(dllexport) void EmptyFunc()
  77. {
  78.         //Do nothing  
  79. }
复制代码

这是主程序代码,感兴趣的可以试一试
import win.ui;
import process;
import process.apiHook;
/*DSG{{*/
mainForm = win.form(text="aardio form";right=405;bottom=177)
mainForm.add(
button={cls="button";text="安装钩子";left=53;top=23;right=353;bottom=154;z=1}
)
/*}}*/

mainForm.button.oncommand = function(id,event){
        //mainForm.msgbox( mainForm.button.text );
        mainForm.button.disabled=true;
        proc=process("C:\Users\Administrator\Desktop\StudPE\Stud_PE.exe");
        var HK = raw.remoteApi(proc.handle,"void()","C:\Users\Administrator\Desktop\StudPE\HOOKMSG.dll","?EmptyFunc@@YAXXZ");
        sleep(1000);
        HK();       
}

mainForm.show();
return win.loopMessage();
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-10-21 03:17 , Processed in 0.062500 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表