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

EXE 檔案內嵌 SWF 檔案的提取與轉換技術實作

     編輯:關於C++

某些 Flash 播放器封裝工具將 SWF 檔案附加於 EXE 載入器之後。本文提供一段 C++Builder 程式碼,示範如何從這類複合 EXE 中定位並提取內嵌的 SWF 檔案。

核心邏輯

  1. 完整讀取 EXE 檔案至記憶體緩衝區。
  2. 掃描緩衝區尋找 SWF 檔頭特徵碼 FWS(或 CWS 表示壓縮),前方允許兩個零位元填充(00 00 FWS)。
  3. 根據偏移量切割出 SWF 資料,寫入新檔(副檔名 .swf)。
  4. 針對常見版本(偏移量 376831、286719、811008)做簡易驗證,非預期偏移提示使用者是否強制輸出。

關鍵程式碼片段

AnsiString exe2swf(AnsiString FileName) {
    int h = FileOpen(FileName.c_str(), fmOpenRead);
    unsigned long len = FileSeek(h, 0, 2);
    FileSeek(h, 0, 0);
    unsigned char *buf = new unsigned char[len + 1];
    FileRead(h, buf, len);
    FileClose(h);

    // 掃描 FWS 特徵碼
    int offset = -1;
    for (int i = 0; i < len - 2; i++) {
        if (buf[i] == 0 && buf[i+1] == 0 && buf[i+2] == 'F' && buf[i+3] == 'W' && buf[i+4] == 'S') {
            offset = i + 2; // 指向 F
            break;
        }
    }
    if (offset < 0) return "";

    AnsiString outName = FileName.SubString(1, FileName.Length()-4) + ".SWF";
    int outH = FileCreate(outName.c_str());
    FileWrite(outH, buf + offset, len - offset);
    FileClose(outH);
    delete[] buf;
    return outName;
}

注意:此法僅適用於「載入器 + 完整 SWF」的簡單拼接格式。現代封裝工具多採用加密、壓縮、虛擬化保護,單純特徵碼掃描已難以通用。開發通用提取器需結合 PE 區段分析、記憶體傾印等進階技術。

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