どーも、Kyotokiです。
今月の初めごろにセキュリティの技術を競うコンテストであるSECCONのオンライン予選が開催されまして、それに参加させていただきました。
そのSECCONの問題を一つ紹介しようと思います。
Reverse-Engineering Android APK1 (Binary 100)
じゃんけんに1000回連続で勝ち続けよ。
という問題が出されました。上のリンクから問題のアプリがダウンロードできると思う(切れてたらごめんなさい)ので、1000連勝できる自身のある方はやってみるといいんじゃないですかねぇ。僕はそんな自信もありませんでしたし、根気よく1000回以上タップし続ける気もさらさらありませんので、この問題のアプリを改変することにしました。
当初の僕はapkファイルがどういう代物か分からなくて、とりあえずバイナリエディタに投げてみましたがそれではよく分かりませんでした。とりあえず「apk Android リバースエンジニアリング」とググってみますと、apkってzipファイルみたいなヤツなのかなーという一応の理解はできました。あと、このapkファイルを書き換えるためのものが次の3つでできるのも知りました。
- apktool
- dex2jar
- jd-gui(またはjad)
apktoolはアプリをデコード、ビルドができるツールです。dex2jarはdexファイルをjarに変換してくれるツールで、jd-guiはdex2jarで作られたJavaのソースコードを見るのに使いました。
まずapktoolを使ってapkファイルを分解します。その中を見てみますと、smaliというファイルが入ってます。smaliファイルはバイトコードを逆アセンブルした結果が入っているもので、これを後々書き換えることになります。これだけでは書き換えようにもどこを書き換えたらいいか分かりにくいです。
元のJavaの形で閲覧できたら・・・。そんな願いを叶えてくれるツールがdex2jarです!これを使う為にapkの中のdexファイルを手に入れなければなりません。smaliファイルをdexファイルにするコマンドを使ってもいいですし、apkファイルをunzipコマンドで解凍した中からでも構いません。このdexファイルをdex2jarにかけると・・・あら、不思議!そこには.jarという拡張子がついたファイルがあるではありませんか!
さあこれを迷わずjd-guiなりjadなりに突っ込んでみましょう。人によっては親の顔よりも見たであろう、Javaのソースコードが現れます(僕は初対面でしたけどね)。ここからはJavaのコードを参考にしながらsmaliの内容を書き換えていきます。smaliファイルはたくさんありますが、改変したいsmaliファイルなんてだいたい見当が付きます。探しましょう。それとsmaliはJavaのコードにあたる何とかだーという感じにわかるので、そこは慣れましょう。
さて、書き換えたら今度はそれをコンパイルしなくてはなりませんが、それは簡単です。「apktool b hogehoge hogehoge.apk」をすれば終わりです。
コンパイルを終えましたが、Androidでアプリを動かすにはkeystoreの作成と認証が必要になるみたいです。keytoolコマンドで作ってjarsignerで認証をしましょう。細かいことはグーグル先生が教えてくれます。
こうして改変したアプリが使えるようになりました。・・・apkが見つからない?コンパイルに成功したら分解してできたフォルダの中に新しくdistフォルダができているはずですのでそのなかにあります(僕は気付くのに相当な時間を掛けてしまいました)。
あとはこれをAndroidにインストールしてうまく動けば成功です!
・・・とまあ、こんな感じでapkファイルを改変することができました。一つの問題の流れを大雑把に解説しただけですが、SECCONは他にもいろいろな問題が用意されています。もし興味があれば皆さんも是非是非参加してみてくださいね!参考サイトも載せておきますので気になった方はどうぞ♪
Androidのリバースエンジニアリング方法
http://qiita.com/ayakix/items/1dd61774c135db209e1e
keytool-鍵と証明書の管理ツール
https://docs.oracle.com/javase/jp/1.5.0/tooldocs/windows/keytool.html
次の記事は小林さんの人間QRコードリーダーになりませんか?です。