hook详解:用hook实现dll注入详解来源: 发布时间:星期四, 2009年2月12日 浏览:66次 评论:0
需要个用来注入dll(inject.dll)及个(caller.exe) 流程: caller.exe procedure TestHook; var pwnd,hChild, hwndInject :hwnd; msg:tmsg; begin //通过窗口标题用FindWindow找到要注入主窗口句柄pwnd pwnd := findwindow(\'Progman\',nil); //用FindwindowEx(hMain,0,nil,nil)找到要处理子窗口句柄hChild hChild := findWindowEx(pwnd,0,nil,nil); //用getwindowThreadProcessid(hChild,nil)找到要注入线程 dwThreadID := getwindowThreadProcessid(hChild,nil); // inject.dllSetInjectHook思路方法 SetInjectHook(dwThreadID); //等待消息返回 getmessage(msg,0,0,0); //找到注入窗口 hwndInject:= findwindow(nil,\'InjectForm\'); //发送控制消息,将目标窗体句柄作为wparam控制参数以lparam传入 sendMessage( hwndInject, wm_app,hChild,eger(true)); //关闭注入窗口 sendMessage( hwndInject,wm_close,0,0); //等待窗口关闭 sleep(500); //检查是否成功关闭 assert(not iswindow( hwndInject)); //去掉挂钩 DipsHook(0); end; //下面介绍说明 Inject.dllSetInjectHook具体操作 在全局定义以下变量 var g_hhook :Hhook=0; g_dwThreadidInject :dword=0; g_hInjectfrm:hwnd; function SetInjectHook(dwThreadid:DWORD):boolean; begin result := false; //如果线程标志为0则用于去掉钩子否则进行动态库注入 dwThreadid<>0 then begin assert(g_hhook=0); //保存当前线程ID到 g_dwThreadidInject g_dwThreadidInject := getCurrentThreadid; //下个GetMessage钩子到目标线程 //GetMsgProc是在下面定义个在第次时将自定义form在目标线程中创建出来 //这样就能通过这个自定义form对目标线程进行进程内控制了 g_hhook := WindowsHookEx(wh_getMessage,GetMsgProc,hInstance,dwThreadid); result := g_hhook <> null; result then //发个空信息以便于立即创建这个自定义form result := postThreadMessage(dwThreadid, wm_Null,0,0); //等待半秒钟以保证者可以找到这个刚创建form sleep(500); end begin assert(g_hhook<>0); //去掉钩子 result := unHookWindowsHookEx(g_hhook); g_Hhook := 0; end; end; //定义个全局是否第个消息标志 var fFirstTime:boolean = true; //这个用于在收到第个消息时创建自定义窗体以便于远程控制 function GetMsgProc(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall; begin //如果是第次 fFirstTime then begin fFirstTime := false; //创建窗体 InjectFrm := TinjectFrm.create(nil); //保存窗体句柄 g_hInjectfrm := InjectFrm.handle; end; //默认处理这句可不能忘记 result := callNexthookEx(g_hhook,code,wparam,lparam); end; 0
相关文章读者评论发表评论 |
|