Rumah  >  Artikel  >  Operasi dan penyelenggaraan  >  Analisis contoh kelas kompleks smali dalam kejuruteraan songsang Android

Analisis contoh kelas kompleks smali dalam kejuruteraan songsang Android

WBOY
WBOYke hadapan
2023-05-12 16:22:131538semak imbas

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>

Ayat ini terbahagi kepada

.methodpublicconstructor<init>(Ljava/lang/String;I)v</init>
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

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>
rrree

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>

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>

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.

之后的内容就是相似的了。
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>

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

编译成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);
    }
}

代码很简单。

2.smali代码

这里我们要使用

javac -source 1.6 -target 1.6 *.java

编译所有.java文件

然后使用

dx --dex --output=demo.dex *.class

把所有的.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>
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当做参数传进去。

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

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>

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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:Analisis Contoh Cermin EVE-NGArtikel seterusnya:Analisis Contoh Cermin EVE-NG