mcpField
D
deobf-string

deobf-string

github.com/p4nda0sセキュリティ140100 回インストール23 週間前に更新
リポジトリ

deobf-string について

deobf-stringは、コードやバイナリから暗号化文字列を復元するリバースエンジニアリング用スキルです。IDA Pro MCPで復号ルーチンを調べ、Pythonでの実装かUnicornによるエミュレーションかを選びます。

主な機能

  1. 01暗号化文字列のパターン特定
  2. 02IDA Pro MCPで復号ルーチンを調査
  3. 03アルゴリズムとパラメーターの推定
  4. 04単純な方式をPythonで復号
  5. 05複雑な処理をUnicornでエミュレート
  6. 06アドレス付きで復号文字列を表示

活用シーン

  1. 01難読化バイナリから文字列を復元
  2. 02XORや置換式の文字列暗号化を分析
  3. 03実行時状態に依存する復号処理をエミュレート
  4. 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:結果を出力する

復号後、結果をユーザーに提示します。

  1. 復号された文字列をアドレスとともに、表形式で表示します。
Address      | Decrypted String
-------------|------------------
0x00412000   | "Hello, World!"
0x00412020   | "/dev/null"
  1. パッチファイルを生成するか、ユーザーに尋ねます。

復号が完了しました。バイナリー内の暗号化された文字列を置き換える .patched ファイルに、結果を書き込みますか?

ユーザーが希望する場合は、暗号化されたバイト列を平文(ヌル終端)に置き換えたパッチ済みバイナリーを作成し、<original_name>.patched として保存します。

コメント