apkファイルのプログラム部分smaliファイルを見てみる

ほんの少しだけなら編集できるかもしれない?smaliファイル


smaliとは

AndroidのアプリはJavaというプログラミング言語で作成されています。
Javaプログラムをコンパイルして機械語に変換し、画像などのリソースと合わせてapkというパッケージにすることでAndroidにインストールすることのできるアプリになります。

apkファイルの構成
  AndroidManifest.xml
  META-INF(署名ファイル)
  res(画像等のリソース)
  classes.dex(プログラム)
  resources.arsc(言語等のリソース)

Apktoolを使ってapkファイルを展開するとプログラム部分のclasses.dexが展開されsmaliファイルに分かれます。
つまり、smaliファイルとはJavaをコンパイルした後の機械語の状態のファイルなのです。

smaliファイルを作ってみる

必要なもの

  1. JDK7
  2. android-sdk/build-toolsにあるdx.jar
  3. baksmali.jar

HelloWorld.java
public class HelloWorld {
    public static void main(String[] args) {
         System.out.println("Hello World!");
    }
}

以下のコマンドでHelloWorld.java→classes.dex→HelloWorld.smaliに変換します。
> javac -source 7 HelloWorld.java
> java -jar dx.jar --dex --output=classes.dex HelloWorld.class
> java -jar baksmali.jar classes.dex

HelloWorld.smali
.class public LHelloWorld;
.super Ljava/lang/Object;
.source "HelloWorld.java"

# direct methods
.method public constructor ()V
    .registers 1

    .prologue
    .line 1
    invoke-direct {p0}, Ljava/lang/Object;->()V

    return-void
.end method

.method public static main([Ljava/lang/String;)V
    .registers 3

    .prologue
    .line 3
    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;

    const-string v1, "Hello World!"

    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

    .line 4
    return-void
.end method

smaliファイルを編集する

アプリの動作を変更したい場合は Apktoolを使って展開した後にできるsmaliフォルダ内にあるファイルを編集します。
しかし、smaliファイルは機械語です。編集するには機械語を理解しないとできませんが、とても分かりづらいです。

smali機械語解説サイトhttp://pallergabor.uw.hu/androidblog/dalvik_opcodes.html(英語)

smali解読に使えそうなツール

以下の様なツールを使って見比べながら解読すると分かりやすいかもしれません。

smali2java
apkファイルを読み込んでjavaファイルを表示するツールです。
直接書き換えて保存することはできません。
http://forum.xda-developers.com/showthread.php?t=2430413

java2smali
作成したjavaプログラムを直接smaliにコンパイルできます。
IntelliJ IDEAというプログラミング補助ツールのプラグインです。
https://github.com/ollide/intellij-java2smali




0 件のコメント :