国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關注微信公眾號

托管注入深入研究
2008-12-10   

這是我發表在《黑客防線》2008年12期上的一篇文章,這里是網絡上的首發。

附件是我寫的一個工具“超級間諜(SuperSpy)”,主要包括一個窗口探測功能,甚至能夠探測到VC自帶的SPY++所不能探測到的窗口;當然,還包括這里提到的“托管注入”功能。

程序需運行在.Net2.0以上,如果需要使用注入功能,則需要.Net3.5以上。

超級間諜下載地址:http://download.csdn.net/source/850509

網上關于dll注入的文章實在太多,但基本上都是針對Win32 dll的,而很少涉及到托管dll。

首先讓我們來看看Win32 dll是如何注入的,通常有兩種方法:鉤子和遠程線程。而遠程線程更靈活,所以本文主要討論遠程線程的方法,為了便于交流,先明確以下概念:

1. 主程序:用于將dll注入到其它進程的exe

2. dll:被注入其它進程的dll

3. 宿主:dll將被注入的其它程序

前兩個程序都是我們自己寫的,而第3個是原來就有的。

遠程注入的基本步驟為:主程序通過CreateRemoteThread函數迫使宿主調用LoadLibrary函數加載dll,從而執行dll的入口函數DllMain,只要我們把代碼放到DllMain里,就可以被調用了。

現在我們來看托管dll的注入:

用C#或VB.NET寫的dll沒有DllMain函數,我們自然想到了功能強大的C++。通常,我們把用C#或VB.NET寫的dll,或者用C++寫的,但編譯為/clr:pure的dll稱為托管dll

而把用C++編寫的,但編譯為/clr的dll稱為混合dll。

混合dll也可以調用托管代碼,所以也可以將其稱為托管dll,本文所說的托管dll注入,實際上是混合dll的注入。

我們首先想到的是用常規方法來注入混合dll,結果會發現:只要在DllMain函數里調用了托管代碼,程序就會崩潰。

也許你還會想到下面的方法:

定義一個類,在其構造函數里調用托管代碼,然后在全局域里定義這個類的一個變量,當我們這樣做了后會發現,注入后,什么也沒有執行。

查閱MSDN,我們找到了答案:

DllMain不能直接或間接地調用托管代碼,并且全局變量不會進行初始化。

這樣的結果讓人非常沮喪!

難道真的就沒有辦法了嗎?

網友CiCi給出了一個解決方案:

寫一個混合dll,在其中定義一個導出函數,在這個導出函數里可以調用托管代碼。

然后寫一個非托管dll(也就是Win32 dll),在其DllMain函數里調用前面那個混合dll的導出函數。

這個方案能夠解決問題,并且我在一段時間里,也一直使用這個方法。但總覺得不完美:必須使用兩個dll。

有沒有辦法用一個dll就解決問題呢?答案是肯定的。

我在一次偶然的機會中,發現了一個現象:

如里用鉤子來實現注入,則全局變量會得到初始化。這個發現讓我非常困惑:為什么遠程線程注入就不會初始化呢?

我考慮這兩種方法的區別:鉤子注入時,宿主會調用dll中的鉤子回調函數。

于是我大膽設想,只要宿主調用了dll中的任意一個函數,全局變量就會得到初始化。

于是我在dll中定義了一個空實現的函數(因為我的目地是迫使全局變量初始化,而不是去執行這個函數)

結果正如我所料,全局變量被初始化了,其構造函數中的托管代碼被調用了!

這里其實已經實現了托管代碼的注入,當然,還遠遠不夠完善。

這時候,我又覺得全局變量是多余的了:既然我能夠使宿主調用dll中的一個特定函數,為什么不直接把托管代碼放到這個函數中呢?

我馬上進行了測試,也成功了。

之前我是這樣實現讓宿主調用dll中的一個特定函數的:

在dll被注入之后,我在DllMain函數里將這個特定函數的地址寫到共享內存中(這時DllMain里沒有調用托管代碼,所以可以執行),然后主程序讀取共享內存中的值,再通過遠程線程迫使宿主調用這個特定函數。

于是我又想,既然可以在主程序中用遠程線程迫使宿主調用dll中的特定函數,為什么不直接在dll中用相同的方法去調用呢?

我還沒有來得及驗證,馬上又想到:dll跟宿主是一個進程,即使用遠程線程,傳給CreateRomoteThread函數的第一個參數也是-1(GetCurrentProcess()返回-1),為什么不直接用“近程”線程CreateThread呢?

需要著重強調地是:我當時用CreateThread的目的只是讓它調用一個特定函數,而不是要去創建一個線程,雖然最終的確創建了一個線程,不過對于此目的,貌似只是一個副作用。

我非常興奮,馬上進行了驗證,成功了!

現在我來總結一下托管代碼注入的過程:

首先定義一個線程回調函數,可以在其中調用托管代碼:

DWORD CALLBACK ThreadProc(LPVOID lp)

{

//可以在此調用托管代碼

return 0;

}

然后在dll的入口函數DllMain里調用CreateThread函數:

BOOL APIENTRY DllMain( HMODULE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved

)

{

switch (ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

CreateThread(0,0,ThreadProc,0,0,0);

break;

case DLL_THREAD_ATTACH:

break;

case DLL_THREAD_DETACH:

break;

case DLL_PROCESS_DETACH:

break;

}

return TRUE;

}

這樣就實現了托管代碼的注入。

深入話題:

通常我們會有這樣的要求:在主程序中單擊某個按扭,使宿主執行dll中的一段代碼,多次單擊就多次執行。

上面的代碼無法實現這個目地,因為只有dll剛被注入到宿主時,DllMain中的DLL_PROCESS_ATTACH才會收到通知,我們自然想到:每次執行后,卸載掉dll,下次單擊后,DLL_PROCESS_ATTACH又會收到通知;遺憾的是,目前我還沒有辦法卸載掉這個dll。

對于非托管dll,我們可以通過FreeLibrary來卸載(如果是在dll內部卸載,還必須借助FreeLibraryAndExitThread函數,關于dll的自卸載,由于沒有在這個程序中使用,這里就不做介紹了)

而對于托管dll,查閱MSDN,我們得到的結論是:.Net不支持dll的卸掉,dll只能隨著應用程序域的卸載而卸載。

對于混合dll,應該如何卸載呢?

我嘗試用Win32 dll的方式卸載,結果也“真的”卸載了,這是因為:

1. DllMain中的DLL_PROCESS_DETACH收到了通知

2. 用模塊查看工具去看,宿主中確實不存在注入的dll了

但事實上是失敗了,至少有兩個問題:

1. 關閉宿主時,會提示出錯

2. 再次注入時,雖然DLL_PROCESS_ATTACH會收到通知,但用CreateThread創建的新線程并不被執行

既然MSDN上都說無法卸載托管dll,那這個問題就擱淺了吧。

雖然不能卸載這個dll,但并不是說就不能實現前面提到的問題。

實際上,每次主程序通過CreateRemoteThread函數在宿主創建線程時,DllMain中的DLL_THREAD_ATTACH和DLL_THREAD_DETACH也會收到通知,當然最好不要在這里直接調用CreateThread,這是因為:

1. 如果不做處理,直接在DLL_THREAD_ATTACH中調中CreateThread,顯然會造成死循環:每產生一個線程,DLL_THREAD_ATTACH就會收到通知,然后又去創建線程,它又會得到通知……

2. 雖然多次單擊按扭注入時,DLL_THREAD_ATTACH都會得到通知;但反過來,得到了通知,不意味著就是遠程注入:一個最明顯的情況是,對CreateThread的調用就會導致DLL_THREAD_ATTACH收到通知,但這并非遠程注入

我的解決辦法是:每次主程序調用CreateRemoteThread迫使宿主調用LoadLibrary加載dll的時候,都會使模塊計數器加1,根據模塊計數器的值的變化,就可以確定是否是遠程注入了。

示例程序說明:

示例程序包括3個文件:

1. SuperSpy.exe 用C#寫的主程序

2. Invoke.dll 用C++寫的dll,也只能用C++來寫

3. PropertyControl.dll 用VB.NET寫的插件,它不是必需的

除了Invoke.dll必須用C++外,其余兩個可以用任意語言寫。

你也許會感到奇怪,為什么有兩個dll?

其中PropertyControl.dll是一個插件,你完全可以把所有的代碼都放到Invoke.dll中,之所以用插件的形式,只是為了方便大家編寫自已的插件,插件的規范是,在任意一個類中實現以下成員(你可以用你習慣的語言來編寫這個插件):

public static void Inject();

public static string Description

{

get;

}

兩個成員都必須是公共、靜態的,其中Inject方法是注入后要調用的方法;Description屬性是用于描述插件作用的。

我自已實現的插件的功能是:查詢和編輯一個托管程序中所有窗口(包括控件)的屬性,這是一個很強大的功能,我舉兩個例子:

1. 星號密碼查看。由于已經注入,本來顯示為星號的密碼,可以直接通過Text屬性獲得

2. 灰色按扭突破。只需將窗口的Enabled屬性設置成true即可

以往要實現這兩個功能,都需要分別編寫相關的程序,而現在僅僅是這個插件的一個簡單應用。而且,你可以編寫自己的插件,來實現自己的要求。


熱詞搜索:

上一篇:對某高級技工學校網站的安全檢測和加固(1)
下一篇:利用基于Web的黑客技術造攻擊uTorrent客戶端(1)

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
一区二区高清免费观看影视大全| 日韩国产精品久久久| 蜜臀a∨国产成人精品| 51精品久久久久久久蜜臀| 青青草国产精品97视觉盛宴| 91精品国产一区二区三区蜜臀| 亚洲综合无码一区二区| 欧美午夜精品免费| 免费视频一区二区| 国产女同性恋一区二区| 日本黄色一区二区| 青青草视频一区| 国产精品第13页| 欧美日韩综合不卡| 高清国产午夜精品久久久久久| 日韩美女视频一区| 精品久久久网站| 欧美专区日韩专区| 成人午夜免费电影| 青椒成人免费视频| 亚洲免费视频中文字幕| 精品国产乱码久久久久久久| 91麻豆国产福利在线观看| 老司机免费视频一区二区| 亚洲图片自拍偷拍| 中文字幕va一区二区三区| 欧美二区在线观看| 日本高清不卡一区| 91麻豆免费观看| 99久久er热在这里只有精品15| 日本美女一区二区三区| 午夜一区二区三区在线观看| 国产精品青草综合久久久久99| 精品va天堂亚洲国产| 日韩免费视频一区二区| 91精品国产aⅴ一区二区| 色婷婷激情综合| 欧亚一区二区三区| 欧美精品tushy高清| 欧美日韩成人激情| 91麻豆精品国产91久久久久久久久 | 美国毛片一区二区| 日韩精品视频网站| 免费在线观看日韩欧美| 午夜不卡在线视频| 久热成人在线视频| 国产激情一区二区三区| 国产精品一区二区免费不卡| 国产麻豆精品久久一二三| 国产成人av电影在线| 欧美三级中文字| 久久久久久99久久久精品网站| 国产日产亚洲精品系列| 亚洲精品乱码久久久久久久久| 亚洲风情在线资源站| 另类小说综合欧美亚洲| 99久久综合精品| 7777精品伊人久久久大香线蕉经典版下载 | 一区二区三区中文在线| 蜜桃av一区二区在线观看| 成人黄色片在线观看| 亚洲国产精品成人综合| 日韩av网站在线观看| 91视频观看视频| 国产女同互慰高潮91漫画| 视频一区中文字幕| 97se狠狠狠综合亚洲狠狠| 精品美女在线播放| 日韩av在线免费观看不卡| 99久久精品久久久久久清纯| 久久久无码精品亚洲日韩按摩| 夜夜精品浪潮av一区二区三区| 国产黄色精品网站| 国产欧美一区二区精品性| 另类中文字幕网| 26uuu色噜噜精品一区二区| 亚洲高清视频在线| 欧美军同video69gay| 天天综合天天综合色| 欧美卡1卡2卡| 久久精品国产在热久久| 欧美一卡2卡3卡4卡| 麻豆成人免费电影| 国产精品五月天| 91玉足脚交白嫩脚丫在线播放| 国产精品国产自产拍高清av王其| 国产精品91xxx| 伊人夜夜躁av伊人久久| 欧美伊人久久久久久久久影院| 亚洲成人免费在线观看| 欧美成人午夜电影| 精品国产乱码久久久久久影片| 日韩专区中文字幕一区二区| 精品乱人伦一区二区三区| 国产在线精品一区二区夜色| 国产精品蜜臀av| 欧美日韩国产高清一区二区| 久久成人av少妇免费| 中文字幕二三区不卡| 欧美日韩国产美| 亚洲mv在线观看| 欧美午夜在线观看| 成人免费毛片a| 狠狠色丁香久久婷婷综合_中| 国产精品国产三级国产三级人妇| 911国产精品| 日本高清视频一区二区| 国产成人免费在线观看| 丝袜国产日韩另类美女| 成人免费在线视频观看| 精品伦理精品一区| 欧美成人高清电影在线| 欧美色电影在线| 欧美日韩综合一区| 欧美日韩色一区| 欧美三级在线视频| 91国产丝袜在线播放| 欧美自拍丝袜亚洲| 欧美日韩国产一级片| 欧美日韩在线播放三区四区| 91黄色免费网站| 色婷婷av一区| 欧美精品久久99| 9191国产精品| 精品久久国产老人久久综合| www久久精品| 国产精品久久夜| 中文字幕在线不卡| 亚洲地区一二三色| 久草中文综合在线| 国模冰冰炮一区二区| fc2成人免费人成在线观看播放| 97国产一区二区| 欧美色欧美亚洲另类二区| 日韩精品一区二区三区中文不卡 | 久久精品国产秦先生| 久久精品国产免费| av亚洲产国偷v产偷v自拍| 欧美体内she精视频| 日本一二三四高清不卡| 午夜影院在线观看欧美| 床上的激情91.| 欧美在线观看视频一区二区三区| 91丝袜国产在线播放| 欧美日韩三级一区二区| 精品国产污网站| 日韩理论在线观看| 青青草原综合久久大伊人精品优势| 精品一区二区免费在线观看| 国产精品一级二级三级| 在线视频国内自拍亚洲视频| 日韩视频一区在线观看| 国产精品不卡在线| 久久电影网电视剧免费观看| 国产精品亚洲人在线观看| 欧美在线你懂得| 中文字幕va一区二区三区| 日韩不卡一区二区| 蜜桃视频一区二区| 欧美亚洲国产怡红院影院| www激情久久| 毛片av中文字幕一区二区| 97精品超碰一区二区三区| 久久久精品国产99久久精品芒果| 亚洲国产日产av| 欧美丝袜丝nylons| 亚洲精品成人精品456| 成熟亚洲日本毛茸茸凸凹| 久久新电视剧免费观看| 国产精品一级黄| 欧美国产一区二区| 成人午夜激情在线| 欧美国产综合一区二区| 国产很黄免费观看久久| 国产欧美日韩卡一| 成人a区在线观看| 亚洲麻豆国产自偷在线| 欧洲一区在线电影| 欧美精品一区二区蜜臀亚洲| 国产精品网曝门| 国产69精品久久99不卡| 欧美高清在线一区| 欧美主播一区二区三区| 日韩 欧美一区二区三区| 精品少妇一区二区三区| 成人黄色av网站在线| 亚洲人成在线播放网站岛国| 欧美性大战久久久久久久| 精品一区二区三区在线播放视频| 欧美激情资源网| 欧美日韩极品在线观看一区| 激情综合色播五月| 国产午夜精品久久久久久免费视| 国产成人8x视频一区二区| 亚洲福利视频导航| 中文字幕一区二区三区精华液| 成人免费毛片嘿嘿连载视频| 亚洲午夜在线视频| 亚洲视频一区在线| 久久久亚洲高清|