0

編集したいこのバイナリ ファイルがありますが、それを読み込んだ後、すべての文字列が意味不明な記号になっています。とにかくフォーマットすることはありますか?

4

1 に答える 1

5

「ちんぷんかんぷん」が表示される理由:

文字列が難読化されている可能性があります。 各文字列がプログラムで使用される前に、難読化解除ルーチンが実行されて、メモリ内の文字列が意味のあるものに変換される可能性があります。これは、静的解析ツール (GNU "strings" ユーティリティや IDA Pro など) がバイナリを正しく解析できないようにするために使用される一般的な手法です。この回答の残りの部分では、これがバイナリに当てはまると仮定しています。

文字列の難読化を解除する方法 (動的アプローチ):

バイナリを実行できる場合は、バイナリに難読化解除を任せることができます。バイナリをデバッガーで実行し、難読化が解除された後にメモリを分析するだけです。

文字列を難読化するいくつかのバイナリは、使用後に再度難読化することはありません。そのため、最初に試してみたい興味深いショートカットの 1 つは、デバッガーでバイナリを実行し、終了する直前に実行を中断することです。文字列がまだ難読化解除されている場合は、適切なセクションのメモリ ダンプを実行して、難読化解除された文字列を保存できます。(これは、必ずしもすべての文字列の難読化を解除するとは限りません。バイナリの実行パスに沿って難読化が解除された文字列のみを取得します)。

前の方法がうまくいかない場合は、難読化された文字列の最初のバイトにハードウェア書き込みブレークポイントを設定してから、バイナリを実行してみてください。ブレークポイントがトリップした場合は、手順に従って、残りの文字列の難読化を解除できるようにします。難読化解除が常に共通のルーチンから発生する場合は、そのルーチンの末尾近くにブレークポイントを配置し、実行がそのルーチンを通過するたびに難読化解除された文字列を出力するようにデバッガーをスクリプト化することができます。

難読化を解除した文字列のリストを取得したら、IDA データベースに直接パッチを適用するか (以下で説明)、'データベース内の各文字列のアドレスに繰り返し可能なコメントを残す (キーを使用)ことができます。難読化解除された文字列は、それを参照するすべての命令のコメントとして表示されます。

小さなバイナリの場合は、手動で注釈を付けることができますが、このプロセスを自動化できるようにスクリプト IDA に読み込むことは価値があります。 IDA Pro Bookには、これに関する優れたリファレンスが含まれています。

文字列の難読化を解除する方法 (静的アプローチ):

バイナリを実行できない場合、または動的アプローチですべての文字列の難読化が解除されない場合は、自分で難読化を解除できます。

IDA Pro で難読化された文字列のいずれかへの相互参照を表示する (xキーを使用して表示する) と、難読化解除ルーチンに移動する可能性が高くなります。ルーチンがそれほど複雑でない場合 (通常はそれほど複雑ではありません)、debofuscation ルーチンをエミュレートするスクリプトを作成できるはずです。これにより、難読化された文字列を IDA データベース内の難読化された文字列に置き換えることができます。

(明確にするために、IDA データベースはバイナリ自体から完全に分離されています。データベースに対して何を行っても、実際のバイナリには影響しません。また、バイナリに対して何を行っても、データベースには影響しません)。

IDA をスクリプト化するためのオプションは、IDC (IDA のオリジナルの組み込みスクリプト言語) と IDAPython です。はるかに使いやすく、はるかに強力な言語であるため、IDAPython を使用することを強くお勧めします。IDA Free 5.0 に IDAPython をインストールできるかどうかはわかりませんが、IDA Pro のほぼすべての最新バージョンにバンドルされているはずです。

IDA のスクリプト作成の概要を説明することは、この回答の範囲を超えていますが、開始するための例を次に示します。IDA Free を使用している場合に備えて、IDC に書いています。難読化解除ルーチンが、null バイトがデコードされるまで、連続する各バイトを 0x1F で単純に XOR したとします。次に、次のループが IDC スクリプトの一部になる可能性があります。

// *EXAMPLE*
auto addr = 0x00401000; // The address of your string

while(1){
    auto b = Byte(addr) ^ 0x1F;
    PatchByte(addr, b);
    if (b == '\0'){
        break;
    }
    addr = addr + 1;
}

File > IDC Command...スクリプトの実行は、またはから実行できますFile > Script file...

ご想像のとおりByte、特定のアドレスに格納されているバイトを返し、バイトをアドレスにPatchByte書き込みます。IDAPython の組み込み関数は、対応する IDC と同じ名前を共有しているため、IDAPython のバージョンは、C に似た構文を除けばほぼ同じです。前述したように、 IDAのスクリプト作成に関するウォークスルーについては、The IDA Pro Bookを強くお勧めします。基本を理解したら、IDA の組み込みのヘルプ インデックスとIDAPython ドキュメントを他の参考資料として使用できます。

コードにパッチを適用するスクリプトを実行する前に、必ずデータベースを保存してください! IDA には「元に戻す」機能がないため、わずかなコーディング エラーでデータベース全体が台無しになる可能性があります。

幸運を!

于 2012-11-22T18:11:01.993 に答える