mcpField
U
unbox-anything

unbox-anything

github.com/fudesign2008開発683 回インストール1 日前に更新
リポジトリ

unbox-anything について

エージェントによる分析向けの汎用展開スキルです。インストーラー、文書、アプリパッケージなどをディレクトリに展開し、作業内容を記録したマニフェストを作成します。安全確認や形式判定、入れ子コンテナの再帰処理を行い、展開物は実行しません。

主な機能

  1. 01実際のファイル形式を判定
  2. 02形式に応じて展開ツールを選択
  3. 03暗号化を確認して安全に展開
  4. 04入れ子コンテナを再帰処理
  5. 05監査可能なREADMEマニフェストを作成
  6. 06ファイルを実行せずに展開

活用シーン

  1. 01インストーラー内のファイルを調査
  2. 02アプリや文書パッケージを分析
  3. 03クラッシュ調査用のファイルを抽出
  4. 04ビルド成果物と入れ子パッケージを確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/fudesign2008/open-skills --skill unbox-anything

インストール後、Claude Code で/unbox-anythingを入力して読み込まれたか確認します。

同梱ファイルreference.md

詳細

unbox-anything

「箱のような」ファイルをあらゆる形式で展開します。単一のファイルに見えて、実際には複数のファイルが入ったコンテナであるファイル(.exe インストーラー、.docx ドキュメント、.apk アプリ、.asar Electron バンドルなど)が対象です。このようなファイルを渡すと、コンテナを開いて整理されたディレクトリに展開し、見つかった内容を記述したマニフェストを作成します。

人間向けの GUI ワークフローではなく、エージェント主導の分析(クラッシュ調査、リバースエンジニアリング、コンテンツ抽出、ビルドの検査)を目的としています。出力は決定論的かつ構造化されているため、後続のステップで読み取ることができます。

厳守事項(毎回、最初に読むこと)

これらのルールは、未知のファイルを展開する際の危険を避けるために設けられています。今日展開した .exe がマルウェアかもしれません。Finder に自動マウントされた .dmg がプレビュー処理を起動することもあります。以下のルールは、エージェントとユーザーのマシンを安全に保ちます。

  1. 展開のみ。実行はしない。 展開したディレクトリ内のファイルを実行したり、source、open したり、ダブルクリックしたりしないでください。バイナリ(.exe、.dll、.so、.dylib、.app、スクリプト)は、調査用のバイト列として展開し、起動することはありません。後続のタスクで実行する必要がある場合は、別途、人間の承認を得てから行います。
  2. ディスクイメージは読み取り専用で、静かにマウントする。 macOS で .dmg/.iso を扱う場合は、Finder が自動的に開いてプレビュー処理を起動しないよう、必ず hdiutil に -nobrowse -readonly を渡してください。ファイルをコピーしたら、すぐにアンマウントします。
  3. 展開前に暗号化を検出する。 まず 7z l -slt <file> を実行します。出力に Encrypted = + と表示された場合は停止して報告し、パスワードの入力待ちで 7z をハングさせないでください。ユーザーにパスワードを明示的に尋ねるか、スキップします。
  4. 必ず新しいディレクトリに展開する。 <outname>-unboxed/(接尾辞を付け、上書きしない)に出力します。. や、既にファイルがあるディレクトリには絶対に展開しないでください。7z/unar は警告なしに既存のファイルを上書きします。
  5. 実行ごとに、信頼できるソースは1つだけ。 同じソースに対して異なる2つのツールを同時にパイプ処理しないでください。1回の展開を完了して検証してから、再帰的に展開します。

前提条件

主要ツール:7z は約80%の形式(zip、7z、tar、gz、bz2、xz、zst、cab、iso、rpm、deb、nsis、msi、ar、cpio、chm など)に対応しています。一度インストールすれば、ほとんどの形式をそのまま扱えます。

プラットフォームインストールコマンド
macOSbrew install p7zip
Linux (Debian/Ubuntu)sudo apt install p7zip-full
Linux (Fedora/RHEL)sudo dnf install p7zip p7zip-plugins
Windowswinget install 7zip.7zip (または choco install 7zip)

補助ツール(形式に必要な場合のみ使用し、必要に応じてインストールします):

  • unar — .rar 用(RAR5 を含む完全な読み取りに対応)。
  • innoextract — Inno Setup の .exe インストーラー用(この形式では 7z よりきれいに展開できます)。
  • hdiutil — .dmg 用に macOS にプリインストールされています。
  • xar + cpio — macOS の .pkg 用(連鎖ステップ)。
  • npx @electron/asar — .asar Electron バンドル用(連鎖ステップ。Node.js が必要)。

プラットフォームごとのインストールコマンドとバージョンに関する注記は、reference.md に記載されています。

ワークフロー(すべてのファイルに共通する1つのパイプライン)

次の6つのステップを順番に実行します。ステップ1~4が標準の手順です。ステップ5は再帰処理のためのフックで、形式ごとの個別対応をせずに連鎖形式(exe→asar、pkg→xar→cpio)を扱えるようにします。ステップ6では、後続の分析で出力を監査できるようにするマニフェストを作成します。

ステップ1 — 実際の形式を検出する

ファイル拡張子は当てになりません。.exe は NSIS、Inno Setup、MSI ラップ形式、または自己解凍 zip の可能性があります。ツールを選ぶ前に、必ずファイルのマジックバイトで確認してください。

file "<input>"
# Also useful when `file` is unsure:
7z l "<input>"        # lists contents if 7z recognizes the format

file と 7z の結果が一致しない場合は、7z l を信頼してください(より多くのコンテナ形式を認識できます)。どちらも判断できない場合は、reference.md のマジックナンバー表を確認し、先頭のバイトを手動で照合してください。

ステップ2 — カテゴリに分類する

検出された形式を、以下の分類表で確認します。すべての形式は、5つのカテゴリ A~E のいずれか1つに分類されます。カテゴリに応じて実行するワークフローが決まるため、ステップ5までは個々の形式について考える必要はありません。

ステップ 3 — 適切なツールが利用可能であることを確認する(暗号化もチェックする)

command -v を使って、カテゴリーで必須とされているツールを確認します。見つからない場合は、前提条件の表にあるインストールコマンドを表示して、停止してください。カテゴリーのワークフローにフォールバックの順序が明記されている場合を除き、別のツールに黙って切り替えてはいけません(別のツールを使うと、出力に一貫性がなくなり、後続の分析に支障をきたす可能性があります)。

ここで、暗号化の事前チェック(Iron Rule 3)も実行してください。これにより、7z x がパスワード入力プロンプトで待ち続けるのを防ぎます。

7z l -slt "<input>" | grep -i "^Encrypted"
# "Encrypted = -"  → safe, proceed to Step 4
# "Encrypted = +"  → STOP. Report to the user; do not run `7z x`.

暗号化されたアーカイブが抽出時に処理を永久にブロックしないよう、ワークフローに沿って順番に作業するエージェントが抽出前に必ずこのチェックを実行できるようにするため、これは Iron Rules だけでなくステップ 3 にも記載されています。

カテゴリー A/B のみのフォールバック順序(標準的なアーカイブ+zip コンテナー):7z が見つからない場合は、bsdtar(macOS では tar としてプリインストール済み)→ unzip を試し、それでも見つからなければ停止して確認を求めます。それ以外のカテゴリーでは、記載されたツールが必須です。

ステップ 4 — 抽出する

新しい <outname>-unboxed/ ディレクトリに抽出します。<outname> は入力ファイルの拡張子を含む完全な名前で、すべての . を -(ハイフン)に置き換えたものです。拡張子を残す(-docx、-exe など)ことで、どの種類のコンテナーを展開したかが記録されます。また、ドットをハイフンに置き換えることで、ディレクトリ名に紛らわしい拡張子区切りが含まれなくなります。

入力ファイル<outname>出力ディレクトリ
report.docxreport-docxreport-docx-unboxed/
App-1.2.3-x64.exeApp-1-2-3-x64-exeApp-1-2-3-x64-exe-unboxed/

. や、すでに内容があるディレクトリには絶対に抽出しないでください。正確なコマンドは、以下の各カテゴリーのワークフローに記載されています。エージェントがプロンプトで停止しないよう、必ず -y(「はい」と回答)を指定し、スペースや CJK 文字が含まれる可能性のあるパスは引用符で囲んでください。

ステップ 5 — 入れ子になったコンテナーをスキャンして再帰処理する

これにより、unbox-anything は「箱の中の箱」を処理できます。抽出のたびに(カテゴリー A~D)、出力ディレクトリをスキャンし、ファイル名またはマジックバイトが既知の入れ子コンテナー(.asar、.zip、.7z、.tar、.jar、.apk、.ipa、.whl、.egg、.deb、.rpm、.cab、.msi、.pkg、.dmg、.iso、NSIS/Inno .exe)に一致するファイルを探します。

見つかった場合は再帰処理します。つまり、その内部ファイルに対してワークフローを再度実行し、隣にある <innername>-unboxed/ に抽出します。停止条件(以下の 3 つをすべて適用します):

  • 深さ制限:3。 3 階層を超えて再帰処理しないでください。深く入れ子になったパッケージは、悪意のあるものかパッケージングミスである可能性が非常に高いため、人間が確認する必要があります。
  • 循環ガード。 すでに抽出した絶対パスのセットを保持し、同じファイルを二度と抽出しないでください(自分自身を指すシンボリックリンクを含む zip への対策です)。
  • 既知の形式のみ。 上記のリストにある、マジックナンバーで確認済みの形式のみ再帰処理してください。「念のため」に任意のバイナリを再帰処理してはいけません。

再帰処理によって、Electron インストーラーをソースコードに展開できます。setup.exe(カテゴリー D、NSIS)→ $\PLUGINSDIR/app-64.7z(カテゴリー A)→ app/resources/app.asar(ステップ 5 で検出)→ app-src/(asar を抽出)。特別扱いは不要で、1 つのパイプラインで処理できます。

ステップ 6 — マニフェストを作成する

トップレベルの抽出とすべての再帰処理が完了したら、<outname>-unboxed/README.md を作成し、以下を記録します。

  • ソースファイル:名前、サイズ、検出された種類(file の出力)、SHA-256。
  • 抽出チェーン:実行したすべてのツールと、各ツールが出力したディレクトリのツリー。これにより、読み手が手動でチェーンを再現できます。
  • ツールのバージョン:実際に使用した 7z/unar/npx @electron/asar のバージョン。
  • ファイルツリー:最終的な出力の tree 形式の一覧(ログが膨大にならないよう、深さは 3 階層まで)。
  • 異常事項:スキップした暗号化エントリー、権限エラー、破損したファイル、その他の不審な点。

マニフェストがあることで、後続のエージェント分析で出力の信頼性を確保できます。これがなければ、抽出結果は単なる「信じてください。ファイルはこちらです」にすぎません。

分類表

コンパクトなルーターです。該当する形式を見つけて、カテゴリのワークフローを実行してください。形式ごとの詳細(正確なコマンド、マジックナンバー、例外ケース)については、reference.md を参照してください。

形式カテゴリ主なツール
.zip .7z .tar .tar.gz/.tgz .tar.bz2 .tar.xz .gz .bz2 .xz .zst .lz4A. 標準アーカイブ7z(rar→unar)
.rarAunar(7z は RAR5 の読み取り専用です)
.docx .xlsx .pptx .jar .war .ear .apk .aab .ipa .whl .eggB. ZIP コンテナー7z(いずれも内部的には ZIP です)
.deb .rpm .msi .cabC. システムパッケージ7z(アーカイブとして扱います)
.isoD(ディスクイメージ)7z / bsdtar
.exe(NSIS インストーラー)D. インストーラー/イメージ7z
.exe(Inno Setup)Dinnoextract
.dmgDmacOS:hdiutil、その他:7z(性能は限定的)
.pkg(macOS)E. チェーンxar の後に cpio
.asar(Electron)E(通常、再帰処理で見つかります)npx @electron/asar
.old .doc .xls .ppt(旧式の Office)—対象外です。 これらは ZIP ではなく、バイナリの OLE 形式です。コンバーター(LibreOffice/antiword)を案内し、対応しているかのように扱わないでください。

ここに記載されていない形式(.snap、.AppImage、UPX などで暗号化/パックされたマルウェア)は明示的に対象外です。下記の 対象外 を参照してください。

カテゴリ別ワークフロー

A. 標準アーカイブ(zip、7z、tar*、gz、rar など)
7z x "<input>" -o"<outname>-unboxed" -y
# For .rar without unar installed, install it first:
#   brew install unar  /  sudo apt install unar
unar "<input>" -o "<outname>-unboxed"

bsdtar(macOS のデフォルトの tar)は、7z が利用できない場合に Mac 上で tar/zip/zst を扱える、依存関係不要の代替ツールです:bsdtar -xf "<input>" -C "<outname>-unboxed"。

B. ZIP コンテナー(docx、xlsx、apk、jar、whl など)

A と同じコマンドを使用します。いずれも ZIP 形式です。展開後、マニフェストに、後続の読み取りに利用できる構造化コンテンツがあることを記載してください。OOXML では word/document.xml、xl/sharedStrings.xml などが、.apk/.jar では AndroidManifest.xml/META-INF/MANIFEST.MF が、.whl では METADATA とパッケージのソースコードが確認できます。

7z x "<input>" -o"<outname>-unboxed" -y
C. システムパッケージ(deb、rpm、msi、cab)

7z は4種類すべてをアーカイブとして扱い、ペイロードを展開します。Linux で .deb を扱う場合は dpkg-deb -x がネイティブツールです。.rpmの場合はrpm2cpio | cpio -idmvを使用します。対応するプラットフォームではネイティブツールを優先し、それ以外では7z` を使用してください。

7z x "<input>" -o"<outname>-unboxed" -y
D. インストーラー/ディスクイメージ(NSIS の exe、Inno の exe、dmg、iso)

ヘッダーが形式ごとに異なるため、形式に応じた処理が必要です。

NSIS インストーラー(最も一般的な .exe インストーラーです。file の出力に「Nullsoft Installation」と表示されることで検出できます):

7z x "<input>" -o"<outname>-unboxed" -y
# The payload is usually in $PLUGINSDIR/app-*.7z — recurse on it in step 5.

Inno Setup インストーラー(file の出力に「Inno Setup」と表示されるか、マジックバイトで検出できます):

innoextract -d "<outname>-unboxed" "<input>"

macOS 上の .dmg(常に -nobrowse -readonly を指定し、マウント、コピー、アンマウントの順に実行します):

hdiutil attach "<input>" -nobrowse -readonly -mountpoint /tmp/unbox-dmg-$$
cp -R /tmp/unbox-dmg-$$/* "<outname>-unboxed"/ 2>/dev/null
hdiutil detach /tmp/unbox-dmg-$$

Linux/Windows では、7z で多くの DMG を読み取れますが、すべてではありません(UDZO と UDIF の違い)。7z x を試し、失敗した場合は、このファイルの DMG 展開はそのプラットフォームでは確実でないことをユーザーに伝えてください。

.iso:7z x "<input>" -o"<outname>-unboxed" -y(または macOS では bsdtar -xf)。

E. チェーン/入れ子(.pkg、.asar、およびステップ 5 で見つかったもの)

サブタイプは2つあります。

.pkg(macOS インストーラー) — Payload ファイルを含む xar アーカイブです(Payload は cpio アーカイブで、gzip 圧縮されている場合もあります):

7z x "<input>" -o"<outname>-unboxed" -y          # or: xar -xf "<input>" -C "<outname>-unboxed"
cd "<outname>-unboxed"
# Payload naming + compression both vary across pkgs — do not hardcode.
# 7z sometimes renames it "Payload~"; some pkgs gzip it, some ship raw cpio.
PAYLOAD=$(find . -maxdepth 1 -iname "Payload*" -type f | head -1)
case "$(file "$PAYLOAD")" in
  *gzip*) gunzip -c "$PAYLOAD" | cpio -idmv ;;   # common case: gzipped cpio
  *cpio*) cpio -idmv < "$PAYLOAD" ;;             # some pkgs ship raw cpio
  *) echo "Unrecognized Payload format: $PAYLOAD" ;;
esac

.asar(Electron バンドル) — ほとんどの場合、Electron インストーラー(NSIS exe → app-*.7z → app.asar)からの再帰処理で見つかります:

npx @electron/asar extract "<input>" "<outname>-unboxed"

ステップ 5 で見つかったその他の入れ子コンテナーについては、そのコンテナーに対してワークフロー全体(ステップ 1~6)を再実行してください。

対象外

以下は意図的に対応していません。ユーザーから依頼された場合は、できるふりをせず、理由を説明して代替案を提案してください。

  • .AppImage — 実行中の場所で動作する自己展開型 ELF です。安全に展開するには、バイナリを実行する --appimage-extract が必要となり、これは鉄則 1 に違反します。代わりにサンドボックスで実行することを提案してください。
  • .snap — squashfs イメージです。ほとんどインストールされていない unsquashfs が必要です。v1 では対象外です。
  • パック済み/暗号化されたマルウェア(UPX、Themida、ユーザーがロック解除しないパスワード保護アーカイブ)— これらは一般的なアンパッカーではなく、セキュリティ調査用ツールの対象です。
  • レガシー形式のバイナリ Office ファイル(.doc/.xls/.ppt)— OLE 複合ドキュメントであり、ZIP ではありません。変換には LibreOffice または antiword を使用してください。7z で処理できるかのように説明してはいけません。
  • Office ドキュメントの作成/編集 — そのためのツールが anthropics/skills@docx などです。unbox-anything は 抽出のみ を行います。

注意点(見落としやすいもの)

これらは、気づかないうちに問題を引き起こす落とし穴です。一度目を通しておけば、二度と引っかかりません。

  • $PLUGINSDIR のシェル展開。 NSIS インストーラーは、文字どおり $PLUGINSDIR という名前のディレクトリに展開します。bash では $PLUGINSDIR は変数展開されるため、引用符で囲むか $ をエスケープしてください:'\$PLUGINSDIR' または "\$PLUGINSDIR"。文字どおりの $ を含むパスも同様です。
  • 暗号化アーカイブで 7z が停止します。 7z x の前に必ず 7z l -slt "<input>" を実行し、Encrypted = + を grep で検索してください。暗号化されている場合は 7z x を実行しないでください。入力されることのないパスワードを待って停止します。
  • .dmg は Finder で自動的に開きます。 -nobrowse を指定しないと、macOS が DMG をマウントし、Finder がアイコンを表示したり、プレビュー処理を実行したり、Quick Look を再度起動したりすることがあります。必ず -nobrowse -readonly を指定し、必ず取り外してください。
  • ターミナルでの Unicode ファイル名。 7z と unar は正しく展開しますが、UTF-8 以外のターミナルでは文字化けして表示されます。一覧が文字化けしている場合は、一覧表示の前に LANG=en_US.UTF-8(またはユーザーのロケール)を設定してください。
  • .exe の種類の判定が曖昧です。 file は NSIS/Inno と明示せず、「PE32 executable」とだけ報告することがあります。インストーラーの種類が不明な場合は、まず 7z l を試してください。内容が一覧表示されれば、NSIS または自己展開型です。Inno を判定するには、innoextract -l に切り替えてください。
  • .pkg の Payload の名前と圧縮形式にはばらつきがあります。 macOS の .pkg 内のペイロードは通常 Payload という名前で gzip 圧縮されていますが、7z は Payload~ として展開する場合があります。また、一部の pkg(Microsoft Office インストーラーなど)には gzip ラッパーのない生の cpio が含まれています。形式を決めつけず、必ず find -iname "Payload*" でペイロードを探し、file の出力に応じて処理を分岐してください(*gzip* → gunzip|cpio、*cpio* → cpio を直接実行)。
  • app.asar と app.asar.unpacked/ の違い。 Electron アプリには両方が含まれています。asar extract が処理するのは .asar ファイルのみです。.unpacked/ ディレクトリには展開済みのファイルが含まれているため、そのままコピーし、「展開」しようとしないでください。
  • サイズの大きい .iso/.dmg(数 GB)。 展開するとディスク使用量が倍になります。マニフェストにサイズを記載し、展開先の空き容量が少ない場合は、展開前に警告してください。

リファレンス

すべての形式 × プラットフォームを網羅したツール一覧、完全なインストールコマンド(innoextract、xar、Node.js を含む)、種類判定用のマジックナンバーのバイト列、形式ごとの例外など、詳細な情報については reference.md を参照してください。

このファイルを分けているのは、SKILL.md を簡潔な判断ガイドに保つためです。このファイルに記載のないコマンドが必要な場合や、手順 1 で種類の判定が曖昧な場合に参照してください。

コメント