C#實現(xiàn)遠(yuǎn)程線程插入
能否使用C#實現(xiàn)遠(yuǎn)程線程插入嗎?
使用嚴(yán)格的C#,不借助任何其它技術(shù)。遠(yuǎn)程線程插入是不能在.NET平臺上實現(xiàn)的。然而在shellcode技術(shù)和遠(yuǎn)程線程插入之代碼插入的基礎(chǔ)上。完全可以實現(xiàn)基于.NET平臺的混合型遠(yuǎn)程線程插入。
最終效果是這樣的:用于將線程插入到其它進(jìn)程的可執(zhí)行程序是.NET程序(混合幾百字節(jié)的機(jī)器碼),用于被插入到其它進(jìn)程的DLL或EXE也是純.NET實現(xiàn)的。
可被插入的對象是所有有權(quán)限進(jìn)程WriteProcessMemory操作的本機(jī)進(jìn)程。
C#實現(xiàn)遠(yuǎn)程線程插入需要的技術(shù):.NET進(jìn)程寄宿遠(yuǎn)程線程插入之代碼插入
所謂的C#實現(xiàn)遠(yuǎn)程線程插入,其核心就是將一個.NET程序集寄宿到一個本機(jī)上的任意目標(biāo)進(jìn)程中并以線程方式運(yùn)行。CLR環(huán)境其根本就是一個COM服務(wù)器。我們寫的.NET程序集都是在這個COM服務(wù)器的支持下運(yùn)行的。如果想讓一個.NET程序集在任意的本機(jī)進(jìn)程中運(yùn)行。那么首先那個進(jìn)程需要具有.NET環(huán)境時環(huán)境。因為我們在遠(yuǎn)程線程插入時就需要用到。 NET環(huán)境時環(huán)境。沒有這個環(huán)境,我們的.NET程序集就沒有辦法被加載執(zhí)行。如果本機(jī)進(jìn)程是WIN32的,沒有.NET運(yùn)行時環(huán)境怎么辦呢?我們需要給它一個,代碼如下:
- DWORD __stdcall clrfunclocal(){
- ICLRRuntimeHost * pClrHost;
- CorBindToRuntimeEx
(NULL,NULL,0,CLSID_CLRRuntimeHost,IID_ICLRRuntimeHost,(PVOID*)&pClrHost);- pClrHost->Start();
- DWORD retVal=0;
- hr=pClrHost-> ExecuteInDefaultAppDomain
(s_asmpath),s_class,s_method,NULL,&retVal);- }
以上代碼的最后一句是用于在默認(rèn)程序域內(nèi)執(zhí)行一個.NET程序集。這段代碼是用C++寫的。
如果是自己寫了一個WIN32程序,因為某種原因需要加載一個.NET程序集并執(zhí)行它的功能。你就可以像以上那樣寫。但我們是做遠(yuǎn)程線程插入,那么如何在被插入的進(jìn)程中執(zhí)行上數(shù)代碼呢?高手已經(jīng)明白了。就是將這些代碼編譯成像SHELLCODE一樣的裸的可執(zhí)行代碼。然后使用遠(yuǎn)程線程插入的代碼插入就可以 CLR環(huán)境加載到其它進(jìn)程中并使其執(zhí)行我們想要的.NET程序集里的代碼。
如果你已經(jīng)有辦法將上述代碼編譯成裸的可執(zhí)行本機(jī)代碼了。你就可以將這些本機(jī)代碼作為資源加到你的C#項目中。備用。
在C#中執(zhí)行遠(yuǎn)程線程插入和在C++中是一樣的。
【編輯推薦】