Frida traceを使ったWindowsアプリの動的解析・改ざん方法

コラム概要

■こんな方におすすめ:

  • Windowsアプリの動的な解析手法を知りたい
  • Windowsアプリの動的改ざんに対する脆弱性について知識をつけたい
  • 開発/技術担当の方

■難易度:★☆☆

■ポイント:

Frida traceによって、Windowsアプリを簡単に動的解析、改ざんできる。
また、悪意あるコードの実行も可能となるため、適切に対策することが重要である。


1.はじめに

今までのコラムでは、AndroidやiOSのアプリを題材にしたものを多く紹介してきました。
本コラムでは、Windowsのアプリを動的に改ざんする方法について解説します。
使用するツールは、前回のコラム「Frida gadgetを使ったAndroidアプリの動的解析・改ざん方法」でも取り上げた
Fridaを使用します。

2.Fridaとは

Frida ( https://frida.re/ ) とはアプリの動的解析ツールです。
前回のコラムではFrida Gadgetを使用し、動的解析を行いましたが、
今回はfrida-trace( https://frida.re/docs/frida-trace/ )を使用します。
frida-trace は、API呼び出しを動的にトレースするツールです。
frida-traceを使用することにより、APIフックを行うことができます。

3.APIフックとは

Windowsではシステムコール時に様々なWindows APIの呼び出しが行われています。
APIフックとは、APIが呼び出される際に処理を横取りする仕組みのことです。
APIフックを使用して独自の処理を追加することにより、解析や改ざんが可能となります。

4.アプリに対する動的解析、改ざん例

説明のために、Windowsに付属しているアプリであるメモ帳(notepad.exe)を使用します。
動的解析を行うため、メモ帳はあらかじめ起動してあるものとします。
メモ帳はファイルへデータの書き込みを行う際、WriteFile APIを使用します。
このWriteFile APIをフックしてみます。
準備として、以下のコマンドを実行し、フックした際に実行するハンドラーファイルを作成します。

>frida-trace -i WriteFile -p メモ帳のPID
Instrumenting...
WriteFile: Auto-generated handler at "C:\\~実行時のパス\\__handlers__\\KERNEL32.DLL\\WriteFile.js"

この時、メモ帳のプロセス内にはfrida-agent.dllがインジェクションされ、
WriteFile API呼び出し時にハンドラーファイル(WriteFile.js)が実行されるようになっています。
作成されたハンドラーファイルはAPI名を標準出力するだけのコードとなっています。

WriteFile.js

{
  onEnter(log, args, state) {
    log('WriteFile()');
  },
  onLeave(log, retval, state) {
  }
}

初めに、このコードを書き換えて、実際のデータを解析してみます。
WriteFile APIは第2引数にファイルへ書き込む文字列を受け取ります。
ハンドラーファイルではWriteFile APIのすべての引数はargs変数に渡されているため、
第2引数をUTF8文字列として読み取り、標準出力で確認することにします。


WriteFile.js

{
  onEnter(log, args, state) {
    console.log("read text:" + Memory.readUtf8String(args[1]));
  },
  onLeave(log, retval, state) {
  }
}

メモ帳のデータを保存した際、ファイルに書き込まれた文字列が確認できました。

次に、データの改ざんを行います。
先ほど確認した、第2引数の文字列と、第3引数のファイルへ書き込むバイト数を書き換えます。


WriteFile.js

{
  onEnter(log, args, state) {
    this.newtext = Memory.allocUtf8String('改ざんテスト');
    args[1] = this.newtext;
    args[2] = ptr('0x12');
    console.log("write text:" + Memory.readUtf8String(args[1]));
  },
  onLeave(log, retval, state) {
  }
}

メモ帳のデータを保存した後、再度ファイルを開き直すと、
ファイルに書き込まれた内容が書き換えられていることが確認できました。

5.アプリに対する動的解析、改ざん例 (応用編)

このような仕組みを使用することにより、
データの改ざんだけでなく任意のコードを実行することも可能です。
以下のコードはMessageBoxA APIを使用し、文字列を表示する例です。
MessageBoxAの定義に合わせ、文字列はANSI文字列で扱います。


WriteFile.js

{
  onEnter(log, args, state) {
   var msg   = Memory.allocAnsiString(" APIフック ");
   var title = Memory.allocAnsiString(" フックテスト ");
   var MessageBoxAddr = Module.getExportByName('user32.dll','MessageBoxA');
   var funcMessageBox = new NativeFunction(MessageBoxAddr,'int',['int','pointer','pointer','int']);
   funcMessageBox(0,msg,title,0);
  },
  onLeave(log, retval, state) {
  }
}

メモ帳のデータを保存した際、メッセージボックスを表示できました。

6. まとめ

このように、WindowsのアプリもAndroidやiOSのアプリと同様に、
動的解析や改ざんが行えることがわかりました。
では、どのような対策方法があるのでしょうか。
例として、以下のようなものがあります。

①外部ツールからの介入の阻止
今回のように外部ツールが使用されると容易に解析などが可能となります。
外部ツールからの介入を阻止することが効果的です。

②Dllインジェクションの阻止
frida-agent.dllのようにDllをインジェクションされると他のコードの実行が可能となります。
Dllインジェクションを阻止することが効果的です。

③改ざんの検知
改ざんが行われた場合、アプリは想定の動作を行わない可能性があります。
改ざんをチェックする機能などを取り入れることが効果的です。

このような対策を複数組み合わせることにより、動的解析や改ざんの難易度を上げることができます。


当サイトでは、アプリのセキュリティについて詳しくわかる資料をご用意しています。
アプリのセキュリティや対策についてご興味を持たれた方は、
ぜひダウンロードしていただけますと幸いです。

ダウンロード資料一覧

また、弊社では
アプリへの不正な解析・改ざん行為(クラッキング)を防ぐ対策製品
「CrackProof」の開発・販売を行っております。
詳しく話を聞いてみたいと思われた方は、
当サイトからお気軽にお問い合わせください。

お問い合わせはこちら

7. 参考

Frida公式サイト:
https://frida.re