Skip to content

docs: OPC zip 手術論述 — .xlsm 巨集注入、vbaProject.bin 工作流與 byte 級保真驗證 #136

Description

@kiki830621

Problem

Original text:
「這值得放到macdoc」
— Source: 使用者(2026-07-17,聽完 .xlsm zip 注入原理解說後)

#135 經驗清單第 2 條(「.xlsm 巨集注入(零 GUI)」)只有摘要;完整的原理與驗證方法論散在對話裡,應沉澱成 macdoc docs 設計論述(同 docs/applescript-swift-parity.md 體例),並成為 che-excel-mcp inject_vba / build_xlsx 工具的設計依據。

Type

docs

要沉澱的內容(草稿大綱)

1. OPC 結構觀:.xlsx/.xlsm 是 zip,巨集只是一個成員

xlsx(zip)                          xlsm(zip)
├── [Content_Types].xml   ──改──►  workbook 型別改 macroEnabled + 宣告 bin Default
├── xl/_rels/workbook.xml.rels ─►  加一條指向 vbaProject.bin 的 relationship
├── xl/…(其他全部不動)
                          ──加──►  xl/vbaProject.bin(巨集本體)

xlsm − xlsx = 恰好三處:兩個 XML 宣告 + 一個二進位成員。注入器 = 逐 zip 成員 byte 複製 + 這三處手術。

2. vbaProject.bin 的來源工作流(不可無中生有)

  • bin 是專有編譯容器(OLE + compressed source + p-code),無可靠開源生成器
  • 工作流:.bas(source of truth,pure ASCII per applescript-swift-parity 的編碼教訓)→ 真 Excel 匯入空白活頁簿 → 存 xlsm → 抽 xl/vbaProject.bin → 進 repo assets
  • VBA 邏輯變更 = 重走一次抽取;bin 是 build artifact,bas 是 source

3. Byte 級保真驗證模式(注入器的測試契約)

  • 條目集合 = 原集合 + {xl/vbaProject.bin}(不多不少)
  • 除兩個預期 XML 外,每個成員與來源 byte-identical
  • 兩個被改的 XML:把預期改動還原後必須與原文完全相等(多改一個字元測試就掛)
  • 注入的 bin 與 asset 逐 byte 相同

這種保證 Excel 自己的「另存」給不了(它重寫整個檔案結構)——是 zip 手術路線獨有的紅利。

4. 邊界聲明

  • 不是繞過安全機制:產物是結構標準的 .xlsm,Excel 開檔照常跑巨集安全檢查
  • 手術繞開的是 Excel GUI 存檔流程的坑(File Provider 路徑 -50、sandbox 授權 dialog、老式 form control 序列化失敗)

Expected

docs/opc-zip-surgery.md(暫名)進 macdoc docs;#135inject_vba 工具設計引用它。

Impact

  • che-excel-mcp 離線層(build_xlsx / inject_vba / normalize_xlsx)的設計依據
  • OPC 的封裝觀念可作為 docm/pptm 的研究起點;各格式的 main part、content type、relationship、host binding 與 fixture 必須另案規格化及驗證,不得直接平移 xlsm 契約

Refs #135

Priority

P2


Current Status

Phase: verified
Last updated: 2026-08-13 by idd-verify

Delivered

Scope refinement

Blocking

  • (none)

Commits

  • 33cca15 — initial contract
  • ca89009 — logic/security boundaries
  • a8901e7 — verification gaps
  • 9b22acc / 11e6ab0 — descriptor semantics
  • 554b8a8 — private staging trust boundary

Verify

Platform capability status

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentationplatform:cross含不依賴作業系統的格式、規格或實作範圍;不等於所有 runtime 已驗證platform:macos含 macOS 專屬行為、實作或已驗證範圍

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions