易语言钩子DLL注入源码及源码说明
易語言鉤子DLL注入源碼及源碼說明2010-04-06 13:52[所有要使用到的API]
?
.版本 2
?
.DLL命令 LoadLibraryA, 整數(shù)型,"kernel32.dll","LoadLibraryA"
??? .參數(shù) lpLibFileName, 文本型
?
.DLL命令 SetWindowsHookExA, 整數(shù)型, "user32.dll", "SetWindowsHookExA", 公開, SetWindowsHookEx
??? .參數(shù) 鉤子類型, 整數(shù)型, , idHook
??? .參數(shù) 回調(diào)函數(shù)地址, 整數(shù)型, , lpfn
??? .參數(shù) 實例句柄, 整數(shù)型, , hmod
??? .參數(shù) 線程ID, 整數(shù)型, , dwThreadId
?
.DLL命令 FreeLibrary, 整數(shù)型, "kernel32.dll", "FreeLibrary", , 釋放指定的動態(tài)鏈接庫,它們早先是用LoadLibrary ;API函數(shù)裝載的 非零表示成功,零表示失敗。會設(shè)置GetLastError
??? .參數(shù) 庫句柄, 整數(shù)型, , hLibModule,要釋放的一個庫句柄,在VB里使用只能用這個函數(shù)釋放那些由應(yīng)用程序明確裝載的DLL。對LoadLibrary的每一次調(diào)用都應(yīng)該有一個對應(yīng)的FreeLibrary調(diào)用;
?
.DLL命令 UnhookWindowsHookEx, 整數(shù)型, "user32.dll", "UnhookWindowsHookEx", , UnhookWindowsHookEx
??? .參數(shù) 鉤子句柄, 整數(shù)型, , hHook
?
.DLL命令 CallNextHookEx, 整數(shù)型, "user32.dll", "CallNextHookEx", 公開, CallNextHookEx
??? .參數(shù) 鉤子句柄, 整數(shù)型, , hHook
??? .參數(shù) 代碼值, 整數(shù)型, , ncode
??? .參數(shù) 附加參數(shù)1, 整數(shù)型, , wParam
??? .參數(shù) 附加參數(shù)2, 整數(shù)型, 傳址, lParam
?
.DLL命令 GetProcAddress, 整數(shù)型, "kernel32.dll", "GetProcAddress", , 取進程路徑
??? .參數(shù) 模塊句柄, 整數(shù)型, , hModule
??? .參數(shù) 進程名稱, 文本型, , lpProcName
?
.DLL命令 GetCurrentThreadId, 整數(shù)型, "kernel32.dll", "GetCurrentThreadId"
?
.DLL命令 獲取特別文件夾位置_, 整數(shù)型, "shell32.dll", "SHGetSpecialFolderLocation"
??? .參數(shù) 窗口句柄, 整數(shù)型, , hwndOwner
??? .參數(shù) 文件夾位置, 整數(shù)型, , nFolder
??? .參數(shù) 結(jié)構(gòu), 項目標(biāo)識符列表_, 傳址, pIdl
?
.DLL命令 從列表id取路徑_, 整數(shù)型, "shell32.dll", "SHGetPathFromIDListA", , $(b)
??? .參數(shù) 結(jié)構(gòu)指針, 整數(shù)型, , pIdl
??? .參數(shù) 路徑, 文本型, 傳址, pszPath
?
.DLL命令 CallWindowProcA, 整數(shù)型, "user32.dll", "CallWindowProcA"
??? .參數(shù) 動態(tài)調(diào)用代碼, 字節(jié)集, , 一定要用本人編寫的
??? .參數(shù) 子程序, 子程序指針, , 子程序指針
??? .參數(shù) 參數(shù), 整數(shù)型, 數(shù)組, 為整數(shù)數(shù)組,參數(shù)1為成員1…類推;文本型和字節(jié)集型(自定義結(jié)構(gòu))為指針
??? .參數(shù) 參數(shù)數(shù)目, 整數(shù)型, , 一定要和參數(shù)數(shù)組相符,不然會出錯
??? .參數(shù) 是否C調(diào)用, 整數(shù)型, , 真為cdecl調(diào)用方式,假為stdcall調(diào)用方式(即標(biāo)準(zhǔn)WINAPI方式)
?
[這里函數(shù)所有代碼和一個自定義類型,API代碼在左邊]
?
?
.版本 2
?
.程序集 程序集1
.程序集變量 臨時呼出熱鍵, 整數(shù)型
.程序集變量 臨時載入窗口, 窗口
.程序集變量 鉤子模塊句柄, 整數(shù)型, , "1000"
.程序集變量 鉤子句柄, 整數(shù)型, , "1000"
.程序集變量 鉤子IDx, 整數(shù)型
.程序集變量 x, 整數(shù)型
.程序集變量 鉤子句柄1, 整數(shù)型
.程序集變量 temp目錄, 文本型
.程序集變量 xxx, 整數(shù)型
.程序集變量 熱鍵鉤子句柄, 整數(shù)型
.程序集變量 第一次, 邏輯型
?
.子程序 調(diào)用_調(diào)用子程序, 整數(shù)型, 公開, 呼叫某個函數(shù) 可以傳入無限個參數(shù) 返回函數(shù)返回值
.參數(shù) 子程序指針, 子程序指針, , 指定函數(shù)
.參數(shù) 參數(shù), 整數(shù)型, 可空 數(shù)組, 指定參數(shù) 可以不寫, 參數(shù)為數(shù)組 格式為 參數(shù)[1]=xxx 參數(shù)[2]=xxx 文本型或字節(jié)集請用 轉(zhuǎn)換指針? ?格式2 加入成員(參數(shù),xxx)
.局部變量 動態(tài)調(diào)用代碼, 字節(jié)集
?
動態(tài)調(diào)用代碼 = { 85, 139, 236, 86, 139, 117, 16, 141, 78, 255, 133, 201, 124, 21, 139, 69, 12, 141, 4, 136, 65, 139, 16, 137, 85, 16, 255, 117, 16, 131, 232, 4, 73, 117, 242, 255, 85, 8, 137, 69, 12, 139, 69, 20, 133, 192, 116, 13, 141, 4, 181, 0, 0, 0, 0, 137, 69, 16, 3, 101, 16, 139, 69, 12, 94, 93, 194, 16, 0 }
返回 (CallWindowProcA (動態(tài)調(diào)用代碼, 子程序指針, 參數(shù), 取數(shù)組成員數(shù) (參數(shù)), 0))
?
.子程序 操作_取特定目錄, 文本型, 公開, 取特定的目錄(返回所要取的指定目錄名 無效返回空)
.參數(shù) 欲獲取目錄類型, 整數(shù)型, 可空, 0我的桌面 1臨時目錄 5我的文檔 6我的收藏夾 7我的啟動 11我的開始菜單 20系統(tǒng)字體 36Windows安裝目錄 37系統(tǒng)目錄 [99更多]
.局部變量 路徑, 文本型
.局部變量 標(biāo)示結(jié)構(gòu), 項目標(biāo)識符列表_
.局部變量 目錄類型, 整數(shù)型
?
.如果真 (欲獲取目錄類型 = 99)
??? 輸出調(diào)試文本 (“0我的桌面 2我的程序 5我的文檔 6我的收藏夾 7我的啟動 8我最近的文檔 9我的發(fā)送到 11我的開始菜單 13我的音樂 14我的視頻 16我的桌面 20系統(tǒng)字體 22開始菜單組 23程序組 24啟動組 25桌面 31收藏夾 32我的瀏覽器臨時目錄 33我的Cookies 34我的歷史記錄 36Windows安裝目錄 37系統(tǒng)目錄 38文件安裝目錄 39我的圖片 40用戶目錄 41系統(tǒng)目錄 46文檔 47管理工具 48我的管理工具 53音樂 54圖片 55視頻”)
.如果真結(jié)束
.如果 (欲獲取目錄類型 = 1)
??? 目錄類型 = 34
.否則
??? 目錄類型 = 欲獲取目錄類型
.如果結(jié)束
獲取特別文件夾位置_ (0, 目錄類型, 標(biāo)示結(jié)構(gòu))
路徑 = 取空白文本 (255)
從列表id取路徑_ (標(biāo)示結(jié)構(gòu).結(jié)構(gòu)大小, 路徑)
.如果真 (路徑 = “”)
??? 返回 (“”)
.如果真結(jié)束
.如果真 (欲獲取目錄類型 = 1)
??? 路徑 = 子文本替換 (路徑, “History”, “Temp”, , , 真)
.如果真結(jié)束
返回 (路徑 + “\”)
?
.子程序 注入_安裝鉤子DLL, 整數(shù)型, 公開, DLL注入 返回0=失敗????? 整數(shù)型 DLL接口(代碼值,參數(shù)1,參數(shù)2)
.參數(shù) 線程ID, 整數(shù)型, , -1 全局鉤子
.參數(shù) DLL全名, 文本型, , DLL全名
.參數(shù) DLL接口, 文本型, 可空, 默認 整數(shù)型 鉤子接口(代碼值,參數(shù)1,參數(shù)2)
.局部變量 臨時變量, 整數(shù)型
.局部變量 目錄, 文本型
.局部變量 窗口句柄, 整數(shù)型
?
.如果真 (是否為空 (DLL接口) = 真)
??? DLL接口 = “鉤子接口”
.如果真結(jié)束
.如果真 (線程ID = 0)
??? 返回 (0)
.如果真結(jié)束
.如果真 (線程ID = -1)
??? 線程ID = 0
.如果真結(jié)束
鉤子IDx = 鉤子IDx + 1
鉤子模塊句柄 [鉤子IDx] = LoadLibraryA (DLL全名)
鉤子句柄 [鉤子IDx] = SetWindowsHookExA (3, GetProcAddress (鉤子模塊句柄 [鉤子IDx], DLL接口), 鉤子模塊句柄 [鉤子IDx], 線程ID)
目錄 = 操作_取特定目錄 (1)
寫配置項 (目錄 + “ada.ini”, “ada”, “鉤子句柄”, 到文本 (鉤子句柄 [鉤子IDx]))
輸出調(diào)試文本 (鉤子IDx, 鉤子模塊句柄 [鉤子IDx], 鉤子句柄 [鉤子IDx])
返回 (鉤子IDx)
?
.版本 2
?
.子程序 注入_卸載鉤子DLL, 邏輯型, 公開
.參數(shù) 鉤子ID, 整數(shù)型, 可空, 卸載所有時無效
.參數(shù) 卸載所有, 邏輯型, 可空
.局部變量 xx, 整數(shù)型
?
.如果真 (卸載所有)
??? .如果真 (鉤子IDx > 0)
??????? .計次循環(huán)首 (鉤子IDx, xx)
??????????? .如果真 (鉤子模塊句柄 [xx] ≠ 0)
??????????????? FreeLibrary (鉤子模塊句柄 [xx])
??????????????? UnhookWindowsHookEx (鉤子句柄 [xx])
??????????? .如果真結(jié)束
?
??????? .計次循環(huán)尾 ()
??? .如果真結(jié)束
??? 返回 (真)
.如果真結(jié)束
.如果真 (鉤子ID > 0)
??? .如果真 (鉤子模塊句柄 [鉤子ID] ≠ 0)
??????? FreeLibrary (鉤子模塊句柄 [鉤子ID])
??????? UnhookWindowsHookEx (鉤子句柄 [鉤子ID])
??????? 返回 (真)
??? .如果真結(jié)束
?
.如果真結(jié)束
返回 (假)
?
?
.子程序 注入_初始化鉤子DLL, 整數(shù)型, 公開, DLL用.
.參數(shù) 代碼值, 整數(shù)型
.參數(shù) 參數(shù)1, 整數(shù)型
.參數(shù) 參數(shù)2, 整數(shù)型
.參數(shù) 初始, 子程序指針
.局部變量 xxxx, 整數(shù)型
?
.如果真 (鉤子句柄1 = 0)
??? temp目錄 =操作_取特定目錄 (1)
??? 鉤子句柄1 = 到整數(shù) (讀配置項 (temp目錄 + “ada.ini”, “ada”, “鉤子句柄”, ))
.如果真結(jié)束
.如果真 (第一次 = 假)
??? 第一次 = 真
??? 調(diào)用_調(diào)用子程序 (初始)
.如果真結(jié)束
返回 (CallNextHookEx (鉤子句柄1, 代碼值, 參數(shù)1, 參數(shù)2))
?
.子程序 注入_設(shè)置呼出窗口, 邏輯型, 公開
.參數(shù) 設(shè)置熱鍵, 整數(shù)型
.參數(shù) 呼出窗口, 窗口
?
臨時呼出熱鍵 = 設(shè)置熱鍵
臨時載入窗口 = 呼出窗口
熱鍵鉤子句柄 = SetWindowsHookExA (2, 到整數(shù) (&呼出鍵接口), 0, GetCurrentThreadId ())
.如果真 (熱鍵鉤子句柄 > 0)
??? 返回 (真)
.如果真結(jié)束
返回 (假)
?
.子程序 呼出鍵接口, 整數(shù)型
.參數(shù) 一, 整數(shù)型
.參數(shù) 二, 整數(shù)型
.參數(shù) 三, 整數(shù)型
?
.如果真 (一 = 0 且 二 = 臨時呼出熱鍵 且 三 > 0)
??? .如果 (是否已創(chuàng)建 (臨時載入窗口))
??????? .如果 (臨時載入窗口.可視)
??????????? 臨時載入窗口.可視= 假
??????? .否則
??????????? 臨時載入窗口.可視= 真
??????? .如果結(jié)束
?
??? .否則
??????? 載入 (臨時載入窗口, , 假)
??????? 臨時載入窗口.Esc鍵關(guān)閉= 假
??????? 臨時載入窗口.最小化按鈕= 真
??? .如果結(jié)束
?
.如果真結(jié)束
返回 (CallNextHookEx (熱鍵鉤子句柄, 一, 二, 三))
?
?
?
.版本 2
?
.數(shù)據(jù)類型 項目標(biāo)識符列表_, , ITEMIDLIST
??? .成員 結(jié)構(gòu)大小, 整數(shù)型, , , cb
??? .成員 標(biāo)識符長度, 字節(jié)型, , "255", abID
?
?
?
此函數(shù)是用來調(diào)用指針函數(shù)的.就是CALL
?
取目錄用這個我就不解釋了
下面是源碼主要函數(shù)
函數(shù)解釋:
?
本函數(shù)參數(shù)1為要HOOK的線程ID,參數(shù)2為要注入的DLL名,參數(shù)3[可空]為DLL接口名字空則為"鉤子接口".
下面解釋是如何實現(xiàn)的:
?
1.首先使用LoadLibraryA獲取DLL模塊地址.
2.然后設(shè)置SetWindowsHookExA
?
參數(shù)一為HOOK類型,使用WH_GETMESSAGE(3) Hook來監(jiān)視從GetMessage or PeekMessage函數(shù)返回息。
?
?? 參數(shù)二為接口地址,就是說把消息返回轉(zhuǎn)接到的位置,當(dāng)然我們這里所使用的是我們DLL所公開的那個函數(shù)
?
?? 參數(shù)三為接口模塊的句柄即DLL的句柄(地址)
?
?? 參數(shù)四為將要被HOOK的線程ID(0為全局HOOK,不推薦使用全局HOOK)
?
3.設(shè)置完后將鉤子句柄寫配置項到臨時目錄(后面將要使用).
?
?
說白了其實這個才是真正的接口(DLL里的接口只是在做轉(zhuǎn)接而已),
?
我先講這個函數(shù)是如何實現(xiàn)的(上面已經(jīng)說了這才是真正的接口).
?
1,鉤子句柄是一個程序集變量,先判斷這個變量是否為0,如果等于0那么就是說這個函數(shù)第一次被使用,
?
第一次使用將讀去上個函數(shù)寫在臨時目錄的鉤子句柄.
?
2.用一個邏輯變量(程序集變量或全局變量),來判斷這個消息鉤子是否第一次運行(為了防止后面調(diào)用
?
子程序被多次調(diào)用),是的話調(diào)用一個子程序(自己設(shè)置)
?
3.使用CallNextHookEx(呼叫下一個鉤子)把當(dāng)前HOOK的信息在傳送回被HOOK的鉤子里,那個鉤子我們
?
就不用管了.
?
下來說下到底如何使用
?
首先在你的EXE程序里寫這個(我就不多說這是干嗎的了).
?
然后在DLL里寫上這個代碼(有人可能覺得眼熟,好像在什么地方見過,對了這個代碼和
?
外掛作坊的鉤子注入差不多)
?
下來說明下按鍵呼出窗口的函數(shù)
?
用變量把當(dāng)前參數(shù)存起來(主要方便接口調(diào)用)
?
1.為當(dāng)前運行線程設(shè)置一個鍵盤鉤子
?
2.[接口]設(shè)置按鍵判斷,如果按下我們設(shè)置的鍵將呼出窗口,如果這個窗口沒創(chuàng)建將判斷創(chuàng)建,
?
如果已經(jīng)創(chuàng)建再次按下則會隱藏,
?
載入后的窗口把用ESC關(guān)閉的屬性弄成假,不需要ESC關(guān)閉
?
3.最后就是再呼叫下以前的鉤子.
?
最后就是卸載鉤子DLL了.
?
判斷是否要卸載全部的鉤子,如果是就循環(huán)將現(xiàn)有鉤子DLL全部卸載.
?
不是就按著ID來卸載
?
卸載方法:
?
1.FreeLibrary就是卸載一個載入的DLL
?
2.UnhookWindowsHookEx乃是卸載這個HOOK
?
-.-OK了這就是 鉤子DLL注入,謝謝大家閱讀,如果看不明白,
?
請先到百度百科找下SetWindowsHookEx 然后研究下這個函數(shù)干嗎用的.
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/wanghj-dz/archive/2011/11/14/2248007.html
總結(jié)
以上是生活随笔為你收集整理的易语言钩子DLL注入源码及源码说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php css布局技巧,最全的CSS开发
- 下一篇: 曲线的生成算法实现_PCGPlanet1