Lembar contekan Rusia oleh Smali
Salam, pecinta rekayasa balik Android. Ini adalah lembar contekan untuk Smali, analog assembler untuk aplikasi Android.

Teks asli dalam bahasa Rusia diambil dari sini . Di sana, teks muncul dari terjemahan mesin dokumentasi resmi .
Akibatnya, ia mendesain teks kering + kesalahan ketik kecil yang diperbaiki dan terjemahan yang canggung. Mengenai komentar dan saran, Anda dapat menulis kepada saya di LAN atau mengeluarkan PR tentang Gist .
Jenis
- Dalvik : . โ , .
:
V - Void -
Z - Boolean ()
B - Byte ()
S - Short ()
C - Char
I - Integer ( )
J - Long (64 bits) ()
F - Float ()
D - Double (64 bits) ( )
Lpackage/name/ObjectName;
โ L
, , package/name/
โ , , ObjectName
โ ;
.
package.name.ObjectName
java. , , Ljava/lang/String;
java.lang.String
[I
โ . .. int[]
Java. [
. [[I = int[][]
, [[[I = int[][][]
.. (: , , 255).
, [Ljava/lang/String;
.
(Methods)
, , , , . , -
Lpackage/name/ObjectName;->MethodName(III)Z
Lpackage/name/ObjectName;
. MethodName
โ . (III)Z
. III
โ ( 3 ), Z
โ (bool).
, .
:
Lpackage/name/ObjectName;->MethodName(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
Java,
String MethodName(int, int[][], int, String, Object[])
(Fields)
, , , . , , -.
Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;
โ ,
(Register)
- dalvik 32 . 2 64- ( โ Long โ Double).
, :
.registers
, .locals
. , .
:
, n
. 2 5 (v0-v4), 2 โ v3
v4
.
(non-static methods
) , (this
)
, , LMyObject;->callMe(II)V
. 2 (integer
) , LMyObject;
, 3 .
, , (v0-v4) 5 , .registers 5
, .locals 2
(.. 2 local registers + 3 parameter registers). , , (.. this
), v2, (integer
) v3, (integer
) v4.
(static methods
) , , .
(Register names)
โ v#
p#
. p#
.
, 3- 5- . v#
, p#
(parameter registers
)
โ .
(parameter registers
)
p#
, , , , . : ยซ , , .registers
!ยป.
, . , . โ , . .registers
.
p#
, , .
Long/Double
, long double (J
D
) 64- 2 . , . , , ( โ non-static
) LMyObject;->MyMethod(IJZ)V
. LMyObject;,int,long,bool
. , 5 :
p0 this
p1 I
p2, p3 J
p4 Z
, , invoke.
Array ()
array-length vA, vB
A
: (4 )B
: reference-bearing (4 )
( ) vB
vA
fill-array-data vA+, :target
vA+
(target
). , . .
vX
vX+1
. , v1
, v2
.
:
:target
.array-data 0x2
0x01 0x02
0x03 0x04
.end array-data
new-array vA+, vB, Lclass;->type
. .
filled-new-array { vA [ vB, v.., vX ]}, Lclass;->type
. . move-result-object
, fill-new-array
.
filled-new-array/range { vA .. vX }, Lclass;->type
vA .. vX
: , ( 4 )B
: (16 )
. . move-result-object
, fill-new-array/range
.
Array Accessors ( )
:
aget vA, vB, vC
(integer
) vC
, vB
, vA
aput vA, vB, vC
(integer
) vA
, vB
vC
aget/aput
, :
- boolean
- byte
- char
- object
- short
- wide
: aget-objec
( (object
))
:
A
:B
:C
:B+
: (pair)C+
: (pair)
cmp-long vA, vB+, vC+
(long) , 0
vB+ == vC+
1;vB+ < vC+
vB+ > vC+
-1.
cmpg-double vA, vB+, vC+
(double) , 0
vB+ == vC+
1;vB+ < vC+
vB+ > vC+
-1.vB+
vC+
, 1.
cmpg-float vA, vB, vC
(float) , 0;
vB == vC
1;vB < vC
vB > vC
-1.vB
vC
, 1.
cmpl-double vA, vB+, vC+
double , 0;
vB+ == vC+
1;vB+ < vC+
vB+ > vC+
-1.vB+
, vC+
, -1.
cmpl-float vA, vB, vC
โ (float) , 0;
vB == vC
1;vB < vC
vB > vC
-1.vB
vC
, -1.
const vAA, #+BBBBBBBB
(integer
) vAA
.
const/16 vAA, #+BBBB
A
: (8 )B
: (integer) (16 )
#+BBBB
vAA
const/4 vA, #+B
4- vA
.
const/high16 vAA, #+BBBB
16- vAA
. float
.
const-class vAA, Lclass
(class
), vAA
. , , .
const-string vAA, "BBBB"
, vAA
const-string/jumbo vAA, "BBBBBBBB"
, vAA
jumbo
โ , ""
:
const-wide/16 vA+, #+BBBB
const-wide/high16 vA+, #+BBBB
const-wide vA+, #+BBBBBBBBBBBBBBBB
Go To
goto โ :target.
goto :target
goto/16 :target #16bit
goto/32 :target #32bit
: goto
ยฑ . APKTool . , 16- , goto/16
, 32- , goto/32
. , goto/16
goto/32
( ). , goto/16
goto, goto/32
goto/16
goto
.
: goto goto/16, goto/32.
if โ ,
:
A
: (integer)B
: (integer)target
:
: !=
โ
:
Invoke
:
vA-vX
: ,class
: ,method
:R
: .
(non-static
) direct ( , , private instance
, ):
invoke-direct { vA, v.., vX }, Lclass;->method()R
(interface method
) ( , , , ):
invoke-interface { vA, v.., vX }, Lclass;->method()R
(static method
) ( ):
invoke-static { vA, v.., vX }, Lclass;->method()R
(virtual method
) :
invoke-super { vA, v.., vX }, Lclass;->method()R
(virtual method
) (, , ):
invoke-virtual { vA, v.., vX }, Lclass;->method()R
:
(R
ยซV
ยป Void), move-result
.
- vA-vX
, (Range of arguments) /range
. :
invoke-direct/range { vA .. vX }, Lclass;->method()R
invoke:
invoke-direct { v1, v2, v3 }
invoke-direct/range { v1 .. v3 }
invoke-direct { v0 }
invoke-direct/range { v0 .. v0 }
invoke-virtual{ vX }
invoke-virtual/range{ vX .. vX }
(v1, v2, v22)
check-cast vAA, Lclass
, vAA
, .
ClassCastException
, , .
instance-of vA, vB, Lclass
A
: (4 bits)B
: (4 bits)C
: (16 bits)
new-instance vAA, Lclass
vAA
.
non-array
.
nop
/
throw vAA
. (object) vAA
.
A
: Exception-bearing register (8 bits)
Move
:
A
: (4, 8, 16 bits)B
: (4, 16 bits)
: A: x bits. B: x bits .
move vA, vB
A: 4 bits. B: 4 bits
- (non-object) .
move/16 vAAAA, vBBBB
A: 16 bits. B: 16 bits
, move
. 16 bits
move/from16 vAA, vBBBB
A: 8 bits. B: 16 bits
, move/16
. 8 bits
move-exception vAA
A: 8 bits
vAA
. , , - . P.S: )
move-object vA, vB
A: 4 bits. B: 4 bits
, .
move-object/16 vAAAA, vBBBB
A: 16 bits. B: 16 bits
, move-object
. 16 bits
move-object/from16 vAA, vBBBB
A: 8 bits. B: 16 bits
, move-object/from16
. 8 bits
move-result vAA
A: 8 bits.
(non-object) invoke
vAA
. invoke
, (, ) .
move-result-object vAA
A: 8 bits.
invoke
vAA
. invoke
- fill-new-array
, () .
:
move-result-wide vA+
โ A: 8 bitsmove-wide vA+, vB+
โ A: 4 bits. B: 16 bitsmove-wide/16 vA+, vB+
โ A: 16 bits. B: 16 bitsmove-wide/from16 vA+, vBBBB
โ A: 8 bits. B: 16 bits
ADD
C
add-double vA+, vB+, vC+
A
: (8 )B
: 1 (8 )C
: 2 (8 )
vB+ + vC+ vA+
add-double/2addr vA+, vB+
vA + vB vA+
add-float vA, vB, vC
A
: (4 )B
: 1 (4 )C
: 2 (4 )
vB + vC vA
add-float/2addr vA, vB
vA + vB vA
add-int vA, vB, vC
A
: (4 )B
: 1 (4 )C
: 2 (4 )
vB + vC vA
add-int/lit8 vA, vB, 0xC
vB + 0xC vA
add-int/lit16 vA, vB, 0xC
vB + 0xC vA
add-int/2addr vA, vB
vA + vB vA
AND
, .
DIV
MUL
OR
, .
REM
SHL
, .
SHR
, .
SUB
USHR
XOR
, , .
Return
return
. , . return
. , return
. .
return vAA
non-object vAA.
return-object vAA
object-returning object-reference vAA.
return-void
void .
return-wide vA+
double
/long
(64-bit) vA+
.
Switch-
packed-switch vAA, :target
:
A
:target
: packed-switch()
switch
, case . ( ) . vAA
, . vAA
, ( ). pack-switch
, vAA
.
:
:target
.packed-switch 0x1 # 0x1 = / vAA
:pswitch_0 # pswitch_0 vAA == 0x1
:pswitch_1 # pswitch_1 vAA == 0x2
.end packed-switch
sparse-switch vAA, :target
Menerapkan pernyataan switch di mana konstanta kasus tidak berurutan. Instruksi menggunakan tabel pencarian dengan konstanta case
dan offset untuk setiap kasus konstan. Jika tidak ada kecocokan dalam tabel, eksekusi berlanjut di perintah berikutnya (case default).
:target
.sparse-switch
0x3 -> :sswitch_1 # sswitch_1 vAA == 0x3
0x65 -> :sswitch_2 # sswitch_2 vAA == 0x65
.end sparse-switch