国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

用hook實現dll注入詳解

2019-11-18 18:15:52
字體:
來源:轉載
供稿:網友

需要一個用來注入的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.dll的SetInjectHook方法
   SetInjectHook(dwThreadID);
   //等待消息返回
   getmessage(msg,0,0,0);
   //找到注入的窗口
   hwndInject:= findwindow(nil,'InjectForm');
   //發送控制消息,將目標窗體的句柄作為wparam,控制參數以lparam傳入
   sendMessage( hwndInject, wm_app,hChild,integer(true));
   //關閉注入的窗口
   sendMessage( hwndInject,wm_close,0,0);
   //等待窗口關閉
   sleep(500);
   //檢查是否成功關閉
   assert(not iswindow( hwndInject));
   //去掉掛鉤
   setDipsHook(0);
end;  

//下面說明 Inject.dll的SetInjectHook的具體操作
在全局定義以下變量
 var
   g_hhook :Hhook=0;
   g_dwThreadidInject :dWord=0;
   g_hInjectfrm:hwnd;


function SetInjectHook(dwThreadid:DWORD):boolean;
begin
  result := false;
  //如果線程標志為0則用于去掉鉤子,否則進行動態庫注入
  if dwThreadid<>0 then
  begin
    assert(g_hhook=0);
    //保存當前線程的ID到 g_dwThreadidInject
    g_dwThreadidInject := getCurrentThreadid;
    //下一個GetMessage的鉤子到目標線程
    //GetMsgProc是在下面定義的一個函數,在第一次調用時將自定義的form在目標線程中創建出來
    //這樣就能通過這個自定義的form對目標線程進行進程內控制了
    g_hhook := setWindowsHookEx(wh_getMessage,GetMsgProc,hInstance,dwThreadid);
    result := g_hhook <> null;
    if result then
      //發一個空的信息以便于立即創建這個自定義form
      result := postThreadMessage(dwThreadid, wm_Null,0,0);
    //等待半秒鐘,以保證調用者可以找到這個剛創建的form
    sleep(500);
  end else
  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
  //如果是第一次
  if fFirstTime then
  begin
    fFirstTime := false;
    //創建窗體
    InjectFrm := TinjectFrm.create(nil);
    //保存窗體句柄
    g_hInjectfrm := InjectFrm.handle;
  end;
  //調用默認處理,這一句可不能忘記
  result := callNexthookEx(g_hhook,code,wparam,lparam);
end;


上一篇:[TButton]運行時動態創建和刪除按鈕

下一篇:判斷MonthCalander中鼠標點中了日期還是翻頁按鈕!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 耒阳市| 盱眙县| 阳西县| 宽甸| 电白县| 雷波县| 温宿县| 文昌市| 紫金县| 隆德县| 天镇县| 随州市| 庐江县| 双桥区| 景洪市| 额敏县| 文昌市| 东台市| 宁都县| 乌兰浩特市| 淮阳县| 密山市| 汉源县| 五台县| 谢通门县| 洛浦县| 曲阳县| 手游| 郴州市| 庆安县| 泗水县| 内丘县| 岢岚县| 阿瓦提县| 宁化县| 延寿县| 襄汾县| 林周县| 成武县| 巩义市| 阜平县|