某些 Flash 播放器封裝工具將 SWF 檔案附加於 EXE 載入器之後。本文提供一段 C++Builder 程式碼,示範如何從這類複合 EXE 中定位並提取內嵌的 SWF 檔案。
FWS(或 CWS 表示壓縮),前方允許兩個零位元填充(00 00 FWS)。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 區段分析、記憶體傾印等進階技術。