re-packer-id について
未知のバイナリサンプルに使われたパッカーや難読化器を識別するリバースエンジニアリング向けスキルです。シグネチャだけでなく、セクション、エントリーポイント、エントロピー、インポートテーブルも確認して後続の展開方法を判断します。
主な機能
- 01DIEとPEiDによるシグネチャ検索
- 02セクション名とエントリーポイントの確認
- 03エントロピー計測と高エントロピー領域の特定
- 04インポートテーブルの規模と内容の調査
- 05エントリーポイントとOEPの手掛かり記録
活用シーン
- 01未知サンプルのパッキング有無の初期確認
- 02展開手順の選択
- 03パッカーの挙動とプログラムの挙動の切り分け
- 04ツールが識別できない疑わしいサンプルの再調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ dslsdzc/ rev-skills --skill re-packer-idインストール後、Claude Code で/re-packer-idを入力して読み込まれたか確認します。
詳細
パッカーと難読化ツールの識別
使用する場合/使用しない場合
- 使用する:未知のサンプルを入手したら、まずパックされているかを確認し、パッカー名を特定してアンパックの手順を選択します。静的な初期調査で、エントロピーが高い/セクション名が異常/インポートテーブルが極端に小さい([[re-triage]] の出力を参照)ことが判明し、さらに確認が必要な場合
- 使用する:動的解析の前に「観察された挙動がパッカーによるものか、プログラムによるものか」を判断します
- 使用しない:対象がすでにクリーンなサンプルで、すぐにロジックを確認する場合([[re-binary-core]] に移動)
- 使用しない:パッカー名が正確に判明していて、アンパック作業だけが必要な場合(そのまま [[re-unpack-simple]] / [[re-unpack-advanced]] に進み、識別手順は省略できます)
- 注意:識別できないこと ≠ パックされていないこと(シグネチャデータベースが不完全/マイナーなパッカーの可能性があります)。特徴を組み合わせて判断し、必要に応じて未知のパッカーとして手動の手順を実施してください
ツールの準備
静的識別ではサンドボックスは不要です([[re-analyze/platform-tips]] の最優先原則:静的解析ではサンドボックスを使用しなくてもかまいません)。ツールは使用前に動作確認してください。
Detect It Easy(DIE、クロスプラットフォームの主力)
- Linux:公式 GitHub release
Horsicq/Detect-It-Easyからdie_lin64_portable_<ver>.tar.gzをダウンロードして展開すれば使用できます(CLIdiec/ GUIdie)。Debian/Ubuntu ではapt install dieでもインストールできます(リポジトリ版は古い場合があるため、シグネチャデータベースが不完全な場合は公式版を使用してください) - macOS:
brew install --cask detect-it-easy - Windows:公式 release の
die_win64_portable_<ver>.zipを展開します。GUI はdie.exe/ CLI はdiec.exeです - 確認:
diec --version
PEiD(Windows の老舗ツール、DIE を補完)
- Windows 専用(Wine でも実行できます):PEiD 0.95(GitHub ミラー)をダウンロードします。
PEiD 0.96/0.97のシグネチャデータベース更新パッケージとの併用を推奨します。DIE で識別できない場合は、クロスチェックに使用してください - 確認:PEiD を開いてサンプルを読み込み、パッカー名/エントリーポイントの特徴が表示されることを確認します
file / strings(初期の特徴確認)
- Linux:
apt install file binutils/dnf install file binutils/pacman -S file binutils - macOS:Xcode Command Line Tools に付属します(
xcode-select --install) - Windows/WSL:WSL 内で Linux パッケージを使用します
- 確認:
file --version、strings --version
エントロピーの計算(主に python3、ent/binwalk は任意)
- python3:
apt install python3/多くのシステムに標準で付属します。確認:python3 --version - ent(任意):
apt install ent/brew install ent。確認:ent(引数なしで usage が表示されます) - binwalk(任意、エントロピーグラフ):インストール方法は [[re-fw-extract]] を参照してください。確認:
binwalk -E sample.exe | head
pefile(任意、PE のセクション/EP/インポートテーブル用スクリプト)
- 全プラットフォーム:
pip install pefile - 確認:
python3 -c "import pefile"
操作手順
順番に実施し、各手順の結果を記録してください(証拠のパス + sha256。[[re-triage]] を参照)。識別結果(パッカー名/未知のパッカー/パッカーなし + OEP の手がかり)は、アンパック手順を選ぶ際の入力になります。
-
初期特徴の収集(file/strings):
file sample.exe sha256sum sample.exe strings -n 6 sample.exe | head -30パックされたサンプルでは通常、読み取り可能な文字列が非常に少なく、EP 付近にパッカーのシグネチャがあります(UPX ヘッダーには
UPX!マジックナンバーがあり、ASPack などはセクション名に特徴があります)。クリーンなサンプルでは文字列が豊富です。 -
シグネチャデータベースのスキャン(DIE/PEiD):
diec sample.exe # CLI 扫描;GUI 用 diePEiD(Windows):サンプルをドラッグして読み込み、パッカー名/Entrypoint/Section/Overlay の 4 項目のシグネチャを確認します。結果は 3 段階です:パッカー名が明確(UPX 0.89~3.xx / ASPack / FSG / VMProtect…)、疑わしい特徴(エントリーポイントまたはセクション名のみ一致)、未識別。未識別でもクリーンとは限りません(落とし穴 1 を参照)。
-
異常なセクション名の確認:
objdump -h sample.exe | head -30特徴:
UPX0/UPX1、.aspack、.adata、.petite、すべて大文字のカスタムセクション名、セクションテーブルの数や並び順の異常などです。セクション名は.text/.dataに偽装されている場合があります(落とし穴 2 を参照)。セクション名が正常でも、手順 4~6 と組み合わせて確認してください。 -
エントリーポイントの指し先を確認(EP が先頭セクション以外を指しているか):
objdump -f sample.exe # 看 start address python3 - <<'EOF' import pefile pe = pefile.PE('sample.exe') ep = pe.OPTIONAL_HEADER.AddressOfEntryPoint for s in pe.sections: va, vs = s.VirtualAddress, s.Misc_VirtualSize if va <= ep < va + vs: print("EP 位于节:", s.Name.rstrip(b'\x00').decode(), hex(va)) EOF通常の PE では EP は先頭セクション
.textを指します。EP が先頭以外のセクション/書き込み可能なセクションを指している場合は、パッカーの強い特徴です。 -
エントロピーが 7 を超えるか確認:
ent sample.exe # 整文件熵(可选) binwalk -E sample.exe | head -20 # 熵分布图,高熵段 = 压缩/加密 python3 - <<'EOF' import math, collections d = open('sample.exe','rb').read() c = collections.Counter(d); n = len(d) h = -sum((v/n) * math.log2(v/n) for v in c.values()) print(f"entropy = {h:.3f} bits/byte") EOFエントロピーが 7.0 bits/byte を超える場合は、パックまたは暗号化されている疑いがあります。セクションごとのエントロピーのほうが有用です(パッカーのセクションが高エントロピーで、コードのセクションが低エントロピーという混在した分布も、パッカーの特徴です)。
-
インポートテーブルが極端に小さいか確認:
objdump -p sample.exe | grep -A6 'DLL Name' | head -20通常の PE は数百から数千の API をインポートします。パックされた PE では、
kernel32.dllのLoadLibraryA/GetProcAddressなど、少数の API しかインポートしない場合があります(残りは実行時に動的に解決されます)。インポートテーブルが極端に小さく、エントロピーが高い場合は、ほぼ確実にパックされています。 -
OEP の手がかりを先に記録(識別段階で実施し、アンパック時まで待たない):
objdump -d sample.exe | sed -n '1,20p' # EP 附近指令単純な圧縮パッカーのエントリーポイントは
pushad/pushaで始まることがよくあります(ESP 定理が前提)。強力なパッカーのエントリーポイントは、push imm32; mov reg, imm; jmp vm_handlerの形式であることがよくあります。エントリーの命令列とアドレスを記録してください。アンパック時にブレークポイントの設定と OEP の判断にそのまま使えます。
分野横断の連携
- [[re-anti-analysis]]:ワークフローの第 1 ステップ(パッカーの識別)で本スキルを必ず呼び出します。識別結果によって unpack-simple / unpack-advanced の分岐が決まります
- [[re-analyze]] の triage「サンプルにパッカーがある/アンパック」パスで呼び出します(re-anti-analysis → re-packer-id)
- [[re-malware]]:パックされたサンプルは、まずパッカーを識別してからアンパック手順を決定します
- [[re-mobile]] / [[re-apk]]:難読化対策の識別後に、パッカーの種類(Android の保護パッカー)を確認します
- [[re-triage]]:エントロピーの異常/疑わしいセクション名がある場合は、本スキルに移って確認します
- [[re-crypto-id]]:パッカー層による定数の汚染指紋。まずパッカーを識別し、アンパック後に定数テーブルのフィンガープリントを確認します
- 強力なパッカー/未知のパッカーと識別された場合 → [[re-unpack-advanced]]。単純な圧縮パッカー → [[re-unpack-simple]]。パッカーなし → [[re-binary-core]] に戻ります
常见坑与陷阱
- 签名库不全 → 漏新壳:现象——DIE/PEiD 报 "Not found",但样本熵 7.8、导入表只有 3 个 API;原因——私有 / 小众壳不在签名库;对策——不依赖单一签名,用节名 + EP + 熵 + 导入表四特征组合判断,判定"未知壳"走手动脱壳流程
- 伪装节名:现象——节名全是
.text/.data看不出异常,但熵高、EP 指向第二节;原因——壳故意改名节表;对策——节名只作线索不作依据,交叉验证 EP 位置 + 熵 + 导入表 - 壳套壳:现象——识别为 UPX 但
upx -d解包后file仍报壳特征;原因——多层加壳(UPX 里包 Themida 等);对策——脱一层重识别一层,逐层循环复查四要素:PE header(新 EP 位置 / 节表结构 / 头字段)、节名(是否出现新壳节特征)、熵分布(是否有新高熵节)、导入表(是否仍极小 / 只剩 GetProcAddress 动态调用)——四要素全部正常才算脱净,任何一项异常就回到本技能重跑 - 识别阶段不记 OEP 线索:现象——脱壳到一半需要"壳入口指令 / EP 地址"时手忙脚乱,断点位置全靠猜;原因——识别时没记录;对策——步骤 7 在识别阶段就记录入口指令(pushad 等)与地址,供 ESP 定律直接使用
- 识别出壳名 ≠ 壳配置全开:现象——DIE 报 VMProtect/Themida 就默认走强壳全套流程,实际样本只是简单压缩或虚拟化未启用;原因——壳名只表示"加了什么壳",是否启用虚拟化/反调试是构建时的配置选项;对策——识别报告带上版本与配置线索(
.vmp0/.vmp1/.themida节是否存在、入口是 VM 分发型还是普通 stub、位数),交由 [[re-anti-analysis]] 决定走 [[re-unpack-simple]] 还是 [[re-unpack-advanced]] 流程 - 自动化脱壳工具对版本/位数敏感:现象——x64Unpack/Magicmida 等自动化工具对目标无效、dump 损坏;原因——脱壳器按壳的具体版本与位数实现(Magicmida 仅支持 32 位且不修 VM 反转储;x64Unpack 只验证过 Themida 2.4.6/VMProtect 3.4);对策——识别阶段记录壳名 + 版本 + 位数(DIE 版本字段/深度扫描),选工具前核对支持矩阵,不支持就走手动流程