Reverse Engineering Android: Membuka "Hello World"

Jujur, Admin emang masih newbie banget dengan Reverse Engineering Android. bisa dibilang beginner dalam hal Mobile Programming/Android.

*Beginner artinya mengerti sedikit tentang Android dan Java karena kebetulan admin juga kuliah dengan jurusan yang berhubungan dengan ini. 
Jika kalian tidak mengerti sedikitpun tentang Java, klik disini untuk mulai belajar membuat program sederhana dengan Android Studio. Pengalaman kalian dalam bidang programming juga begitu penting! kembali lagi jika kalian sudah sedikit mengerti.


Alat :

Tutorial : 

  •  Simpan apktool.jar didalam satu folder dengan alat-alat lainnya
  •  Shift+klik kanan didalam folder tersebut dan klik "Open Cmd Here"
  •  Ketikan command 
java -jar apktool.jar d HelloWorld.apk -o /folderoutput/

  • d = decompile
  • -o = output  
  • folderoutput = nama folder output (ubah sesuka kalian)
  • Setelah apk di decompile maka akan keluar beberapa file didalam folder output

- AndroidManifest.xml (decoded, human readable)
- res/ (decoded)
- smali/
- apktool.yml
 
R.java adalah generated file ketika aplikasi di buat untuk resources map dan id. ketika developer ingin menggunakan sebuah resources makan harus menggunakan referensi / id dari file "R"

HelloWorldActivity.smali

package com.test.helloworld;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class HelloWorldActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        TextView text = new TextView(this);
        text.setText("Hello World, Android");
        setContentView(text);
    }
}
.class public Lcom/test/helloworld/HelloWorldActivity;
.super Landroid/app/Activity;
.source "HelloWorldActivity.java"

# direct methods
.method public constructor ()V
    .locals 0

    .prologue
    .line 7
    invoke-direct {p0}, Landroid/app/Activity;->()V

    return-void
.end method

# virtual methods
.method public onCreate(Landroid/os/Bundle;)V
    .locals 2
    .parameter "savedInstanceState"

    .prologue
    .line 11
    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V

    .line 13
    new-instance v0, Landroid/widget/TextView;

    invoke-direct {v0, p0}, Landroid/widget/TextView;->(Landroid/content/Context;)V

    .line 14
    .local v0, text:Landroid/widget/TextView;
    const-string v1, "Hello World, Android"

    invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V

    .line 15
    invoke-virtual {p0, v0}, Lcom/test/helloworld/HelloWorldActivity;->setContentView(Landroid/view/View;)V

    .line 17
    return-void
.end method
Sudah mulai pusing? hehe sama saya juga.

Penjelasan Tipe Data

V void
Z boolean 
B byte 
S short 
C char 
I int 
J long (64 bits) 
F float
 D double (64 bits)

Register

Pindah satu baris ke bawah, pada baris 20 kita melihat direktif '.locals'.
Ini menentukan berapa banyak register Dalvik VM akan digunakan untuk metode.
Selain itu, jumlah parameter untuk setiap metode virtual akan selalu menjadi jumlah parameter input + 1.

Hal ini disebabkan implisit merujuk objek saat yang berada di parameter daftar 0 atau p0
 (dalam java ini disebut "this" referensi).

 Register pada dasarnya adalah referensi, dan dapat menunjukkan kedua jenis data primitif dan objek java.

Mengingat 2 register lokal, 1 parameter register, dan 1 "this" referensi, metode onCreate () menggunakan efektif 4 register.

Untuk kenyamanan, smali menggunakan 'v' dan 'p' konvensi penamaan untuk register parameter vs lokal. Pada dasarnya, parameter (p) register dapat diwakili oleh (v) register lokal dan akan selalu berada di register tertinggi yang tersedia. Untuk contoh ini, onCreate () memiliki 2 register lokal dan 2 register parameter, sehingga skema penamaan akan terlihat seperti ini:
v0 - lokal 0
v1 - lokal 1
v2 / p0 - lokal 2 atau parameter 0 (ini)
v3 / p1 - lokal 3 atau parameter 1 (android / os / Bundle)
Catatan: Anda dapat melihat .registers direktif sebagai menentang ke .locals direktif. Satu-satunya perbedaan adalah bahwa .registers direktif meliputi parameter register (termasuk "ini") ke menghitung. Mengingat onCreate () misalnya, .locals 2 == .registers 4
PERCAYALAH ADMIN JUGA KURANG MENGERTI DENGAN PENJELASAN DIATAS


Opcodes

  1. invoke-super vx, vy, … invokes the parent classes method in object vx, passing in parameter(s) vy, …
  2. new-instance vx creates a new object instance and places its reference in vx
  3. invoke-direct vx, vy, … invokes a method in object vx with parameters vy, … without the virtual method resolution
  4. const-string vx creates string constant and passes reference into vx
  5. invoke-virtual vx, vy, … invokes the virtual method in object vx, passing in parameters vy, …
  6. return-void returns void

Hacking the App

Sekarang kita mencoba inject sebuah toast dengan tulisan “hacked!”.

didalam java code untuk menampilan toast adalah seperti ini...
Toast.makeText(getApplicationContext(), "Hacked!", Toast.LENGTH_SHORT).show();

Terus gimana caranya kita bikin di smali? 
bisa juga kita buat aplikasi dengan toast tersebut dan decompile aplikasi tsb untuk mengambil smali code dari method tsb.

Maka kodenya akan terlihat seperti ini

 .line 18  
invoke-virtual {p0}, Lcom/test/helloworld/HelloWorldActivity;->getApplicationContext()Landroid/content/Context;

 move-result-object v1
 const-string v2, "Hacked!"
 const/4 v3, 0x0
 invoke-static {v1, v2, v3}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; 
 move-result-object v1
 invoke-virtual {v1}, Landroid/widget/Toast;->show()V


Sekarang, mari kita pastikan kita memiliki jumlah yang tepat dari register di OnCreate() untuk mendukung metode panggilan ini.

dan jika di inject kedalam HelloWorldActivity.smali akan jadi seperti ini
.class public Lcom/test/helloworld/HelloWorldActivity;
.super Landroid/app/Activity;
.source "HelloWorldActivity.java"

# direct methods
.method public constructor ()V
    .locals 0

    .prologue
    .line 8
    invoke-direct {p0}, Landroid/app/Activity;->()V

    return-void
.end method

# virtual methods
.method public onCreate(Landroid/os/Bundle;)V
    .locals 2
    .parameter "savedInstanceState"

    .prologue
    .line 12
    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V

    .line 14
    new-instance v0, Landroid/widget/TextView;

    invoke-direct {v0, p0}, Landroid/widget/TextView;->(Landroid/content/Context;)V

    .line 15
    .local v0, text:Landroid/widget/TextView;
    const-string v1, "Hello World, Android"

    invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V

    .line 16
    invoke-virtual {p0, v0}, Lcom/test/helloworld/HelloWorldActivity;->setContentView(Landroid/view/View;)V

    # Injek Code START

    invoke-virtual {p0}, Lcom/test/helloworld/HelloWorldActivity;->getApplicationContext()Landroid/content/Context;

    move-result-object v1

    const-string v2, "Hacked!"

    const/4 v3, 0x0

    invoke-static {v1, v2, v3}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

    move-result-object v1

    invoke-virtual {v1}, Landroid/widget/Toast;->show()V

    # INJEK KODE End

    return-void
.end method
Line 40 adalah kode yang telah di inject


Build APK

  • Masukan command seperti ini di Cmd/command prompt
java -jar apktool.jar b folderoutput -o HelloWorldModded.apk

  •  Perintah/Command tersebut akan build smali yang telah kita edit kembali menjadi APK. Tetapi setelah apk telah ter-build. APK Tersebut belum ter-Sign.
  • Maka kita harus Sign apk terlebih dahulu agar bisa di Install
  • Jika kalian tidak ingin Signing apk, maka bisa dengan Lucky Patcher untuk bypass Application Signature 

Signing the APK

Untuk Sign apk kalian butuh jarsigner dan keytool atau alternative lainnya seperti
 SignApk for Windows by Londatiga 

Tutorial menggunakan jarsigner dan keytool
pertama kalian harus membuat key dengan command 
 keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -validity 1000 


Dan gunakan jarsigner untuk Signing apk kalian dengan keystore yang telah kalian buat

 jarsigner -verbose -keystore my-release-key.keystore ./HelloWorld/dist/HelloWorldModded.apk alias_name


Selesai! dan silahkan coba install apk tersebut di Android device kalian



Selamat mencoba!

Tutorial by David Teitelbaum - APKUDO
Previous
Next Post »

2 komentar

Write komentar
Unknown
AUTHOR
January 31, 2017 at 9:23 PM delete

gan kalo buat toast untuk aplikasi yg uda di mod apa harus buat key nya lagi??

Reply
avatar