ゾンビ狩りクラブ

Linux, Server, Network, Security 関連などをゆるーくテキトーに載せてます

apkファイルからJavaのソースコードを抽出する

Index

1. はじめに

本稿では、apkファイルを解析(リバースエンジニアリング)する方法を解説する。

使用するツールは以下になる。

  • dex2jar
  • JD-GUI

また、実行するにはJavaが必要になる。
Javaのインストール方法は、こちらを参照したい。

なお、実行環境は以下になる。

% uname -a
Linux ubuntu 4.10.0-37-generic #41~16.04.1-Ubuntu SMP Fri Oct 6 22:42:59 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

2. 環境構築

2.1 dex2jar

dex2jarは、dexファイルをjarファイルに変換するツールである。

sourceforge から dex2jar をダウンロードする。

% wget https://downloads.sourceforge.net/project/dex2jar/dex2jar-2.0.zip

zipを解凍する。

% unzip dex2jar-2.0.zip
% ls dex2jar-2.0
d2j-baksmali.bat   d2j-dex2smali.sh                d2j-jar2dex.bat     d2j-jasmin2jar.sh  lib
d2j-baksmali.sh    d2j-dex-recompute-checksum.bat  d2j-jar2dex.sh      d2j-smali.bat
d2j-dex2jar.bat    d2j-dex-recompute-checksum.sh   d2j-jar2jasmin.bat  d2j-smali.sh
d2j-dex2jar.sh     d2j_invoke.bat                  d2j-jar2jasmin.sh   d2j-std-apk.bat
d2j-dex2smali.bat  d2j_invoke.sh                   d2j-jasmin2jar.bat  d2j-std-apk.sh

Unixではd2j-dex2jar.sh を、windows ではd2j-dex2jar.bat を使用する。

また、実行する為にパーミッションを変更する。

% sudo chmod 744 /usr/local/lib/dex2jar-2.0/*

2.2 JD-GUI

Windowsでのインストール

公式サイトからダウンロードしインストールする。

macでのインストール

公式サイトからのダウンロード、または brew コマンドを使用してインストールできる。

% brew install caskroom/cask/jd-gui

Ubuntuでのインストール

% git clone https://github.com/java-decompiler/jd-gui.git
% cd jd-gui
% ./gradlew build

ここで少し時間がかかるのでひたすら待つ。
終わったら、以下のコマンドで実行できる。

% ls build
distributions  launch4j  libs  tmp
% java -jar build/libs/jd-gui-1.4.0.jar  

2.3 apkファイルを用意する

手元にapkファイルがない人は、以下からサンプルをダウンロードできる。
このサンプルは、SECCON2015 で出題されたものである。

% wget https://github.com/ctfs/write-ups-2015/raw/master/seccon-quals-ctf-2015/binary/reverse-engineering-android-apk-1/rps.apk

3. apkファイルを解析する

3.1 dexファイルの抽出

apkファイルはzipファイルと同じ構造なので、unzipコマンドでapkファイルを解凍する。

% unzip rps.apk -d rps
% ls rps                        
AndroidManifest.xml  META-INF/  classes.dex  lib/  res/  resources.arsc

すると、classes.dexというdexファイルが出てくる。

3.2 dexファイルからjavaファイルを生成する

先ほどのdexファイルをdex2jarでjavaファイルにする。

% d2j-dex2jar.sh rps/classes.dex
dex2jar rps/classes.dex -> ./classes-dex2jar.jar
% ls
classes-dex2jar.jar  rps/  rps.apk               

生成されたclasses-dex2jar.jarをJD-GUIで逆コンパイルすればソースコードを見ることが出来る。

f:id:Garfields:20171015020729p:plain