DLL注入技術之輸入法注入

2021-06-29 06:48:58 字數 1802 閱讀 5731

輸入法注入原理是利用windows系統中在切換輸入法需要輸入字元時,系統就會把這個輸入法需要的ime檔案裝載到當前程序中,而由於這個ime檔案本質上只是個存放在c:\windows\system32目錄下的特殊的dll檔案,因此我們可以利用這個特性,在ime檔案中使用loadlibrary()函式待注入的dll檔案。

1.編寫ime檔案

輸入法的ime檔案其實就是個顯式匯出19個特殊函式的dll檔案。如下圖所示:

如果想編寫輸入法程式,那麼這19個匯出函式都需要仔細的研究,但是對於只想實現注入的我們,現在只需要對imeinquire()有比較深的認識就可以了。imeinquire()是啟動並初始化當前ime輸入法函式,他的宣告如下:

bool winapi imeinquire(lpimeinfo lpimeinfo,lptstr lpszuiclass,lpctstr lpszoption)

複製**

第乙個引數lpimeinfo比較重要,用於輸入對ime輸入法初始化的內容結構,如果這個結構填寫錯誤,就會導致輸入法不能正常執行。第二個引數是輸入乙個class類名,我們需要先使用registerclas***()註冊出乙個視窗類。初始化imeinquire()主要**如下所示:

//啟動並初始化當前ime輸入法

bool winapi imeinquire(lpimeinfo lpimeinfo,lptstr lpszuiclass,lpctstr lpszoption)

複製**

註冊出乙個視窗類的主要**如下:

bool imeclass_register(hinstance hinstance)

複製**

clsname_ui是乙個巨集定義,如下:

#define clsname_ui _t("dllclassname")

複製**

在dllmain程序載入的過程中註冊視窗類,主要**如下:

case dll_process_attach:

if(!imeclass_register(hinstdll)) return false;

//這裡填寫要load的dll的路徑

g_hmodule = loadlibrary(_t("d:\\mydll\\imeinject\\debug\\mfcimeinjectdll.dll"));

if (!g_hmodule)

break;

複製**

此刻預設輸出的dll副檔名是.dll,與副檔名是.ime不符,可以通過下圖設定將其副檔名改為.ime:

2.編寫裝載輸入法程式:

裝載輸入法的基本邏輯就是將他們編寫的輸入法設定為預設輸入法,這樣只要系統中所有程序都會預設載入他們的惡意輸入法程式。

黑客們首先需要得到系統當前的預設的輸入法,以便恢復時使用。然後需要將ime檔案拷貝到c:\windows\system32目錄下,最後將裝載成功後將我們的輸入法設定成為預設輸入法,主要**如下:

void cmfcimeinjectdlg::onbnclickedattach()}

複製**

3.編寫解除安裝輸入法:

當新建程序不再需要注入時,我們就需要解除安裝輸入法。解除安裝輸入法時需要先判定系統當前的輸入法不是其原有預設輸入法,確認無誤後將系統的預設輸入法恢復後,再將惡意輸入法解除安裝即可,主要**如下:

void cmfcimeinjectdlg::onbnclickeddettach()}

複製**

輸入法注入的實現需要對輸入法ime檔案的生成有所了解,api使用較多,所以實現起來比較難,但是由於系統存在多個輸入法,被注入程序很難判別當前是可信賴輸入法還是用於注入的惡意輸入法,所以難以阻止,大大提高了注入的機率

Dll注入技術之輸入法注入

dll注入技術之輸入法注入 輸入法注入原理是利用windows系統中在切換輸入法需要輸入字元時,系統就會把這個輸入法需要的ime檔案裝載到當前程序中,而由於這個ime檔案本質上只是個存放在c windows system32目錄下的特殊的dll檔案,因此我們可以利用這個特性,在ime檔案中使用loa...

注入技術 修改輸入表完成DLL注入

參考自 加密與解密 第4版 第12章 注入技術 dll檔案 細節省略,通過使用messagebox函式來顯示訊息框,僅此而已。關於dll檔案的編寫,也是日後要好好學習的點。dll檔案也有自己的主函式,博主未編寫用於攻擊的dll 即使編寫了也不敢公然發 故在此一筆帶過了。本文的重點是修改輸入表,故我們...

注入Hook技術 DLL注入

winnt win2000 winxp中的遠執行緒技術之一 dll注入 什麼是遠執行緒?我們知道用createthread可以在當前程序裡建立乙個執行緒,遠執行緒與此類似,只不過是在其他程序中建立乙個執行緒,用api函式createremotethread。這個遠執行緒建立後就與建立它的程序無關了,...