.版本 2
.全局變量 TheNodeP, 整數型
.全局變量 hhook, 整數型, 公開
.全局變量 DLL, Main
.程序集 HOOK程序集
.程序集變量 hMod, 整數型
.程序集變量 lpProc, 子程序指針
.程序集 DLL程序集
.版本 2
.子程序 _啓動子程序, 整數型, , 請在本子程序中放置動態鏈接庫初始化代碼
複製共享數據 () '初始化代碼,只有在程序第一次加載DLL時才被執行
_臨時子程序 ()
返回 (0)
'先看看鉤子回調函數:
.子程序 GetMsgProc, 整數型, 公開, 鉤子回調函數
.參數 code, 整數型
.參數 wParam, 整數型
.參數 lParam, 整數型
.局部變量 lpThreadA, SECURITY_ATTRIBUTES
.局部變量 LibraryH, 整數型
.局部變量 ThreadPt, 整數型
.局部變量 ThreadID, 整數型
' 截獲到消息,開始執行下面的自定以代碼(回調函數)
複製共享數據 ()
.如果真 (TheNodeP ≠ 0 且 pnode.ExplorerID ≠ 0 且 api_GetCurrentProcessId () =
pnode.ExplorerID) ' 是資源管理器
.如果真 (倒找文本 (MainPath, “.dll”, , 真) ≠ -1) ' DLL路徑是否正確
LibraryH = api_LoadLibraryA (MainPath) ' 裝載動態鏈接庫
.如果真結束
.如果真 (LibraryH ≠ 0)
ThreadPt = 到整數 (api_GetProcAddress (LibraryH, “ThreadPro”)) ' 定位線程函數
.如果真 (ThreadPt ≠ 0)
api_CreateThread (lpThreadA, 0, ThreadPt, 0, 0, ThreadID) ' 創建新線程
.如果真結束
.如果真結束
.如果真結束
返回 (api_CallNextHookEx (hhook, code, wParam, lParam)) ' 鉤子循環
再看看子程序:複製共享數據
.子程序 複製共享數據, 邏輯型
.局部變量 i, 整數型
.局部變量 MainPath, 文本型
.局部變量 FileMapH, 整數型
FileMapH = api_OpenFileMapping (#FILE_MAP_ALL_ACCESS, 0, “HookExplorer8Mazi”)
.如果真 (FileMapH = 0)
輸出調試文本 (“打開內存映射文件出錯!”)
返回 (假)
.如果真結束
TheNodeP = api_MapViewOfFile (FileMapH, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
.如果真 (TheNodeP = 0)
api_CloseHandle (FileMapH)
輸出調試文本 (“映射到本進程空間出錯!”)
返回 (假)
.如果真結束
'取回共享數據
DLL.ExplorerID = 取字節集數據 (指針到字節集 (TheNodeP, 4), 3, )'整數型數據尺寸大小是4
DLL.MainThread = 取字節集數據 (指針到字節集 (TheNodeP + 4, 4), 3, ) '+4
DLL.MainPath = 指針到文本 (TheNodeP + 8) '+8
API_UnmapViewOfFile (TheNodeP) ' 關閉內存映射
api_CloseHandle (FileMapH) ' 關閉文件映射對象
返回 (真)
'鉤子回調函數完成,現在開始寫待插線程代碼,這裏實現寫文字到屏幕的功能
.版本 2
.子程序 ThreadPro, , 公開, 待插線程代碼
.局部變量 Count, 整數型
.局部變量 theMsg, MSG
.局部變量 FileMap, 整數型
.局部變量 nil, SECURITY_ATTRIBUTES
.局部變量 HotKeyID, 整數型
api_PostThreadMessage (DLL.MainThread, #WM_QUIT, 0, 0)
FileMap = api_OpenFileMapping (#FILE_MAP_ALL_ACCESS, 0, “hacker0058Explorer8Mazi”) ' 禁
止重複運行
api_CloseHandle (FileMap)
.如果真 (FileMap = 0)
FileMap = api_CreateFileMapping (-1, nil, 4, 0, 2, “hacker0058Explorer8Mazi”)
Count = 0
HotKeyID =GlobalAddAtom(“hacker0058andALT+L”) ' 申請全局原子
RegisterHotKey (0, HotKeyID, 1, #L鍵) '註冊熱鍵Alt+L
.判斷循環首 (api_PeekMessage (theMsg, 0, 0, 0, #PM_REMOVE) = 0 且 取反 (theMsg.message
= #WM_HOTKEY) 或 theMsg.message = #WM_QUIT)
WriteScreen (“ ” + Int2Hex (Count) + “ [The Thread is From ” + 取執行文件
名 () + “ and Alt+L to Exit ”)
Count = Count + 1
延時 (500)
.判斷循環尾 ()
api_CloseHandle (FileMap)
UnregisterHotKey(0, HotKeyID) '撤銷熱鍵Alt+L
DeleteAtom (HotKeyID) '釋放全局原子
.子程序 WriteScreen, , , 寫文字到屏幕
.參數 s, 文本型
.局部變量 hScreenDC, 整數型
hScreenDC = 取設備場景_ (0)
api_TextOut (hScreenDC, 0, 0, s, 取文本長度 (s)) '寫文字到屏幕
api_ReleaseDC (0, hScreenDC) '撤消寫文字到屏幕
.子程序 Int2Hex, 文本型, , 數值轉字符串
.參數 v, 整數型
.局部變量 i, 整數型
.局部變量 a, 文本型
.局部變量 b, 文本型
b = 取十六進制文本 (v) '
.計次循環首 (8 - 取文本長度 (b), i)
a = a + “0”
.計次循環尾 ()
返回 (“$” + a + b)
.子程序 GetMsgHookOff, 邏輯型, 公開, 關閉全局消息鉤子
返回 (api_UnhookWindowsHookEx (hhook))
.子程序 GetMsgHookOn, 整數型, 公開, 安裝全局消息鉤子
hMod = api_LoadLibraryA (MainPath) '加載DLL,返回模塊地址
lpProc = api_GetProcAddress (hMod, “GetMsgProc”) 'DLL中鉤子回調函數地址
hhook = api_SetWindowsHookExA (#WH_GETMESSAGE, lpProc, hMod, 0) '安裝鉤子
返回 (hMod)
好了,整個框架就這樣了,由於篇幅原因,具體的不再細說了.附件裏有完整的易程序源碼,具體細節大家可
以參閱,源碼在Windows xp+sp2 易4.02中測試通過.
下期預告:
下一期我們將介紹API Hook技術,API Hook技術應用廣泛,常用於屏幕取詞,網絡防火牆,病毒木馬,加殼
軟件,串口紅外通訊,遊戲外掛,internet通信等領域.API HOOK的中文意思就是鉤住API,對API進行預處理
,先執行我們的函數,例如我們用API Hook技掛接ExitWindowsEx API函數,使關機失效等等......
敬請期待
end