首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

托管代碼進程注入與 CLR 宿主實戰:從非托管 DLL 啟動 CLR 執行 C# 組件

     編輯:關於.NET

進程注入將代碼注入既有進程位址空間並執行。本文基於 LoadLibrary + CreateRemoteThread 技術,示範如何將托管 DLL 注入目標進程:先注入非托管 C++ DLL 作為 CLR 宿主,由其啟動 CLR 載入並執行托管組件。

環境與架構

  • OS: Windows 7 x64 | .NET 4.0 | VS2010 SP1
  • 所有測試專案均為 32 位元

流程:注入器 → 非托管 ManageCodeInvoker.dll (CLR 宿主) → 啟動 CLR → 載入托管 Message.dll → 執行 Message.Show。

非托管 CLR 宿主實作 (C++)

建立 Win32 DLL 專案 ManageCodeInvoker,核心類別 MyClrHost 匯出 ExecuteManageCode 與 Test 兩個函式。

// LoadClr.h 片段
#pragma comment(lib, "mscoree.lib")
#import "mscorlib.tlb" raw_interfaces_only ...
namespace ManageCodeInvoker {
    class MyClrHost {
    public:
        static __declspec(dllexport) void ExecuteManageCode(PCWSTR pszVersion, PCWSTR pszAssemblyPath,
            PCWSTR pszClassName, PCWSTR pszMethodName, PCWSTR argument);
        static __declspec(dllexport) void Test();
    };
}

ExecuteManageCode 三步驟:

  1. 初始化 ICLRMetaHost → ICLRRuntimeInfo → ICLRRuntimeHost
  2. 呼叫 pClrRuntimeHost->Start() 啟動 CLR
  3. 以 ExecuteInDefaultAppDomain 執行托管靜態方法 (簽名: static int MethodName(string))

DllMain 中於 DLL_PROCESS_ATTACH 呼叫 Test(),測試載入本機 E:\Message.dll。

托管測試組件

namespace Message {
    public class Message {
        public static int Show(string message) {
            MessageBox.Show(message);
            return 100;
        }
    }
}

注入器實作

C# 主控台專案 Injector,透過 P/Invoke 呼叫 Windows API:

  1. OpenProcess 取得目標進程控制碼 (需 PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ)
  2. GetProcAddress 取得 kernel32.dll!LoadLibraryA 位址
  3. VirtualAllocEx 在目標進程配置記憶體寫入 DLL 路徑
  4. WriteProcessMemory 寫入路徑字串
  5. CreateRemoteThread 建立遠端執行緒執行 LoadLibraryA
  6. WaitForSingleObject 等待執行緒結束

目標進程 TargetForInject.exe 為空白無限迴圈程式。執行注入後,Process Explorer 可見 ManageCodeInvoker.dll 與 Message.dll 已成功載入目標進程,訊息盒彈出證明托管代碼執行成功。

完整 Demo 下載:InjectProcess.rar

作者:玄魂
出處:https://www.cnblogs.com/xuanhun/

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved