*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
Sudah mulai pusing? hehe sama saya juga.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
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
- invoke-super vx, vy, … invokes the parent classes method in object vx, passing in parameter(s) vy, …
- new-instance vx creates a new object instance and places its reference in vx
- invoke-direct vx, vy, … invokes a method in object vx with parameters vy, … without the virtual method resolution
- const-string vx creates string constant and passes reference into vx
- invoke-virtual vx, vy, … invokes the virtual method in object vx, passing in parameters vy, …
- 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 methodLine 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 sepertiSignApk 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
2 komentar
Write komentargan kalo buat toast untuk aplikasi yg uda di mod apa harus buat key nya lagi??
Replygak perlu om
ReplyEmoticonEmoticon