首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

BCB 殼程式開發:將目標程式內嵌為資源並實現啟動驗證與圖示提取

     編輯:VC 教學

前言

「殼程式」模式:主程式(Shell)僅負責驗證授權、解密載入、提取圖示等輔助邏輯,真正業務邏輯封裝於內嵌的目標執行檔中。本文詳細說明如何在 C++Builder 中實現此架構:資源內嵌、圖示提取同步、授權驗證、記憶體載入執行(或釋放磁碟執行),並附帶簡易感染式複製代碼分析(僅供防禦研究)。

整體架構流程

+------------------+     +----------------------+     +-------------------+
| Shell.exe (殼)   | --> | 驗證授權/解密/提取圖示 | --> | Target.exe (內嵌) |
+------------------+     +----------------------+     +-------------------+
      │                           │                          │
      │                    修改自身圖示                  釋放至記憶體/磁碟
      │                           │                          │
      ▼                           ▼                          ▼
啟動 → 檢查授權 → 解密資源 → 建立進程 (CreateProcess / 記憶體載入)

關鍵技術模組實作

1. 目標程式作為資源內嵌

  • 資源類型:RT_RCDATA 或自訂 "EXEFILE"
  • 資源 ID:如 IDR_TARGET_EXE 101
  • 工具:BRCC32 編譯 .rc,或 Resource Hacker 直接加入編譯後的 .exe

2. 運行時提取並同步圖示


// 從資源讀取目標 EXE 並提取圖示
HRSRC hRes = FindResource(hInst, MAKEINTRESOURCE(IDR_TARGET_EXE), RT_RCDATA);
HGLOBAL hGlob = LoadResource(hInst, hRes);
LPVOID pExeData = LockResource(hGlob);
DWORD exeSize = SizeofResource(hInst, hRes);

// 解析目標 EXE 的 PE 結構,提取圖示資源目錄
// 簡化:使用 ExtractIconEx 或 LoadLibraryEx(LOAD_LIBRARY_AS_DATAFILE)
// 實際需手動解析 .rsrc 區段找到 RT_GROUP_ICON + RT_ICON

// 將提取的圖示設為 Shell 視窗圖示
HICON hIcon = ExtractIcon(hInst, "target.exe", 0); // 若已釋放磁碟
SendMessage(ShellWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
SendMessage(ShellWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);

3. 授權驗證邏輯(示例)


bool VerifyLicense()
{
    // 1. 讀取註冊表/檔案/網路驗證
    // 2. 硬體指紋綁定 (CPU ID, MAC, 磁碟序號)
    // 3. 時間限制 (試用期)
    // 4. 簽名驗證 (RSA/ECDSA 驗證 License 檔)

    // 簡易範例:檢查註冊表
    HKEY hKey;
    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\MyApp", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
    {
        char key[256]; DWORD size = 256;
        if (RegQueryValueEx(hKey, "LicenseKey", 0, NULL, (LPBYTE)key, &size) == ERROR_SUCCESS)
        {
            RegCloseKey(hKey);
            return ValidateKey(key); // 實作簽名驗證
        }
        RegCloseKey(hKey);
    }
    return false;
}

4. 記憶體載入執行 vs 釋放磁碟執行

方式優點缺點適用場景
釋放磁碟 + CreateProcess簡單、相容性好、支援所有 EXE留下檔案、易被複製、防毒誤報快速原型、安裝程式
記憶體載入 (Manual Mapping)無檔案落地、隱蔽、可註入現有進程極複雜:需手動解析 PE、重定位、IAT、TLS、例外表、載入 DLL高隱蔽需求、殼開發
Process Hollowing (RunPE)掛載到合法進程、繞過部分監控行為極度可疑、現代 EDR 重點偵測惡意軟體(不建議合法使用)

簡易釋放磁碟執行代碼


void RunEmbeddedExe()
{
    // 1. 讀取資源
    HRSRC hRes = FindResource(hInst, MAKEINTRESOURCE(IDR_TARGET_EXE), RT_RCDATA);
    DWORD size = SizeofResource(hInst, hRes);
    HGLOBAL hGlob = LoadResource(hInst, hRes);
    LPVOID pData = LockResource(hGlob);

    // 2. 寫入暫存檔
    char tempPath[MAX_PATH];
    GetTempPath(MAX_PATH, tempPath);
    strcat(tempPath, "target_XXXXXX.exe"); // 需用 GetTempFileName 產生唯一名
    HANDLE hFile = CreateFile(tempPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
    DWORD written;
    WriteFile(hFile, pData, size, &written, NULL);
    CloseHandle(hFile);

    // 3. 執行並等待
    STARTUPINFO si = {sizeof(si)};
    PROCESS_INFORMATION pi;
    if (CreateProcess(tempPath, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
    {
        WaitForSingleObject(pi.hProcess, INFINITE);
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
    }

    // 4. 清理
    DeleteFile(tempPath);
}

感染式複製代碼分析(僅供防禦理解)

原文附帶的 inFect 函式展示典型「前綴型病毒」邏輯:

  1. 掃描目標檔案(FindFirstFile/FindNextFile)。
  2. 檢查是否已感染(檔案頭偏移 80 處標誌 "AntGhazi")。
  3. 讀取原檔完整內容至記憶體。
  4. 將病毒體寫入檔案頭,原檔內容追加在後(修正 Entry Point 指向病毒碼)。
  5. 修復時間戳、屬性、圖示(ModifyIcon),偽裝成原檔。

防禦對策:

  • 數位簽名驗證:任何修改都會導致簽名失效。
  • 完整性監控:關鍵系統檔雜值比對 (Tripwire、Windows Resource Protection)。
  • 行為偵測:檔案自我修改、寫入可執行檔、修改 Entry Point。
  • 記憶體掃描:檢查進程映像與磁碟檔案不一致。

殼開發最佳實踐清單

  1. 殼程式使用純 Win32 API / 最小化 CRT,體積 < 50KB。
  2. 內嵌資源加密(AES/XOR/自訂),運行時解密,防靜態提取。
  3. 關鍵字串加密、API 動態解析 (GetProcAddress),阻礙靜態分析。
  4. 反除錯:IsDebuggerPresent、CheckRemoteDebuggerPresent、時序檢查、硬體斷點檢測。
  5. 反虛擬機:CPUID、MAC 地址、磁碟廠商、註冊表特徵。
  6. 授權邏輯分離:核心驗證放在獨立 DLL 或伺服器端,殼僅做閘道。
  7. 簽名部署:取得 EV 代碼簽章,建立信任鏈,減少誤報。

法律與道德邊界

殼技術本身中性,但:

  • ✅ 合法:商業軟體授權保護、DRM、安全啟動器、模組化架構。
  • ❌ 非法:繞過授權、隱藏惡意碼、逃避防毒掃描、未經授權修改他人軟體。

開發者應確保殼程式行為透明、用戶知情同意、符合數位簽名與軟體分發規範。

理解殼架構與 PE 內嵌技術,不僅能實現軟體保護,更能深入掌握 Windows 載入器機制,為安全研究與系統開發奠定堅實基礎。

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