


Analyse kleiner komplexer Klassenbeispiele im Android-Reverse-Engineering
1.Java-Komplexklasse
Wenn Sie nichts verstehen, lesen Sie bitte: Allgemeine JAVA-Übersicht oder Konstruktionsmethode
Veröffentlichen Sie es hier. Der Code ist sehr einfach und nicht schwierig.
2.smali-Code
Wir müssen Java-Code in Smali-Code konvertieren, Sie können auf Java auf Smali verweisen
.method public constructor <init>(Ljava/lang/String;I)V</init>
.methodpublicconstructor<init>(Ljava/lang/String;I)v</init>
#🎜🎜 # 2.2.2 öffentlich
Änderungsmethode, öffentliches Eigentum
2.2.3 Konstruktor
Konstruktor bedeutet hier, dass diese Methode eine Konstruktormethode ist# 🎜🎜 #
2.2.4<init></init>
Nach der Kompilierung generiert Java die Variableninitialisierung der übergeordneten Klasse<init></init>
Java在编译之后会在字节码文件中生成
父类变量初始化
父类语句块
父类构造函数
子类变量初始化
子类语句块
子类构造函数
所谓收敛到
2.2.5 (Ljava/lang/String;I)
括号里的内容首先是 Ljava/lang/String,这里就是说第一个参数为String类型。;
后面有一个I就是说同样属于 Ljava/lang这里的有一个int型参数。
2.2.6 v
最后面有一个v的含义就是void。也就是没有返回值类型。
我们来看第二句的意思。
.registers 6
寄存器 6个。这里的寄存器就是从v0-v5开始。这个很好理解。
第三句话。
.prologue
开场,意思是程序的开始。
第四句话。
.line 10
第10行代码的意思。
第五句话是:
invoke-direct {p0}, Ljava/lang/Object;-><init>()V</init>
首先先分解这句话。
invoke-direct{p0}Ljava/lang/Object;-><init> () V</init>
invoke-direct
就是方法调用的意思。
{p0}
p0就是说第一个参数。但是这里并没有第一个参数,这里默认就是this,我们自己传进去的参数从p1开始计数。
Ljava/lang/Object;-><init></init>
调用<init></init>
方法
()里没有内容就是说没有参数。v相当于void,这里不再重复。
第六句话是
iput-object p1, p0, LPerson;->name:Ljava/lang/String;
分解一下
iput-object p1,p0LPerson;->name:Ljava/lang/String;
iput-object p1,p0的含义就是把p1的内容给p0。
LPerson;->name:Ljava/lang/String;
这句话的含义就是说把Person类里的一个名为name,类型为String的属性拿过来,这些是为了修饰p0。其实也就是this.name.
第七句话
iput p2, p0, LPerson;->age:I
这里也分解为两个部分。
iput p2, p0LPerson;->age:I
iput p2, p0
,这里就是把p2的值给p0
LPerson;->age:I
说明了age这个数据类型是int。
这里可能会发现调用两个属性不一样,这里就是因为String并不是一个基本数据类型。所以使用了iput-object,如果是基本数据类型为iput。
第八句话
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
分解
sget-object v0 Ljava/lang/System;->out: Ljava/io/PrintStream;
sget-object v0 就是获取到后见面的东西给v0。
Ljava/io/PrintStream;
这个的含义就是说由这个类里的一个Ljava/lang/System;->out:
这个方法。
第九句话
new-instance v1, Ljava/lang/StringBuilder;
新建一个StringBuilder的类给v1。
第十句话
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V</init>
和之前的类似,从构造方法里调用v1。
第十一句话
const-string v2, "name:"
const-string 常量字符串。 v2,内容是name:
第十二句话
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
分解一下就是
invoke-virtual {v1, v2}Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v1, v2} 调用虚方法,->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
li>
Konstruktor der übergeordneten Klasse
Variableninitialisierung der Unterklasse
;
Dahinter steht ein I, was bedeutet, dass es auch zu Ljava/lang gehört und es hier einen Parameter vom Typ int gibt. #🎜🎜##🎜🎜#2.2.6 v#🎜🎜##🎜🎜#Die Bedeutung eines v am Ende ist ungültig. Das heißt, es gibt keinen Rückgabewerttyp. #🎜🎜##🎜🎜##🎜🎜# Schauen wir uns die Bedeutung des zweiten Satzes an. #🎜🎜#move-result-object v1
.method public constructor <init>()V .registers 1 invoke-direct {p0}, Ljava/lang/Object;-><init>()V return-void .end method</init></init>
public class Demo{ public static void main(String[]args) { Person p=new Person("zhuzhu",14); } }
javac -source 1.6 -target 1.6 *.java
dx --dex --output=demo.dex *.class
.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;
const-string v1, "zhuzhu"
<init></init>
-Methode #🎜🎜##🎜🎜#() hat keinen Inhalt, was bedeutet, dass es keine Parameter gibt. v entspricht void und wird hier nicht wiederholt. #🎜🎜##🎜🎜##🎜🎜#Der sechste Satz ist #🎜🎜#const/16 v2, 0xe
invoke-direct {v0, v1, v2}, LPerson;-><init>(Ljava/lang/String;I)V</init>
.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>
iput p2, p0
, hier wird der Wert von p2 an p0 übergeben#🎜🎜#rrreee#🎜🎜#Es zeigt, dass der Datentyp des Alters int ist . #🎜🎜##🎜🎜#Sie werden möglicherweise feststellen, dass der Aufruf der beiden Eigenschaften unterschiedlich ist. Dies liegt daran, dass String kein grundlegender Datentyp ist. Daher wird iput-object verwendet, wenn der Basisdatentyp iput ist. #🎜🎜##🎜🎜##🎜🎜#Der achte Satz#🎜🎜#rrreee#🎜🎜#Decomposition#🎜🎜#rrreee#🎜🎜#sget-object v0 besteht darin, v0 die Dinge zu geben, denen Sie begegnen, nachdem Sie es erhalten haben. #🎜🎜##🎜🎜#Ljava/io/PrintStream;
Die Bedeutung davon ist, dass ein Ljava/lang/System;->out:
Diese Methode. #🎜🎜##🎜🎜##🎜🎜#Der neunte Satz #🎜🎜#rrreee#🎜🎜#Erstellen Sie eine neue StringBuilder-Klasse für v1. #🎜🎜##🎜🎜##🎜🎜#Der zehnte Satz #🎜🎜#rrreee#🎜🎜# ähnelt dem vorherigen und ruft v1 vom Konstruktor auf. #🎜🎜##🎜🎜##🎜🎜#Der elfte Satz#🎜🎜#rrreee#🎜🎜#const-string konstante Zeichenfolge. v2, der Inhalt ist Name: #🎜🎜##🎜🎜##🎜🎜#Der zwölfte Satz #🎜🎜#rrreee#🎜🎜#Aufgeschlüsselt ist er #🎜🎜#rrreee#🎜🎜#invoke-virtual {v1, v2} Rufen Sie eine virtuelle Methode auf, #🎜🎜#->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
Rufen Sie eine Methode namens append auf, der Parameter ist vom Typ String und die Der Rückgabewert ist vom Typ StringBuilder. #🎜🎜##🎜🎜##🎜🎜#Der dreizehnte Satz#🎜🎜#rrreee#🎜🎜#besteht darin, das Ergebnis des vorherigen Satzes an das v1-Register zu übergeben. #🎜🎜#之后的内容就是相似的了。
有兴趣可以自己继续向下分析。
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文件进行查看。
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文件。
我们来主要看看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 小练习(甜点)
首先来看看我们写的程序。
然后是手写的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>
Das obige ist der detaillierte Inhalt vonAnalyse kleiner komplexer Klassenbeispiele im Android-Reverse-Engineering. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



In den letzten Tagen hat Ice Universe immer wieder Details zum Galaxy S25 Ultra enthüllt, von dem allgemein angenommen wird, dass es das nächste Flaggschiff-Smartphone von Samsung ist. Der Leaker behauptete unter anderem, Samsung plane nur ein Kamera-Upgrade

OnLeaks hat sich nun mit Android Headlines zusammengetan, um einen ersten Blick auf das Galaxy S25 Ultra zu werfen, nur wenige Tage nach dem gescheiterten Versuch, mehr als 4.000 US-Dollar von seinen X-Followern (ehemals Twitter) zu generieren. Für den Kontext sind die unten eingebetteten Renderbilder h

Neben der Ankündigung zweier neuer Smartphones hat TCL auch ein neues Android-Tablet namens NXTPAPER 14 angekündigt, dessen riesige Bildschirmgröße eines seiner Verkaufsargumente ist. Das NXTPAPER 14 verfügt über Version 3.0 der matten LCD-Panels der Signaturmarke von TCL

Das Vivo Y300 Pro wurde gerade vollständig vorgestellt und ist eines der schlanksten Mittelklasse-Android-Telefone mit einem großen Akku. Genauer gesagt ist das Smartphone nur 7,69 mm dick, verfügt aber über einen 6.500 mAh starken Akku. Dies ist die gleiche Kapazität wie bei der kürzlich eingeführten Version

Samsung hat noch keine Hinweise darauf gegeben, wann es seine Smartphone-Serie Fan Edition (FE) aktualisieren wird. Derzeit ist das Galaxy S23 FE nach wie vor die jüngste Ausgabe des Unternehmens und wurde Anfang Oktober 2023 vorgestellt

In den letzten Tagen hat Ice Universe immer wieder Details zum Galaxy S25 Ultra enthüllt, von dem allgemein angenommen wird, dass es das nächste Flaggschiff-Smartphone von Samsung ist. Der Leaker behauptete unter anderem, Samsung plane nur ein Kamera-Upgrade

Das Redmi Note 14 Pro Plus ist nun offiziell als direkter Nachfolger des letztjährigen Redmi Note 13 Pro Plus (aktuell 375 $ bei Amazon) erhältlich. Wie erwartet steht das Redmi Note 14 Pro Plus neben dem Redmi Note 14 und dem Redmi Note 14 Pro an der Spitze der Redmi Note 14-Serie. Li

Die Schwestermarke von OnePlus, iQOO, hat einen Produktzyklus von 2023 bis 2024, der möglicherweise fast abgeschlossen ist. Dennoch hat die Marke erklärt, dass sie mit ihrer Z9-Serie noch nicht fertig sei. Seine letzte und möglicherweise hochwertigste Turbo+-Variante wurde gerade wie vorhergesagt angekündigt. T
