[轉載]Windows Hook 易核心編程遠程線程注入 下

現在主程序已經完成了它的任務,現在來看看我們執行的核心,HookDLL.dll的代碼:


.版本 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章