国产一级一区二区_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久久夜色精品国产_欧美色网一区二区
蜜臀久久99精品久久久久久9| 欧美在线视频全部完| 国产一区二区视频在线观看| 国内成+人亚洲+欧美+综合在线| 激情综合视频| 99精品国产高清一区二区| 欧美一级网站| 欧美激情精品久久久六区热门 | 欧美精品一区二区三| 国产精品久久波多野结衣| 国产一区二区三区四区在线观看| 亚洲高清一区二| 亚洲一级特黄| 欧美电影打屁股sp| 国产精品一区二区欧美| 亚洲欧洲一区二区三区| 亚洲综合激情| 欧美日韩99| 在线观看91精品国产麻豆| 亚洲免费在线电影| 欧美大片网址| 国产一区二区久久久| 中文国产一区| 欧美激情一区二区| 狠狠色丁香婷婷综合影院| 亚洲一区二区三区四区中文 | 日韩一级大片| 久久尤物视频| 国产伦精品一区二区三区高清版 | 亚洲欧美一区二区三区在线 | 欧美亚洲综合另类| 欧美日韩免费在线观看| 一区二区视频欧美| 欧美专区在线| 国产精品美女黄网| 一本色道久久88综合日韩精品| 久久偷看各类wc女厕嘘嘘偷窃| 国产欧美日韩精品a在线观看| 亚洲视频专区在线| 欧美日韩亚洲三区| 99精品国产福利在线观看免费| 美女免费视频一区| 在线观看日韩av先锋影音电影院| 欧美有码在线观看视频| 国产精品久久久久毛片软件| 99国产精品久久久久老师| 欧美大片va欧美在线播放| 亚洲国产成人高清精品| 另类尿喷潮videofree| 一区二区视频免费完整版观看| 欧美主播一区二区三区| 国产一区二区精品| 久久亚洲春色中文字幕| 狠狠色噜噜狠狠狠狠色吗综合| 久久黄色小说| 狠狠色综合色区| 另类综合日韩欧美亚洲| 亚洲高清自拍| 欧美日本免费| 亚洲一区欧美激情| 国产精品稀缺呦系列在线| 亚洲欧美日韩视频一区| 国产日韩精品在线播放| 久久精品二区亚洲w码| 亚洲成人在线观看视频| 欧美电影免费| 亚洲一区二区精品视频| 国产日韩一区二区| 久热精品视频| av不卡在线| 国产精品日韩在线观看| 午夜一区不卡| 亚洲成在线观看| 欧美日韩亚洲一区三区| 午夜亚洲一区| 黄色日韩在线| 欧美一级在线视频| 一区二区视频免费在线观看| 欧美不卡高清| 亚洲尤物在线视频观看| 国产日韩一区| 欧美高清成人| 性xx色xx综合久久久xx| 一区二区在线观看视频在线观看 | 性色av香蕉一区二区| 在线日韩电影| 欧美日韩视频在线| 欧美在线短视频| 日韩一级二级三级| 国产日本欧美在线观看| 欧美高清影院| 亚洲免费视频观看| 亚洲承认在线| 国产精品啊v在线| 麻豆freexxxx性91精品| 亚洲伊人第一页| 亚洲福利小视频| 国产精品―色哟哟| 免费在线观看成人av| 亚洲欧美日韩成人高清在线一区| 在线不卡中文字幕| 国产麻豆综合| 欧美精品日韩精品| 久久婷婷亚洲| 亚洲欧美日本国产专区一区| 亚洲精品国产精品国产自| 国产精品系列在线| 欧美日韩精品免费观看视频完整| 久久成人国产精品| 亚洲午夜国产成人av电影男同| 黄色综合网站| 国产精品久久久爽爽爽麻豆色哟哟| 久久久久在线| 欧美一区二区三区在线免费观看| 99精品视频免费全部在线| 影音先锋另类| 国产日韩精品久久| 欧美视频一二三区| 欧美激情片在线观看| 久久亚洲图片| 欧美影院在线| 亚洲一区二区在线观看视频| 99热在线精品观看| 亚洲国产高清一区| 国外成人性视频| 国产亚洲精品久久久久婷婷瑜伽| 国产精品久久久久一区二区三区共| 欧美黄色视屏| 麻豆国产va免费精品高清在线| 午夜精品一区二区三区在线 | 美女被久久久| 欧美中文在线免费| 欧美亚洲视频在线观看| 亚洲综合电影| 亚洲欧美日本在线| 欧美一区精品| 欧美一区二区免费视频| 欧美一区二区三区免费视频| 亚洲免费影视| 午夜在线观看欧美| 午夜精品久久久久久久蜜桃app| 亚洲影院在线| 亚洲一区在线播放| 欧美一区二区三区播放老司机| 午夜精品av| 欧美在线视频二区| 久久久亚洲人| 欧美 日韩 国产一区二区在线视频| 久久亚洲国产精品一区二区| 久久久久久夜| 欧美黑人多人双交| 欧美日韩国产一区二区三区| 欧美性一二三区| 国产精品美女主播| 国产欧美日韩综合一区在线观看| 国产精品你懂得| 好吊日精品视频| 亚洲国产精品激情在线观看 | 一区二区三区波多野结衣在线观看| 亚洲免费电影在线| 在线一区二区三区四区| 亚洲一区二区三区高清不卡| 亚洲男人的天堂在线| 午夜精品久久久久久久99水蜜桃| 欧美一区二区视频在线观看| 午夜亚洲激情| 蜜桃精品久久久久久久免费影院| 欧美成人午夜剧场免费观看| 欧美日韩一区在线播放| 国产精品视频你懂的| 在线播放日韩专区| 日韩亚洲在线观看| 午夜精品久久久久久久久| 久久久美女艺术照精彩视频福利播放| 久久精品夜色噜噜亚洲aⅴ| 欧美高清在线| 欧美午夜理伦三级在线观看| 国产一区二区毛片| 亚洲国产一区二区三区a毛片| 在线亚洲一区观看| 久久久久.com| 欧美日韩另类综合| 黄色亚洲大片免费在线观看| 亚洲精品视频免费| 欧美伊人久久| 欧美激情bt| 国产亚洲欧美一区二区三区| 亚洲激情社区| 久久精品国产亚洲精品| 欧美日韩在线三区| 今天的高清视频免费播放成人| 一区二区三区免费观看| 久久久久亚洲综合| 国产精品一二三视频| 亚洲人成精品久久久久| 性视频1819p久久| 欧美日韩123| 1000部国产精品成人观看 | 欧美日韩精品一二三区| 黄色成人在线观看|