999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Windows API攔截技術

2008-12-31 00:00:00史永林李國鵬
電腦知識與技術 2008年27期

摘要:講述了Windows API攔截的關鍵技術和方法,重點講述了dll的注入技術和API攔截技術,并對各種技術進行了優缺點分析。

關鍵詞:API;攔截

中圖分類號:TP393文獻標識碼:A文章編號:1009-3044(2008)27-1920-03

Windows API Hooking Method

SHI Yong-lin,PAN Jin,LI Guo-Peng

(Department one of Xi'an Communication Institute,Xi'an 710016,China)

Abstract:This paper give a detail explanation of how to Intercepting Win32 API,its main concern is the way to inject dll into process's space and API hooking.It also tell the strong and weak point of the different methods.

Key words:API;hooking

Windows下API(應用程序編程接口,實際上就是Windows系統調用)的攔截是個很有用的技術,現在很多商用的系統都用到了這種技術,如屏幕取詞,內碼轉化,屏幕翻譯,中文平臺等等都涉及到了此項技術。比如大家熟悉的即時翻譯軟件,就是靠攔截TextOut()或ExtTextOut()這兩個系統API調用實現的,在操作系統用這兩個函數輸出文本之前,通過攔截這兩個調用,把傳遞給這兩個調用的的英文替換成中文,然后再調用原來的API輸出,從而達到即時翻譯的目的。可以說,掌握了這種技術,從某種意義上講就可以控制或改變操作系統或其他軟件的功能,這也是許多游戲外掛等常用的技術。而且這種技術也被許多病毒和木馬等利用,從而達到破壞系統和感染程序的目的,當然現在的反病毒軟件也多用到此技術。

1 Windows API攔截技術概述

Windows API攔截的主要目的是在其他應用程序調用API之前將其攔截,由攔截者先處理傳遞的參數數據,然后決定是否再調用原來的API。比如API

BOOL TextOutA( HDC hdc, int nXStart,int nYStart,LPCTSTR lpString, int cbString);

在其他程序調用這個API之前,攔截程序可以先捕獲這個調用,先對參數等進行處理,比如將cbString翻譯為中文等,然后再調用原來的TextOutA進行文本輸出,這樣輸出的文本就變成中文了。

API攔截的原理很簡單,但是要實現可靠的攔截則需要很多工作要做,首先需要把替換被攔截API的代碼注入到目標進程中,這些代碼一般是以動態鏈接庫(DLL)的形式存在的,然后修改目標進程執行代碼,使其在調用被攔截API之前先調用我們的替代代碼。這個過程的示意圖如圖1所示。

一般攔截程序至少需要兩個部分,一個是管理服務器(Management server),它的主要工作是攔截DLL的注入工作,并管理DLL的工作狀態,接收DLL發回的處理消息等;另一個是攔截DLL,它主要包含攔截代碼以及代碼注入和API攔截的一些輔助代碼。

總結起來API攔截主要有以下三點工作要做。

1) 要決定攔截哪些進程的API,如果是攔截個別進程的API,那么只需要在這個進程中插入攔截DLL,否則則需要在系統的所有進程中插入攔截DLL。

2) 決定采用哪種DLL注入技術。DLL注入技術有多種,但最常用的就兩種,一種是windows全局鉤子技術,另外一種是利用CreateRemoteThread() API來進行。我們將在第二節進行重點闡述。

3) 決定采用哪種API攔截機制。這也有多種技術可用,可以在內核層(kernel level)中進行,也可以在用戶層(user level)中進行。我們將在第三節對這個問題進行深入闡述。

2 DLL注入技術

代碼注入技術分為動態代碼注入技術和靜態代碼注入技術,動態代碼注入技術就是在進程啟動后或在進程啟動時在進程的運行空間中注入代碼的技術,而靜態注入技術就是在PE格式的.exe文件中插入代碼。靜態注入技術是病毒感染文件的常用方法,在文獻[1]中有詳細的敘述。動態注入技術也分為直接代碼注入技術和以dll形式的注入技術,直接代碼注入技術是利用VirtualAllocEx和CreateRemoteThread兩個API來進行的函數級代碼注入技術,可以采用匯編的形式,這種方法在文獻[1]中的進程隱藏一章中有詳細的講解,也可以采用高級語言如c語言的形式,這種方法有興趣的可以參考文獻[2]。很顯然API攔截只能采用動態代碼注入技術,由于直接代碼注入技術很復雜,靈活性很差,所以一般采用dll形式的動態代碼注入技術。

2.1 windows全局鉤子dll注入技術

Windows鉤子技術是windows提供的windows事件攔截技術,它可以使程序設計者在一些windows事件(如鼠標、鍵盤事件、窗口創建事件等)發送到特定窗口或線程之前捕獲并處理它們。具體鉤子的應用技術可以參考Microsoft msdn。

Windows全局鉤子可以把一個dll注入到系統中所有的進程空間中,這些都是由操作系統自動完成的。主要操作過程如下:

1) 首先創建一個dll,在其中中輸出注冊鉤子函數,如MouseProc和我們的攔截函數,如MyTextOutA等。

2) 用SetWindowsHookEx函數注冊全局鉤子。這時操作系統會自動把包含鉤子函數的dll映射到所有正在運行的進程空間。

3) 當不需要鉤子時,調用UnhookWindowsHookEx()函數卸載鉤子,則系統會自動從所有進程空間中卸載鉤子dll。

全局鉤子的使用是很簡單的,只是要注意全局變量共享等問題,要把dll的共享變量放到一個共享區中。

這種方法的優點是操作簡單,性能穩定,因為dll的注入和卸載等工作都是由操作系統自動完成的。它的缺點是不能選擇性的注入dll到特定的進程中,而且系統會調用我們的無用的鉤子函數來處理消息,從而可能會較大的降低系統的性能。

2.2 利用CreateRemoteThread的dll注入技術

這種方法在[3]中有較詳細的論述。它的原理也很簡單,但實現起來較復雜。要在其他的進程中注入dll,就要求我們能在那個進程中調用LoadLibrary() API,但我們沒有權限獲得其他進程的執行控制權,幸好微軟提供了一個函數CreateRemoteThread()可以在其他的進程中創建遠程線程,而恰好線程函數的原型:

DWORD WINAPI ThreadProc(LPVOID lpParameter);

和LoadLibrary()的原型:

HMODULE WINAPI LoadLibrary(LPCTSTR lpFileName);

HMODULE和DWORD都是雙字節,調用方式都是WINAPI,LPVOID和LPCTSTR都是雙字節指針,所以函數原型是一樣的。從而我們利用CreateRemoteThread()來欺騙操作系統,使其執行LoadLibrary() API,如下:

hThread = ::CreateRemoteThread(

hProcessForHooking, //要插入dll的進程句柄

NULL,

0,

pfnLoadLibrary,// LoadLibrary函數的地址

\"C:\\\\HookTool.dll\", //要注入的dll的全路徑

0,

NULL);

可以看出,采用這種方法的一個主要困難是要監視進程的創建和關閉,這樣才能確保在所有的目標進程中注入dll,有關這部分的內容可以參考[4]。LoadLibrary函數的地址因為其所在的Kernel32.DLL的映射地址在所有進程中是確定的,所以其值可以通過調用GetProcAddress()獲得。

這種方法的優點是可以選擇性的在特定進程中注入dll,而且不產生額外的開銷,基本不降低系統的性能。缺點是實現起來較復雜,要監視系統進程的活動。

3 API攔截機制技術

API攔截也有多種技術可以采用,從編程層次上可以分為內核級的和用戶級的。內核級的攔截技術靈活、可靠,但實現復雜,調試困難,有興趣的可以參考文獻[5]。用戶級也有多種技術,如dll替換技術、debug技術、目標API代碼修改和修改輸入表等,這些方法中比較可靠,應用較廣的是目標API代碼修改和修改輸入表兩種技術。

3.1 目標API代碼修改

這種技術說起來也不復雜,就是改變程序流程的技術。在CPU的指令里,有幾條指令可以改變程序的流程:JMP,CALL,INT,RET, RETF,IRET等指令。理論上只要改變API入口和出口的任何機器碼,都可以攔截API,但是實際實現起來要復雜很多,因為要處理好以下問題:

1) CPU指令長度問題,在32位系統里,一條JMP/CALL指令的長度是5個字節,因此你只有替換API里超過5個字節長度的機器碼(或者替換幾條指令長度加起來是5字節的指令),否則會影響被更改的小于5個字節的機器碼后面的數條指令,甚至程序流程會被打亂,產生不可預料的后果;

2) 參數問題,為了訪問原API的參數,你要通過EBP或ESP來引用參數,因此你要非常清楚你的攔截代碼里此時的EBP/ESP的值是多少;

3) 上下文的問題,有些攔截代碼不能執行某些操作,否則會破壞原API的上下文,原API就失效了;

舉個例子,假如要攔截的API的指令如下:

:71A21AF4 55 push ebp

:71A21AF5 8BECmov ebp, esp

:71A21AF7 83EC10sub esp, 00000010

......

:71A21B64 E8C7F6FFFF call 71A21230//要修改的代碼

......

而我們的替換函數的地址為0x8321A341,則我們可以將地址:71A21B64的代碼修改為call 8321A341,在我們的攔截代碼執行完后執行jmp 71A21230,再返回原來代碼處執行。可以看出,這種方法比較難找這條5字節的CALL指令,計算相對地址也復雜。

這種方法實現起來相當困難,而且靈活性和可靠性都比較差。所以一般不采用這種方法。

3.2 修改輸入表

通過修改目標進程的輸入表來攔截API是一種可靠、簡單而且容易實現的技術。這種技術在文獻[6]中有詳細的講解。要實現這種方法需要熟悉PE文件的格式,這些內容可以從文獻[1]中獲取。具體的實現需要以下幾個步驟:

1) 從IMAGE_OPTIONAL_HEADER32結構的第二個IMAGE_DATA_DIRECTORY結構中獲得輸入表的地址。

2) 根據要替換API所屬dll的名字查找IMAGE_IMPORT_DESCRIPTOR表,找到dll對應的IMAGE_IMPORT_DESCRIPTOR結構體。

3) 根據API的名字從IMAGE_IMPORT_DESCRIPTOR結構體中OriginalFirstThunk指向的IMAGE_THUNK_DATA列表中查找相應的API在數組中的序號。然后根據查得的序號在FirstThunk指向的IMAGE_THUNK_DATA列表中相應位置找到目標API地址。

4) 用我們自己的替換函數的地址代替找到的API地址。

這種方法簡單可靠,一般API攔截都采用這種技術。

4 總結

該文文講述了Windows API攔截的關鍵技術和方法,重點講述了攔截dll的注入方法和API攔截方法。但由于篇幅問題本文只是從整體上介紹了API攔截的一些關鍵技術,具體實現時還要很多問題需要考慮。

參考文獻:

[1] 羅云彬.Windows環境下32位匯編語言程序設計[M].北京:電子工業出版社,2002.

[2] Ciro Sisman Pereira.Portable Executable (P.E.) Code Injection:Injecting an Entire C Compiled Application[EB/OL].http://www.codeproject.com.

[3] Jeffrey Ritcher.Load Your 32-bit DLL into Another Process's Address Space Using INJLIB.MSJ May 1994.

[4] Ivo Ivanov.Detecting Windows NT/2K process execution[EB/OL].http://www.codeproject.com.

[5] Sven Schreiber.Undocumented Windows 2000 Secrets.

[6] Jeffrey Richter.Programming Application for MS Windows.

主站蜘蛛池模板: 在线观看无码a∨| 精品久久久久成人码免费动漫| 精品人妻一区二区三区蜜桃AⅤ| 国产电话自拍伊人| 中文字幕亚洲专区第19页| 日韩欧美成人高清在线观看| 亚洲AV免费一区二区三区| 无码免费视频| 青青久视频| 国产色婷婷| 免费无码AV片在线观看国产| 亚洲高清在线天堂精品| 1024国产在线| 亚洲无码免费黄色网址| 国产精品久久久精品三级| 日韩大片免费观看视频播放| 国产日韩欧美精品区性色| 久久亚洲综合伊人| 亚洲男人的天堂视频| 国产成人91精品| 中国特黄美女一级视频| 无码精油按摩潮喷在线播放 | 日本精品影院| 免费看a级毛片| 国产黄色片在线看| 国产尤物在线播放| 久久这里只精品热免费99| 亚洲国产天堂久久九九九| 国产区精品高清在线观看| 亚洲人在线| 欧美日韩激情| 亚洲激情99| 2021国产精品自拍| 亚洲AV一二三区无码AV蜜桃| 国产一区二区三区免费观看 | 国产精品太粉嫩高中在线观看 | 中文字幕无码av专区久久| 亚洲天堂久久久| 亚洲天堂视频在线观看免费| 国产精品永久久久久| 一级毛片免费高清视频| 国产麻豆永久视频| 五月综合色婷婷| 国产福利免费在线观看| 国产精品久久久精品三级| 国产鲁鲁视频在线观看| 青青青国产视频手机| 性色一区| 超清无码熟妇人妻AV在线绿巨人| 国产视频你懂得| 国产午夜无码片在线观看网站| а∨天堂一区中文字幕| 性色一区| 国产91麻豆免费观看| 好吊色妇女免费视频免费| a亚洲视频| 国产精品冒白浆免费视频| 2021国产精品自产拍在线| 久久伊人色| 亚洲男人的天堂久久香蕉 | 久久精品丝袜| 国产无码性爱一区二区三区| 亚洲中文字幕国产av| 成人无码区免费视频网站蜜臀| 国产精品丝袜视频| 欧美国产在线一区| 日韩欧美一区在线观看| 亚洲精品视频网| 在线欧美日韩国产| 伊人中文网| 国产制服丝袜无码视频| 3D动漫精品啪啪一区二区下载| 国产成人h在线观看网站站| 91在线无码精品秘九色APP| 91麻豆精品国产91久久久久| 久久亚洲美女精品国产精品| 日本五区在线不卡精品| 亚洲天堂视频在线播放| 人妻免费无码不卡视频| 国产91高跟丝袜| 免费观看亚洲人成网站| 亚洲国模精品一区|