国产一级一区二区_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久久夜色精品国产_欧美色网一区二区
一区二区三区精品| 视频在线在亚洲| 日韩精品乱码免费| 日韩三级视频在线观看| 激情综合亚洲精品| 国产欧美日韩一区二区三区在线观看| 国产精品一区二区三区四区| 亚洲国产精品黑人久久久| 91色|porny| 老鸭窝一区二区久久精品| 国产精品麻豆视频| 欧美男同性恋视频网站| 黄一区二区三区| 亚洲人成小说网站色在线 | 一区二区三区日韩欧美精品| 欧美午夜在线观看| 狠狠色丁香久久婷婷综| 亚洲欧美一区二区久久| 欧美xxxx老人做受| 色婷婷一区二区三区四区| 久久国产夜色精品鲁鲁99| 国产精品不卡一区二区三区| 制服丝袜成人动漫| 91美女福利视频| 国产盗摄女厕一区二区三区| 午夜精品在线视频一区| 国产精品国产三级国产普通话99 | 国产真实乱对白精彩久久| 国产精品另类一区| 欧美不卡123| 在线免费观看日本一区| 国产精品99久久久久久久女警 | 亚洲一区二区三区免费视频| 久久久精品国产免大香伊| 欧美日韩高清影院| 欧美综合一区二区| 91论坛在线播放| 播五月开心婷婷综合| 国产乱码精品一区二区三区忘忧草| 亚洲成人自拍偷拍| 国产精品网曝门| 中文字幕成人在线观看| 国产亚洲综合av| 精品91自产拍在线观看一区| 欧美一区二区女人| 日韩欧美国产午夜精品| 日韩一区二区中文字幕| 91精品一区二区三区在线观看| 91老司机福利 在线| 色呦呦一区二区三区| aaa亚洲精品| av电影一区二区| www.欧美精品一二区| 99久久精品99国产精品| 91亚洲永久精品| 欧美亚洲精品一区| 欧美精品aⅴ在线视频| 欧美一区三区四区| 欧美一级夜夜爽| 日韩视频一区在线观看| 日韩西西人体444www| 日韩精品专区在线| 国产喂奶挤奶一区二区三区 | 久久久亚洲欧洲日产国码αv| 91精品国产品国语在线不卡| 欧美喷潮久久久xxxxx| 在线播放/欧美激情| 日韩欧美卡一卡二| 久久久综合精品| 综合久久久久久久| 一区二区在线看| 日韩国产精品久久久| 精品一区二区国语对白| 成人av网站在线观看免费| 色8久久人人97超碰香蕉987| 欧美一卡二卡在线观看| 久久久精品综合| 亚洲午夜在线观看视频在线| 天天综合色天天综合| 国产一区二区三区电影在线观看| 成人精品小蝌蚪| 91精品国产一区二区| 国产精品免费网站在线观看| 亚洲国产裸拍裸体视频在线观看乱了| 日本美女一区二区| 99国产精品久久久久| 欧美一级欧美三级在线观看| 国产精品国产精品国产专区不片| 亚洲成人激情社区| 懂色av一区二区三区蜜臀| 欧美午夜宅男影院| 国产欧美日本一区视频| 日本午夜一本久久久综合| 国产+成+人+亚洲欧洲自线| 欧美三区在线观看| 国产精品久久久久三级| 日日夜夜一区二区| 91视频在线看| 国产亚洲综合在线| 久久国产尿小便嘘嘘尿| 在线国产亚洲欧美| 国产欧美一区二区在线| 男女性色大片免费观看一区二区 | 亚洲一区视频在线| 国产成人精品亚洲午夜麻豆| 91精品国产综合久久久久久久| 日本一二三不卡| 麻豆成人av在线| 欧美伦理视频网站| 亚洲欧洲www| 国产乱妇无码大片在线观看| 91麻豆精品国产91久久久使用方法| 欧美韩国日本综合| 韩国欧美国产一区| 日韩女优制服丝袜电影| 亚洲电影你懂得| 欧美色窝79yyyycom| 亚洲欧洲成人av每日更新| 粉嫩aⅴ一区二区三区四区 | 色网站国产精品| 欧美国产禁国产网站cc| 极品瑜伽女神91| 日韩一级二级三级精品视频| 午夜激情久久久| 欧美日韩一区不卡| 亚洲成人第一页| 欧美日韩卡一卡二| 亚洲成人福利片| 69精品人人人人| 日本不卡一区二区| 7777精品伊人久久久大香线蕉的| 亚洲高清中文字幕| 欧美精品一二三区| 卡一卡二国产精品| 久久精品网站免费观看| 成人国产精品视频| 亚洲欧美另类图片小说| 欧美色视频一区| 日韩精品一级中文字幕精品视频免费观看 | 免费观看久久久4p| 欧美成人vps| 狠狠色狠狠色综合系列| 久久久国产精品麻豆| 国产成都精品91一区二区三| 国产女同性恋一区二区| 99久久99久久精品免费观看| 依依成人综合视频| 日韩三级电影网址| 国产成人精品亚洲777人妖| 亚洲欧美怡红院| 91精品国产综合久久小美女| 精品在线观看视频| 中文字幕在线一区| 日本道免费精品一区二区三区| 亚洲成人动漫精品| 国产午夜精品一区二区三区四区| 91视频国产资源| 老司机精品视频在线| 国产精品黄色在线观看| 欧美一区二区三区在线电影| 国产电影一区在线| 日韩精品一级中文字幕精品视频免费观看 | 欧美成人猛片aaaaaaa| 国产不卡视频在线播放| 亚洲永久精品国产| 久久亚洲二区三区| 欧美性欧美巨大黑白大战| 久久99精品国产麻豆婷婷洗澡| 中文字幕综合网| 日韩精品一区二区在线观看| 91视频精品在这里| 国产成人av福利| 日本美女一区二区| 亚洲人成网站色在线观看| 欧美电影免费观看高清完整版在线 | 亚洲欧美成人一区二区三区| 欧美一区二区三区在| 91麻豆蜜桃一区二区三区| 国产一级精品在线| 午夜成人免费视频| 日韩伦理免费电影| 2017欧美狠狠色| 欧美精品久久天天躁| 97se亚洲国产综合自在线观| 激情文学综合网| 日韩精品成人一区二区三区| 国产精品成人一区二区三区夜夜夜| 日韩三级av在线播放| 欧美日韩黄视频| 色爱区综合激月婷婷| 成人h动漫精品一区二区| 国产一区二区三区电影在线观看| 天堂av在线一区| 亚洲综合在线五月| 亚洲欧洲另类国产综合| 中文字幕电影一区| 国产精品久久久久影视| 日本一区二区免费在线观看视频| 亚洲精品在线观看网站| 欧美精品一区二区在线观看|