
apk-medit v0.2.7
デバッグ可能なAPKに対してrootやNDKを必要としないメモリ検索・パッチツール
apk-medit
Apk-meditは、root化やNDKを必要とせず、デバッグ可能なapkに対してメモリの検索とパッチを行うツールです。 モバイルゲームのセキュリティテスト用に作成されました。 多くのモバイルゲームにはroot化検出機能がありますが、apk-meditはroot権限を必要としないため、root化検出を回避することなくメモリ改ざんを行うことができます。
動機
メモリ改ざんはゲームをチートする最も簡単な方法であり、セキュリティテストで確認すべき項目の一つです。 また、GameGuardianのように気軽に使えるチートツールも存在します。 しかし、非rootデバイスかつCUIで利用できるツールはありませんでした。そこで、セキュリティテストツールとして作成しました。 iOSアプリを対象としたバージョンはsterrasec/ipa-meditです。
デモ
これは、クリアするのに100万回のタップが必要なゲームをapk-meditを使ってクリアするデモです。


インストール
GitHub Releasesからバイナリをダウンロードし、Androidデバイス上の/data/local/tmp/にプッシュしてください。
バイナリはarm64(実機)およびamd64(x86_64 Androidエミュレータ、例:Windows PC上)向けに提供されています。デバイスのABIはadb shell getprop ro.product.cpu.abiで確認できます。
$ adb push medit /data/local/tmp/medit
medit: 1 file pushed. 29.0 MB/s (3135769 bytes in 0.103s)
ビルド方法
makeコマンドでビルドできます。goコンパイラが必要です。
ビルド完了後、adbが接続されていれば、ビルドしたバイナリをAndroidデバイス上の/data/local/tmp/にプッシュします。
$ make
GOOS=linux GOARCH=arm64 GOARM=7 go build -o medit
/bin/sh -c "adb push medit /data/local/tmp/medit"
medit: 1 file pushed. 23.7 MB/s (3131205 bytes in 0.126s)
x86_64 Androidエミュレータ向けにビルドするには、代わりにbuild-x86_64ターゲットを使用します。
$ make build-x86_64 deploy
GOOS=linux GOARCH=amd64 go build -o medit
/bin/sh -c "adb push medit /data/local/tmp/medit"
使用方法
Windowsコンソール
Windows 10のCmdおよびPowerShellでは、常時表示されるコマンド説明パネルが上方向にずれてプロンプトを覆ってしまいます(#37)。
meditがWindows風のコンソール(ネイティブWindowsビルド、またはTERMが空/dumb)を検出すると、起動時にコマンド一覧を一度だけ表示し、ライブパネルを無効にします。Tabによるコマンド名の補完は引き続き機能します。
APK_MEDIT_LIVE_HELP=1/0でライブパネルを強制的にオン/オフできます。APK_MEDIT_WINDOWS_CONSOLE=1/0でコンソール検出を上書きできます。
run-asコマンドを使用して対象アプリが使用するファイルを読み取るため、apk-meditはdebuggable属性が有効になっているアプリでのみ使用できます。
debuggable属性を有効にするには、AndroidManifest.xmlを開き、application xmlノードに以下のxml属性を追加します:
android:debuggable="true"
sterrasec/apkutilを使用すれば、AndroidManifest.xmlを編集せずに簡単にdebuggable属性を有効にできるので便利です。
$ apkutil debuggable <target-apk-name>.apk
run-asコマンドを実行すると、ディレクトリが自動的に変更されます。そのため、/data/local/tmp/からmeditをコピーしてください。
meditを実行すると、対話型プロンプトが起動します。
$ adb shell
$ pm list packages # to check <target-package-name>
$ run-as <target-package-name>
$ cp /data/local/tmp/medit ./medit
$ ./medit
メモリへの書き込み時にptraceを使用しないようにすることもできます。 これによりptraceによるデバッガ検出を回避できますが、SELinuxのためAndroid 10以降では動作しません。
$ ./medit -without-ptrace
コマンド
対話型プロンプトで使用できるコマンドは以下の通りです。
find
指定した整数をメモリ上で検索します。
> find 999982
Search UTF-8 String...
Target Value: 999982([57 57 57 57 56 50])
Found: 0!
------------------------
Search Word...
parsing 999982: value out of range
------------------------
Search Double Word...
Target Value: 999982([46 66 15 0])
Found: 1!
Address: 0xe7021f70
string、word、dword、qwordなどのデータ型を指定することもできます。
> find dword 999996
Search Double Word...
Target Value: 999996([60 66 15 0])
Found: 1!
Address: 0xe7021f70
filter
以前の検索結果から、現在の検索結果と一致するものをフィルタリングします。
> filter 993881
Check previous results of searching dword...
Target Value: 993881([89 42 15 0])
Found: 1!
Address: 0xe7021f70
patch
検索で見つかったアドレスに指定した値を書き込みます。
> patch 10
...
Successfully patched!
ps
対象プロセスを検索し、1つだけ存在する場合はそれを対象として指定します。psは起動時に自動的に実行されます。
> ps
Package: jp.sterrasec.tap1000000, PID: 4398
Target PID has been set to 4398.
attach
psで対象pidが設定されている場合、対象プロセスにアタッチし、ptraceによってアプリ内のすべてのプロセスを停止します。
> attach
Target PID: 4398
Attached TID: 4398
Attached TID: 4405
Attached TID: 4407
Attached TID: 4408
Attached TID: 4410
Attached TID: 4411
Attached TID: 4412
Attached TID: 4413
Attached TID: 4414
Attached TID: 4415
Attached TID: 4418
Attached TID: 4420
Attached TID: 4424
Attached TID: 4429
Attached TID: 4430
Attached TID: 4436
Attached TID: 4437
Attached TID: 4438
Attached TID: 4439
Attached TID: 4440
Attached TID: 4441
Attached TID: 4442
対象pidが設定されていない場合は、コマンドラインで指定できます。
> attach <pid>
detach
アタッチしたプロセスからデタッチします。
> detach
Detached TID: 4398
Detached TID: 4405
Detached TID: 4407
Detached TID: 4408
Detached TID: 4410
Detached TID: 4411
Detached TID: 4412
Detached TID: 4413
Detached TID: 4414
Detached TID: 4415
Detached TID: 4418
Detached TID: 4420
Detached TID: 4424
Detached TID: 4429
Detached TID: 4430
Detached TID: 4436
Detached TID: 4437
Detached TID: 4438
Detached TID: 4439
Detached TID: 4440
Detached TID: 4441
Detached TID: 4442
dump
hexdumpのようにメモリダンプを表示します。
> dump 0xf0aee000 0xf0aee300
Address range: 0xf0aee000 - 0xf0aee300
----------------------------------------------
00000000 34 32 20 61 6e 73 77 65 72 20 28 74 6f 20 6c 69 |42 answer (to li|
00000010 66 65 20 74 68 65 20 75 6e 69 76 65 72 73 65 20 |fe the universe |
00000020 65 74 63 7c 33 29 0a 33 31 34 20 70 69 0a 31 30 |etc|3).314 pi.10|
00000030 30 33 20 61 75 64 69 74 64 20 28 61 76 63 7c 33 |03 auditd (avc|3|
00000040 29 0a 31 30 30 34 20 63 68 61 74 74 79 20 28 64 |).1004 chatty (d|
00000050 72 6f 70 70 65 64 7c 33 29 0a 31 30 30 35 20 74 |ropped|3).1005 t|
00000060 61 67 5f 64 65 66 20 28 74 61 67 7c 31 29 2c 28 |ag_def (tag|1),(|
00000070 6e 61 6d 65 7c 33 29 2c 28 66 6f 72 6d 61 74 7c |name|3),(format||
00000080 33 29 0a 31 30 30 36 20 6c 69 62 6c 6f 67 20 28 |3).1006 liblog (|
00000090 64 72 6f 70 70 65 64 7c 31 29 0a 32 37 31 38 20 |dropped|1).2718 |
000000a0 65 0a 32 37 31 39 20 63 6f 6e 66 69 67 75 72 61 |e.2719 configura|
000000b0 74 69 6f 6e 5f 63 68 61 6e 67 65 64 20 28 63 6f |tion_changed (co|
000000c0 6e 66 69 67 20 6d 61 73 6b 7c 31 7c 35 29 0a 32 |nfig mask|1|5).2|
000000d0 37 32 30 20 73 79 6e 63 20 28 69 64 7c 33 29 2c |720 sync (id|3),|
000000e0 28 65 76 65 6e 74 7c 31 7c 35 29 2c 28 73 6f 75 |(event|1|5),(sou|
000000f0 72 63 65 7c 31 7c 35 29 2c 28 61 63 63 6f 75 6e |rce|1|5),(accoun|
exit
meditを終了するには、exitコマンドまたはCtrl-Dを使用します。
> exit
Bye!
テスト
makeコマンドでテストコードを実行できます。
$ make test
ライセンス
MIT License