はじめに
解析した検体が dll をドロップし、DLL サイドローディングを使い特定の Export 関数から実行されていたので、これのデバッグ方法と IDA と x64dbg のアドレスの合わせ方をまとめました。
dll の表層解析
本記事では以下の DLL を読み込み、デバッグを行います。
ファイル名:mpsvc.dll
SHA256:
A369FEE3B83C2D2534C48FDFAC8D03A266809AAA28ACE6B6002EAB57CC14EDD1
※ 悪意のある挙動を行う DLL のため、取り扱いには注意してください。
まず、この DLL にどの様な Export 関数が存在するのかを pestudio を使用して確認します。pestudio で読み込むと、Export 関数 ServiceCrtMain が Ordinal=1 (序数:Export 関数の Index のこと) で実装されている事が分かります。
この Export 関数をデバッグしてみましょう。
x64dbg による DLL の読み込み
事前作業(x64dbgのオプション設定)
x64dbg で dll ファイルを直接読み込むと DLLLoader による読み込みになります。特定の Export 関数をデバッグする場合は、この方法では不都合が生じます。この為、Windows で DLL を実行するときに使用する rundll32.exe を使用する必要があります。まず、DLL を読み込んだ時に確実にブレイクさせたいので、オプション→ユーザ設定で DLL 読み込み時にブレイクする設定をします。
rundll32 とコマンドラインオプションによる DLL 読み込み
x64dbg で rundll32.exe を開き、コマンドラインオプションとして読み込む DLL, Export 関数を指定します。指定するのは関数名でも Ordinal でもどちらでも大丈夫です。Ordinal を指定する時は、Ordinal と分かるように # を付けます。
解析対象 DLL のシンボル読み込み
DLL を rundll32 のコマンドラインオプションとして読み込んだら、デバッグを実行 (F9) します。DLL を読み込み時のブレイクを設定しているので、初期化時の DLL 読み込みで都度ブレイクするはずです。根気強く F9 キーを押し、DLL 読み込みを進めます。DLL 読み込みの際はタイトルバーの Module 名か、ログ画面、ステータスバーの Pause 理由のメッセージを確認しながら進め、読み込み対象の DLL (mpsvc.dll) でブレイクするまで進めます。
読み込み対象の DLL でブレイクしたら、シンボル画面を確認しましょう。読み込み対象の DLL がシンボルとして読み込まれている事が分かります。また、pestudio で確認した Export 関数が表示されていることも確認できます。
シンボル画面では読み込み対象の DLL の Base アドレスを確認します。
Export 関数へのブレイク
また、デバッグしたい Export 関数名をダブルクリックして CPU 画面を表示させ、ブレイクポイントを貼ります (F2)。
その後は設定したブレイクポイント (Export 関数) に到達するまで実行 (F9) します。
IDA による DLL 読み込みとアドレス合わせ
IDA でデコンパイルされたグラフやテキストを並行して追いかける時に、アドレスが違っていると解析効率が下がります。その為、読み込んだアドレスに IDA の表示を合わせる必要があります。
ベースアドレスの変更
IDA で DLL を読み込んだ後、Edit → Segments → Rebase program... をクリックします。
表示されるウィンドウで x64dbg のシンボル画面で確認した読み込み対象の DLL の Base アドレスを Value の値に指定してください。
これにより、x64dbg で表示されるアドレスと IDA で表示されるアドレスが一致するようになります。
参考
本記事で使用したツール
pestudio:https://www.winitor.com/
x64dbg:https://x64dbg.com/
IDA Free v7.0:https://www.hex-rays.com/products/ida/support/download_freeware/