coding, photo, plant and demo

*Android apkのデコンパイルの仕方と最近のアプリ動向

tech android 20130811 080603
不審なapkの中身を確認したいことってありますよね?
ということで簡単なapkのデコンパイル方法のメモ。

unzip hoge.apk

# decode xml
wget -O AXMLPrinter2.jar http://android4me.googlecode.com/files/AXMLPrinter2.jar
for f in `find . -name \*.xml`; do java -jar AXMLPrinter2.jar $f > $f.txt; done;

# decompile dex
curl http://dex2jar.googlecode.com/files/dex2jar-0.0.9.8.tar.gz|tar zx
dex2jar-0.0.9.8/dex2jar.sh classes.dex
mkdir classes
unzip -d classes classes_dex2jar.jar

wget http://www.varaneckas.com/jad/jad158e.linux.static.zip
unzip jad158e.linux.static.zip
find classes -name \*.class | xargs ./jad -d src -s .java -r


ちょっと余談になりますが、AndroidアプリではPro guardなどで難読化を掛けるのは一般的ではないようです *0 。もっとも多少難読化したところで、面倒になるだけで読めてしまうことには変わりありませんし、別に読めてもいいじゃん、という人が殆どなのかもしれませんが。

ただ、そもそもiOSとAndroid等の複数のプラットフォームに対応するアプリは、コアがJavaで書かれていることは極めて稀なようです。というのも、プラットフォーム毎にコードを書いていては大変なので、独自なりUnity等のミドルウェア(ゲームエンジン)を使って、プラットフォーム間の差異を吸収しているからです。この場合Javaにはグルーコードがあるだけで、そのためそれが読めても意味はなく難読化の意味はありません。コアはネイティブ(機械語)なり、その他の言語(UnityならC#やJavaScriptかな)で別の場所に書かれています。

例えば、ゲーム内課金を行うゲームは通常、課金に関係するステータスやロジックをサーバ側に持っていると思いますが、それでもアプリ側を解析されて例えばボットのようなことをやられるとビジネスが崩壊する恐れがあります。スマホのゲームで巨額の利益を上げている各社が、どのような技術を使ってそのアプリのロジックを守っているか興味深いところです。
*0 : JavaScriptに関してはClosure CompilerのAdvancedモードでのコンパイルが常識となっているのに。ってあれは省サイズが目的ですけど