C#實現遠程線程插入
能否使用C#實現遠程線程插入嗎?
使用嚴格的C#,不借助任何其它技術。遠程線程插入是不能在.NET平臺上實現的。然而在shellcode技術和遠程線程插入之代碼插入的基礎上。完全可以實現基于.NET平臺的混合型遠程線程插入。
最終效果是這樣的:用于將線程插入到其它進程的可執行程序是.NET程序(混合幾百字節的機器碼),用于被插入到其它進程的DLL或EXE也是純.NET實現的。
可被插入的對象是所有有權限進程WriteProcessMemory操作的本機進程。
C#實現遠程線程插入需要的技術:.NET進程寄宿遠程線程插入之代碼插入
所謂的C#實現遠程線程插入,其核心就是將一個.NET程序集寄宿到一個本機上的任意目標進程中并以線程方式運行。CLR環境其根本就是一個COM服務器。我們寫的.NET程序集都是在這個COM服務器的支持下運行的。如果想讓一個.NET程序集在任意的本機進程中運行。那么首先那個進程需要具有.NET環境時環境。因為我們在遠程線程插入時就需要用到。 NET環境時環境。沒有這個環境,我們的.NET程序集就沒有辦法被加載執行。如果本機進程是WIN32的,沒有.NET運行時環境怎么辦呢?我們需要給它一個,代碼如下:
- 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);- }
以上代碼的最后一句是用于在默認程序域內執行一個.NET程序集。這段代碼是用C++寫的。
如果是自己寫了一個WIN32程序,因為某種原因需要加載一個.NET程序集并執行它的功能。你就可以像以上那樣寫。但我們是做遠程線程插入,那么如何在被插入的進程中執行上數代碼呢?高手已經明白了。就是將這些代碼編譯成像SHELLCODE一樣的裸的可執行代碼。然后使用遠程線程插入的代碼插入就可以 CLR環境加載到其它進程中并使其執行我們想要的.NET程序集里的代碼。
如果你已經有辦法將上述代碼編譯成裸的可執行本機代碼了。你就可以將這些本機代碼作為資源加到你的C#項目中。備用。
在C#中執行遠程線程插入和在C++中是一樣的。
【編輯推薦】