deobf-string について
deobf-stringは、コードやバイナリから暗号化文字列を復元するリバースエンジニアリング用スキルです。IDA Pro MCPで復号ルーチンを調べ、Pythonでの実装かUnicornによるエミュレーションかを選びます。
主な機能
- 01暗号化文字列のパターン特定
- 02IDA Pro MCPで復号ルーチンを調査
- 03アルゴリズムとパラメーターの推定
- 04単純な方式をPythonで復号
- 05複雑な処理をUnicornでエミュレート
- 06アドレス付きで復号文字列を表示
活用シーン
- 01難読化バイナリから文字列を復元
- 02XORや置換式の文字列暗号化を分析
- 03実行時状態に依存する復号処理をエミュレート
- 04パッチ適用前に復号結果を確認
MCP 対応
復号関数の調査と逆コンパイルにはIDA Pro MCPへの接続が必要です。分析開始前に接続状態を確認します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ p4nda0s/ bin-deobf-skills --skill deobf-stringインストール後、Claude Code で/deobf-stringを入力して読み込まれたか確認します。
詳細
文字列の難読化解除
前提条件
解析を開始する前に、IDA Pro MCP が接続されているか確認してください。MCP ツールを使用して接続を検証します。IDA Pro MCP が利用できない場合は、ユーザーに次のように伝えてください。
IDA Pro MCP に接続されていません。MCP プラグインを読み込んだ状態で IDA Pro を開き、MCP サーバーが実行中であることを確認してから、もう一度お試しください。
ワークフロー
ステップ 1:暗号化された文字列を特定する
ユーザーから提供されたコードスニペットまたは関数を解析し、文字列の暗号化パターンを特定します。
- 暗号化された文字列と思われるバイト配列やデータ参照を探します
- 復号ルーチンを特定します(文字列の使用箇所で呼び出されることがよくあります)
- 復号関数をリバースエンジニアリングして、暗号化アルゴリズムを特定します
一般的なパターン:
- 1 バイトまたはキー配列を使用した XOR
- 独自の置換暗号
- RC4 またはその他のストリーム暗号
- Base64 と XOR の組み合わせ
- 算術変換を用いてスタック上に構築される文字列
ステップ 2:復号ルーチンを解析する
IDA Pro MCP を使用して、次の操作を行います。
- 復号関数を逆コンパイルする
- パラメーターを特定する:暗号化データのポインター、長さ、キー
- アルゴリズムの種類と複雑さを判断する
ステップ 3:復号方法を選択する
単純なアルゴリズム(純粋な計算で、外部依存関係がないもの):
- 1 バイトまたは複数バイトの XOR
- ADD/SUB/ROT 変換
- 単純なルックアップテーブル
→ 復号用のスタンドアロン Python スクリプトを作成します。
複雑なアルゴリズム(状態に依存するもの、ライブラリー関数を使用するもの、または再実装が困難なもの):
- 多数のラウンドを伴う独自の暗号
- 実行時の状態またはグローバル変数に依存する復号
- アルゴリズム自体が高度に難読化されているもの
→ Unicorn Engine を使用して、バイナリーから復号関数を直接エミュレートします。
ステップ 4:復号を実装する
単純な復号(Python スクリプト):
def decrypt_string(enc_bytes, key):
# Example: XOR decryption
return bytes([b ^ key[i % len(key)] for i, b in enumerate(enc_bytes)])
複雑な復号(Unicorn エミュレーション):
from unicorn import *
from unicorn.arm64_const import *
def emulate_decrypt(binary_path, func_addr, enc_data, enc_len, key_ptr):
with open(binary_path, 'rb') as f:
code = f.read()
mu = Uc(UC_ARCH_ARM64, UC_MODE_LITTLE_ENDIAN)
# Map code segment
mu.mem_map(base_addr, align(len(code)))
mu.mem_write(base_addr, code)
# Map stack
mu.mem_map(stack_base, stack_size)
mu.reg_write(UC_ARM64_REG_SP, stack_top)
# Set up arguments (AArch64 calling convention)
mu.reg_write(UC_ARM64_REG_X0, enc_data_addr)
mu.reg_write(UC_ARM64_REG_X1, enc_len)
mu.reg_write(UC_ARM64_REG_X2, key_addr)
# Emulate
mu.emu_start(func_addr, func_end)
# Read decrypted result
result = mu.mem_read(output_addr, enc_len)
return bytes(result)
ステップ 5:結果を出力する
復号後、結果をユーザーに提示します。
- 復号された文字列をアドレスとともに、表形式で表示します。
Address | Decrypted String
-------------|------------------
0x00412000 | "Hello, World!"
0x00412020 | "/dev/null"
- パッチファイルを生成するか、ユーザーに尋ねます。
復号が完了しました。バイナリー内の暗号化された文字列を置き換える
.patchedファイルに、結果を書き込みますか?
ユーザーが希望する場合は、暗号化されたバイト列を平文(ヌル終端)に置き換えたパッチ済みバイナリーを作成し、<original_name>.patched として保存します。