解析メモ

マルウェア解析してみたり解析に役に立ちそうと思ったことをメモする場所。このサイトはGoogle Analyticsを利用しています。

x64dbg と IDA を使った DLL デバッグ方法

はじめに

解析した検体が dll をドロップし、DLL サイドローディングを使い特定の Export 関数から実行されていたので、これのデバッグ方法と IDA と x64dbg のアドレスの合わせ方をまとめました。

f:id:k1z3:20200504183434p:plain

dll の表層解析

本記事では以下の DLL を読み込み、デバッグを行います。

ファイル名:mpsvc.dll
SHA256:
A369FEE3B83C2D2534C48FDFAC8D03A266809AAA28ACE6B6002EAB57CC14EDD1
※ 悪意のある挙動を行う DLL のため、取り扱いには注意してください。

まず、この DLL にどの様な Export 関数が存在するのかを pestudio を使用して確認します。pestudio で読み込むと、Export 関数 ServiceCrtMain が Ordinal=1 (序数:Export 関数の Index のこと) で実装されている事が分かります。

f:id:k1z3:20200504181050p:plain

この Export 関数をデバッグしてみましょう。

x64dbg による DLL の読み込み

事前作業(x64dbgのオプション設定)

x64dbg で dll ファイルを直接読み込むと DLLLoader による読み込みになります。特定の Export 関数をデバッグする場合は、この方法では不都合が生じます。この為、Windows で DLL を実行するときに使用する rundll32.exe を使用する必要があります。まず、DLL を読み込んだ時に確実にブレイクさせたいので、オプション→ユーザ設定で DLL 読み込み時にブレイクする設定をします。

f:id:k1z3:20200504181806p:plain

rundll32 とコマンドラインオプションによる DLL 読み込み

x64dbg で rundll32.exe を開き、コマンドラインオプションとして読み込む DLL, Export 関数を指定します。指定するのは関数名でも Ordinal でもどちらでも大丈夫です。Ordinal を指定する時は、Ordinal と分かるように # を付けます。

f:id:k1z3:20200504181831p:plain

f:id:k1z3:20200504181840p:plain

解析対象 DLL のシンボル読み込み

DLL を rundll32 のコマンドラインオプションとして読み込んだら、デバッグを実行 (F9) します。DLL を読み込み時のブレイクを設定しているので、初期化時の DLL 読み込みで都度ブレイクするはずです。根気強く F9 キーを押し、DLL 読み込みを進めます。DLL 読み込みの際はタイトルバーの Module 名か、ログ画面、ステータスバーの Pause 理由のメッセージを確認しながら進め、読み込み対象の DLL (mpsvc.dll) でブレイクするまで進めます。

f:id:k1z3:20200504181950p:plain

f:id:k1z3:20200504182042p:plain

読み込み対象の DLL でブレイクしたら、シンボル画面を確認しましょう。読み込み対象の DLL がシンボルとして読み込まれている事が分かります。また、pestudio で確認した Export 関数が表示されていることも確認できます。

f:id:k1z3:20200504182253p:plain

シンボル画面では読み込み対象の DLL の Base アドレスを確認します。

f:id:k1z3:20200504182336p:plain

Export 関数へのブレイク

また、デバッグしたい Export 関数名をダブルクリックして CPU 画面を表示させ、ブレイクポイントを貼ります (F2)。

f:id:k1z3:20200504182430p:plain

その後は設定したブレイクポイント (Export 関数) に到達するまで実行 (F9) します。

IDA による DLL 読み込みとアドレス合わせ

IDA でデコンパイルされたグラフやテキストを並行して追いかける時に、アドレスが違っていると解析効率が下がります。その為、読み込んだアドレスに IDA の表示を合わせる必要があります。

ベースアドレスの変更

IDA で DLL を読み込んだ後、Edit → Segments → Rebase program... をクリックします。

f:id:k1z3:20200504182514p:plain

表示されるウィンドウで x64dbg のシンボル画面で確認した読み込み対象の DLL の Base アドレスを Value の値に指定してください。

f:id:k1z3:20200504182538p:plain

これにより、x64dbg で表示されるアドレスと IDA で表示されるアドレスが一致するようになります。

f:id:k1z3:20200504183434p:plain

参考

本記事で使用したツール

pestudio:https://www.winitor.com/
x64dbg:https://x64dbg.com/
IDA Free v7.0:https://www.hex-rays.com/products/ida/support/download_freeware/

x64dbg の参考にした記事

medium.com