CJK Workbench
ワークフロー

実践的なリバースエンジニアリングを一関数ずつ

03
シナリオ

実践的な解析の始め方

ご自身でコンパイルしたCプログラムから小さな関数を1つ選び、最初の命令から最後のreturnまで調べます。法律やライセンスの条件は国によって異なるため、使うのはご自身のコードか練習用ファイルだけにしてください。4つのステップは次のとおりです。

01

プロジェクトフォルダーを開く

Cのソース、コンパイル済みファイルのコピー、そして後で書き出すリストを入れた作業フォルダーを選びます。

02

テキストのリストを書き出す

Shellに逆アセンブラのエクスポートコマンドをコピーに対して実行させるか、リストを自分で保存して、結果をテキストファイルにします。

03

説明を頼む

エージェントにリストを読んで関数を1行ずつ説明するよう頼み、write_fileでメモを保存します。

04

答えを確認する

メモをソースやリストと見比べ、Ask firstでdiffを読み、合法であればラボで結果をテストします。

読んで学ぶためのリスト

add_numbers.asm
; add_numbers.asm - teaching listing, x64 Windows
; Returns the sum of its first two integer arguments.
; Argument 1 arrives in ecx (low half of rcx).
; Argument 2 arrives in edx (low half of rdx).
add_numbers:
    mov eax, ecx    ; copy argument 1 into eax
    add eax, edx    ; add argument 2, the sum stays in eax
    ret             ; return to the caller, result in eax

この関数は2つの整数を足します。Windows x64の呼び出し規約では、引数はecxとedxに入り、合計はeaxに作られ、retが呼び出し元に制御を戻します。

解析の授業向けの2つの演習

自分で書いた関数から始める

初心者からよく出る質問はアセンブリの始め方で、答えはご自身で書いた関数です。短いC関数を書いてコンパイルし、リストをテキストとして書き出します。read_fileがリストを開き、エージェントが各命令を説明します。どのレジスタがどの引数を保持するか、スタックが何をするか、結果がどこに戻るかです。write_fileがその説明をnotes/begin.mdに保存します。Plan onlyでは、エージェントがまずこれらの手順を一覧にします。まだ何も実行されません。次にAsk firstに切り替え、保存のたびにdiffを読みます。最後にメモをご自身のソースと比べ、合法であれば、コンパイルした関数をラボでテストします。

自作ライブラリの関数を文書化する

APIの解析によい練習は、ご自身のライブラリが公開している関数を一覧にして、各引数が何をするかを書き留めることです。ご自身のツールからインポートされた関数と公開された関数のリストをテキストとして保存すると、エージェントがgrepで1つの関数へのすべての呼び出しを見つけ、read_fileでその前後の行を開きます。notes/api.mdに表の下書きを作り、edit_fileが変更ごとにdiffを表示します。まず1つの関数から始めましょう。同じ方法は、ご自身の古いコードがどう動いていたかを復元するのにも役立ちます。エージェントは型や目的を取り違えることがあるため、承認する前に、各行をご自身のソースと自分のテストで確かめてください。

Windows用CJK Workbench

ご自身の例で試す

CJK Workbenchをダウンロード ↗