Dalvik仮想マシン

 Dalvik仮想マシンはAndroidプラットフォームのために設計・開発した、レジスタベースの仮想マシンです。Dalvikは低メモリ環境に対して最適化されており、オペレーティングシステムによるプロセス間の分離、メモリ管理、スレッドのサポートを用いて複数のVMインスタンスが同時に動作できるよう設計されています。DalvikはJava仮想マシンとされることもありますが、動作するバイトコードがJavaバイトコードではないため、厳密にはこれは正確ではありません。また、Java互換性テストを通過していないので、法的にもJavaを名乗れません。Android SDKに含まれる dx と呼ばれるツールが正規のJavaコンパイラでコンパイルされたJavaクラスファイルを別のファイル形式('.dex'形式)に変換します。また、AndroidではDalvik仮想マシンを使用した中間コードでのソースコードの記述以外にも、NDKを使用したC言語での記述が可能です。Dalvik仮想マシンがSDKと提供されています。実行効率はCのほうが早いのでアプリによってはハイブリッドで記述されているというケースがあります。

TOP

apkファイル解析、リソースファイル

 前述したとおり、apkは各ファイルをZIPで圧縮した形式となっているため、リソースの取得は簡単です。もちろん、元のプログラムにプロテクトなどがかかっている場合は不可能な場合があります。プロテクトの種類にもよりますが、実際に解析段階にならないとapkにプロテクトがかかっているのか否かを判断するのは難しいです。apkのなかの各ファイルはバイナリ化された状態で格納されています。ソースコードとXML設定ファイルは処理効率のいいバイナリファイル化(中間コード)に置き換えられていますが、リソースファイル(アイコン画像、BGM音楽)は元々がバイナリファイルなのでそのままの形式で格納されています。よって、リソースファイルをapkから取得する場合は単純に拡張子を*.zipに置き換え、解凍するだけで取得可能です。主にresフォルダ以下やassetsフォルダなどに格納されています。また、ZIPでのパッケージ形式はAndroidだけではなく、iOSでも同種の仕組みです。よって、Appleのアプリも*.ipaをZIPにすることでリソースファイルを取得することが可能です。iOSで異なるのは仮想マシンがないため中間コードではなく機械語が格納されています。よって、Androidで解析するツールとは別のツールが必要になります。

TOP

apkファイル解析、中間コード

 Dalvik仮想マシン用のコードに変換されているため、逆解析には、その前段階にあたるJavaのソースコードに変換します。解析は主にこのJavaのソースコードにより完了という形になります。手順としては、apkファイルからdexファイル(Dalvik仮想マシンのバイトコード)を取り出し、それをjarファイルに変換して、Javaのソースコードに変換します。対応するツールとしては、

があります。逆解析の仕方は単純で、
$ dex2jar.sh sample.apk
と言った形でコマンドラインから実行します。これだけで変換することができます。問題がなければsample_dex2jar.jarというファイルが新たに生成されているはずです。あとはもう1つのツールである、Java Decompilerでこのファイルを開きます。重要なことは、オリジナルのJavaのコードと全く同じという訳ではない点です。比較的近い形でコードが再現されます。また、全てがうまく逆コンパイルできるわけではなく、場合によってはエラーが出てしまったり、もしくはコードが難読化されている場合があります。うまく逆コンパイルできた場合、httpといったキーワードで検索すると、HttpUrlConnectionやHttpClientクラスといったものにマッチするので、外部と通信している部分のコードを探し出すことも可能です。

TOP

apkファイル解析、XMLコード

 上記の方法では中間コードだけですが、マニフェストファイルなどのXMLファイルを見たい場合は、別のツールを使用します。

使用するコマンドとしては、
$ apktool d sample.apk
とします。すると、apkファイル名と同じディレクトリ、この場合だとsampleというディレクトリが作成されます。apkを単純に展開しただけではバイナリ化され読むことができなかったAndroidManifest.xmlですが、テキストに変換されて見慣れた内容になります。また、smaliディレクトリには、smaliと呼ばれる逆アセンブルされたDalvik仮想マシンのバイトコードが入っています。さらに、resディレクトリにはリソースファイルが、assetsディレクトリにはassetsファイルが展開されています。このように、apktoolを使用することでアプリケーションの中身を自由に見ることができます。もちろん、見るだけではなく編集することもでき、smaliファイルを編集しアプリケーションの挙動を変えたり、リソースファイルを編集し表示内容を変えることも可能です。編集したアプリケーションは、以下のコマンドで新しいアプリケーションとしてビルドすることができます。
$ apktool b sample new_sample.apk
この例では、sampleディレクトリ下にあるファイルをnew_sample.apkとして再ビルドしています。

TOP

apkファイル解析、署名検証

 apkファイルに格納されたデジタル証明書は抽出することは不可能ですが閲覧することは可能です。そもそもデジタル証明書とは、作成者を証明し、また、改ざんされていないことを保証するためのもの。アプリケーションまたはコードへの署名というのは、指定されたアプリケーションに対し、秘密鍵を使ってデジタル署名するプロセスを指します。デジタル著名の必要性は、リバースエンジニアリングが(ある程度)容易で、偽装が可能なことに起因します。アプリアップデート時には署名が前バージョンと同じであることを要求されます。よって、リバースエンジニアリングで証明書を取得すること自体は不可能ですが閲覧は可能という理屈になります。閲覧するには、jarsignerコマンドを使用します。JDKのインストールフォルダ以下にあるbinフォルダにあるので、コマンドを実行する際はパスを予め通しておいてください。以上になりますが、混同しやすい点として、ここでいったデジタル署名とプログラム暗号化は違う話です。

$ jarsigner -verify -verbose -certs sample.apk

TOP