聲明:本文分析檔案綁定器 (Binder) 技術原理,屬安全研究與逆向工程教學範疇。綁定器常被惡意軟體用於將木馬與正常程式捆綁分發,理解其機制有助於開發檢測與防禦方案。
綁定器產出單一可執行檔,內含:
執行時:Stub 讀取自身長度定位首個內嵌檔,遞歸解析長度+資料,寫入臨時檔並執行。
struct MODIFY_DATA {
unsigned int finder; // 魔數 0x12345678,用於定位自身結構位置
_off_t my_length; // Stub 自身檔案長度
} modify_data = {0x12345678, 0};
編譯後,Stub 在二進制中搜尋 finder,將實際長度回填 my_length。
finder,回填 modify_data (含實際長度)。fwrite(&file_size, sizeof(file_size), 1, out); // 寫入長度
fwrite(&sync_flag, sizeof(int), 1, out); // 同步/非同步執行旗標
fwrite(file_data, 1, file_size, out); // 寫入資料
fseek 跳過 Stub 長度 (modify_data.my_length) 到達首個內嵌檔。while (还有内嵌文件) {
fread(&prog_len, sizeof(prog_len), 1, in); // 讀取長度
fread(&sync_flag, sizeof(int), 1, in); // 讀取旗標
fread(buffer, 1, prog_len, in); // 讀取資料
fwrite(buffer, 1, prog_len, temp_file); // 寫入臨時檔
CreateProcess(temp_file, ..., sync_flag?FALSE:TRUE); // 執行
if (!sync_flag) WaitForSingleObject(...); // 同步等待
if (!sync_flag) DeleteFile(temp_file); // 同步模式執行後刪除
}
最後一個檔案:直接讀取剩餘所有資料至臨時檔並執行。
BOOL OnInitDialog() {
// ...
_stat(my_name, &ST);
if (ST.st_size > 184*1024) { // 原始 Stub 大小 184KB
Unbind(); // 超過原始大小 => 已綁定檔案,進入釋放流程
exit(0); // 直接退出,不顯示綁定器介面
}
// 否則顯示綁定器 GUI 供使用者選擇檔案綁定
}
| 風險點 | 說明 |
|---|---|
| 惡意軟體分發 | 將木馬/勒索軟體與合法安裝程式/文檔綁定,利用合法程式信任度誘導執行。 |
| 繞過簽名檢測 | Stub 代碼較小且可變形,內嵌惡意載荷加密/壓縮,靜態特徵難提取。 |
| 無檔案落地變體 | 進階版直接在記憶體中映射執行內嵌模組 (Reflective Loading),不寫入磁碟臨時檔。 |