Analisis contoh kelas kompleks smali dalam kejuruteraan songsang Android

WBOY
Lepaskan: 2023-05-12 16:22:13
ke hadapan
1582 orang telah melayarinya

Kelas kompleks 1.java

Jika anda tidak faham apa-apa, sila lihat: Rangka Umum JAVA atau Kaedah Pembinaan
Analisis contoh kelas kompleks smali dalam kejuruteraan songsang Android

Siarkan kod di sini, ia adalah sangat mudah dan tidak sukar.

2.kod smali

Kami perlu menukar kod java kepada kod smali, anda boleh merujuk java kepada smali

Analisis contoh kelas kompleks smali dalam kejuruteraan songsang Android

Analisis contoh kelas kompleks smali dalam kejuruteraan songsang Android

Mari lihat dalam modul.

2.1 Modul pertama - modul maklumat


Analisis contoh kelas kompleks smali dalam kejuruteraan songsang Android

Modul ini ialah maklumat asas, yang menerangkan nama kelas, dsb., hanya tahu ia Baik tidak banyak membantu dengan analisis.

2.2 Modul kedua - kaedah pembinaan


Analisis contoh kelas kompleks smali dalam kejuruteraan songsang Android

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>
Salin selepas log masuk

Ayat ini terbahagi kepada

.methodpublicconstructor<init>(Ljava/lang/String;I)v</init>
Salin selepas log masuk
2.2.1 .kaedah

bermaksud kaedah

2.2.2 awam

Kaedah pengubahsuaian, sifat awam

2.2.3 pembina

Pembina di sini bermaksud kaedah ini ialah kaedah pembina

2.2.4 <init></init>

Selepas Java disusun, ia akan menjana kaedah dalam fail bytecode, yang dipanggil pembina instance ini akan menyatukan blok pernyataan, pemula pembolehubah, memanggil pembina kelas induk dan operasi lain untuk < In. kaedah ;init>, tertib penumpuan (hanya pembolehubah bukan statik dan blok pernyataan dibincangkan di sini) ialah:

  1. Inisialisasi pembolehubah kelas induk

  2. Blok penyata Kelas Induk

  3. Pembina kelas induk

  4. Inisialisasi pembolehubah subkelas

  5. Pernyataan subkelas Sekat

  6. Pembina subkelas

Apa yang dipanggil penumpuan ke dalam kaedah untuk melaksanakan

2.2.5 (Ljava/lang/String;I)

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.

2.2.6 v

Ada v di hujung yang bermaksud batal. Iaitu, tiada jenis nilai pulangan.


Mari kita lihat maksud ayat kedua.

.registers 6
Salin selepas log masuk

Daftar 6. Daftar di sini bermula dari v0-v5. Ini mudah difahami.


Ayat ketiga.

.prologue
Salin selepas log masuk

Pembukaan bermaksud permulaan program.


Ayat keempat.

.line 10
Salin selepas log masuk

Maksud baris ke-10 kod.


Ayat kelima ialah:

invoke-direct {p0}, Ljava/lang/Object;-><init>()V</init>
Salin selepas log masuk

Pertama, mari kita pecahkan ayat ini.

invoke-direct{p0}Ljava/lang/Object;-><init>
()
V</init>
Salin selepas log masuk
rrree

bermaksud panggilan kaedah.

invoke-direct
Salin selepas log masuk

p0 ialah parameter pertama. Tetapi tiada parameter pertama di sini. Parameter yang kami lalui mula mengira dari p1.

{p0}
Salin selepas log masuk

memanggil kaedah <init></init>

Tiada kandungan dalam

(), yang bermaksud tiada parameter. v adalah bersamaan dengan batal dan tidak akan diulang di sini.


Ayat keenam ialah

Ljava/lang/Object;-><init></init>
Salin selepas log masuk

Pecahkan

iput-object p1, p0, LPerson;->name:Ljava/lang/String;
Salin selepas log masuk

iput-objek p1, p0 bermaksud memberikan isi p1 kepada p0.

iput-object p1,p0LPerson;->name:Ljava/lang/String;
Salin selepas log masuk

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;
Salin selepas log masuk

juga dipecahkan kepada dua bahagian.

iput p2, p0, LPerson;->age:I
Salin selepas log masuk

iput p2, p0, di sini adalah untuk memberikan nilai p2 kepada p0

iput p2, p0LPerson;->age:I
Salin selepas log masuk

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
Salin selepas log masuk

Penguraian

 sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
Salin selepas log masuk

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;
Salin selepas log masuk

Buat kelas StringBuilder baharu untuk v1.


Ayat kesepuluh

new-instance v1, Ljava/lang/StringBuilder;
Salin selepas log masuk

adalah serupa dengan yang sebelumnya, memanggil v1 daripada pembina.


Ayat kesebelas

invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V</init>
Salin selepas log masuk

rentetan tetap rentetan konst. v2, kandungannya ialah nama:


Ayat kedua belas

const-string v2, "name:"
Salin selepas log masuk

Dipecahkan ialah

 invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
Salin selepas log masuk

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;
Salin selepas log masuk

adalah untuk memberikan hasil ayat sebelumnya kepada daftar v1.

之后的内容就是相似的了。
Analisis contoh kelas kompleks smali dalam kejuruteraan songsang Android

有兴趣可以自己继续向下分析。

2.3 方法模块

这个模块在之前的一篇文章里已经说过了,这里就不再啰嗦了。

2.4 练习

这个练习我们就自己添加一个构造方法。

.method public constructor <init>()V    .registers 1
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
    return-void
.end method</init></init>
Salin selepas log masuk

这个是我们自己写的一个构造方法。无参无返回值。

编译成jar文件进行查看。


Analisis contoh kelas kompleks smali dalam kejuruteraan songsang Android

0x02 smali类相互调用

1. java代码

在0x01的前提上我们再写一个调用demo。

public class Demo{
    public static void main(String[]args)    {
        Person p=new Person("zhuzhu",14);
    }
}
Salin selepas log masuk

代码很简单。

2.smali代码

这里我们要使用

javac -source 1.6 -target 1.6 *.java
Salin selepas log masuk

编译所有.java文件

然后使用

dx --dex --output=demo.dex *.class
Salin selepas log masuk

把所有的.class文件编译成dex文件。


Analisis contoh kelas kompleks smali dalam kejuruteraan songsang Android

我们来主要看看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>
Salin selepas log masuk
new-instance v0, LPerson;
Salin selepas log masuk

新建一个类,v0

const-string v1, "zhuzhu"
Salin selepas log masuk

然后定义一个常量 v1。

const/16 v2, 0xe
Salin selepas log masuk

定义一个16位的常量

invoke-direct {v0, v1, v2}, LPerson;-><init>(Ljava/lang/String;I)V</init>
Salin selepas log masuk

调用Person类的构造方法,然后把v0,v1,v2当做参数传进去。

其实类之前的交互调用其实并不难。

3.总结

我们调用其他类的时候。

1.new-instance 实例化一个对象
2.invoke-direct 调用构造方法

0x03 小练习(甜点)

首先来看看我们写的程序。

Analisis contoh kelas kompleks smali dalam kejuruteraan songsang Android

然后是手写的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>
Salin selepas log masuk

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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan