Jika anda tidak faham apa-apa, sila lihat: Rangka Umum JAVA atau Kaedah Pembinaan
Siarkan kod di sini, ia adalah sangat mudah dan tidak sukar.
Kami perlu menukar kod java kepada kod smali, anda boleh merujuk java kepada smali
Mari lihat dalam modul.
Modul ini ialah maklumat asas, yang menerangkan nama kelas, dsb., hanya tahu ia Baik tidak banyak membantu dengan analisis.
Mari kita analisa ayat demi ayat Jika terdapat pendua dalam analisis sebelum ini, kita tidak akan ulangi mereka. Tetapi pautan akan diberikan.
.method public constructor <init>(Ljava/lang/String;I)V</init>
Ayat ini terbahagi kepada
.methodpublicconstructor<init>(Ljava/lang/String;I)v</init>
bermaksud kaedah
Kaedah pengubahsuaian, sifat awam
Pembina di sini bermaksud kaedah ini ialah kaedah pembina
<init></init>
Selepas Java disusun, ia akan menjana kaedah
Inisialisasi pembolehubah kelas induk
Blok penyata Kelas Induk
Pembina kelas induk
Inisialisasi pembolehubah subkelas
Pernyataan subkelas Sekat
Pembina subkelas
Apa yang dipanggil penumpuan ke dalam kaedah
Kandungan dalam kurungan ialah Ljava/lang/String yang pertama, yang bermaksud parameter pertama ialah jenis String. ;
Terdapat I di penghujungnya, yang bermaksud ia juga milik Ljava/lang dan terdapat parameter jenis int di sini.
Ada v di hujung yang bermaksud batal. Iaitu, tiada jenis nilai pulangan.
Mari kita lihat maksud ayat kedua.
.registers 6
Daftar 6. Daftar di sini bermula dari v0-v5. Ini mudah difahami.
Ayat ketiga.
.prologue
Pembukaan bermaksud permulaan program.
Ayat keempat.
.line 10
Maksud baris ke-10 kod.
Ayat kelima ialah:
invoke-direct {p0}, Ljava/lang/Object;-><init>()V</init>
Pertama, mari kita pecahkan ayat ini.
invoke-direct{p0}Ljava/lang/Object;-><init> () V</init>
bermaksud panggilan kaedah.
invoke-direct
p0 ialah parameter pertama. Tetapi tiada parameter pertama di sini. Parameter yang kami lalui mula mengira dari p1.
{p0}
memanggil kaedah <init></init>
(), yang bermaksud tiada parameter. v adalah bersamaan dengan batal dan tidak akan diulang di sini.
Ayat keenam ialah
Ljava/lang/Object;-><init></init>
Pecahkan
iput-object p1, p0, LPerson;->name:Ljava/lang/String;
iput-objek p1, p0 bermaksud memberikan isi p1 kepada p0.
iput-object p1,p0LPerson;->name:Ljava/lang/String;
Maksud ayat ini ialah mengambil atribut bernama nama dan taip String daripada kelas Person Ini adalah untuk mengubah suai p0. Sebenarnya, ini.nama.
Ayat ketujuh
LPerson;->name:Ljava/lang/String;
juga dipecahkan kepada dua bahagian.
iput p2, p0, LPerson;->age:I
iput p2, p0
, di sini adalah untuk memberikan nilai p2 kepada p0
iput p2, p0LPerson;->age:I
menunjukkan bahawa jenis data umur adalah int.
Anda mungkin mendapati bahawa memanggil kedua-dua sifat adalah berbeza di sini kerana String bukan jenis data asas. Jadi objek-iput digunakan, jika jenis data asas ialah iput.
Ayat kelapan
LPerson;->age:I
Penguraian
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
sget-objek v0 ialah memberikan v0 perkara yang anda temui selepas mendapatnya.
Ljava/io/PrintStream;
bermakna terdapat kaedah Ljava/lang/System;->out:
dalam kelas ini.
Ayat kesembilan
sget-object v0 Ljava/lang/System;->out: Ljava/io/PrintStream;
Buat kelas StringBuilder baharu untuk v1.
Ayat kesepuluh
new-instance v1, Ljava/lang/StringBuilder;
adalah serupa dengan yang sebelumnya, memanggil v1 daripada pembina.
Ayat kesebelas
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V</init>
rentetan tetap rentetan konst. v2, kandungannya ialah nama:
Ayat kedua belas
const-string v2, "name:"
Dipecahkan ialah
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v1, v2} memanggil kaedah maya, ->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
Panggil fungsi yang dipanggil append, parameter ialah jenis String dan nilai pulangan ialah jenis StringBuilder.
Ayat ketiga belas
invoke-virtual {v1, v2}Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
adalah untuk memberikan hasil ayat sebelumnya kepada daftar v1.
之后的内容就是相似的了。
有兴趣可以自己继续向下分析。
这个模块在之前的一篇文章里已经说过了,这里就不再啰嗦了。
这个练习我们就自己添加一个构造方法。
.method public constructor <init>()V .registers 1 invoke-direct {p0}, Ljava/lang/Object;-><init>()V return-void .end method</init></init>
这个是我们自己写的一个构造方法。无参无返回值。
编译成jar文件进行查看。
在0x01的前提上我们再写一个调用demo。
public class Demo{ public static void main(String[]args) { Person p=new Person("zhuzhu",14); } }
代码很简单。
这里我们要使用
javac -source 1.6 -target 1.6 *.java
编译所有.java文件
然后使用
dx --dex --output=demo.dex *.class
把所有的.class文件编译成dex文件。
我们来主要看看main函数。
.method public static main([Ljava/lang/String;)V .registers 4 .prologue .line 4 new-instance v0, LPerson; const-string v1, "zhuzhu" const/16 v2, 0xe invoke-direct {v0, v1, v2}, LPerson;-><init>(Ljava/lang/String;I)V .line 5 return-void.end method</init>
new-instance v0, LPerson;
新建一个类,v0
const-string v1, "zhuzhu"
然后定义一个常量 v1。
const/16 v2, 0xe
定义一个16位的常量
invoke-direct {v0, v1, v2}, LPerson;-><init>(Ljava/lang/String;I)V</init>
调用Person类的构造方法,然后把v0,v1,v2当做参数传进去。
其实类之前的交互调用其实并不难。
我们调用其他类的时候。
1.new-instance 实例化一个对象
2.invoke-direct 调用构造方法
首先来看看我们写的程序。
然后是手写的smali代码。
.class public LPd; .super Ljava/lang/Object; .source "Pd.java"# direct methods .method public constructor <init>()V .registers 1 .prologue invoke-direct {p0}, Ljava/lang/Object;-><init>()V return-void.end method .method public static main([Ljava/lang/String;)V .registers 4 .prologue new-instance v0,LPerson; invoke-direct {v0}, LPerson;-><init>()V return-void.end method</init></init></init>
Atas ialah kandungan terperinci Analisis contoh kelas kompleks smali dalam kejuruteraan songsang Android. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!