Smali рджреНрд╡рд╛рд░рд╛ рд░реВрд╕реА рдзреЛрдЦрд╛ рд╢реАрдЯ
рдЕрднрд┐рд╡рд╛рджрди, рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рдкреНрд░реЗрдореАред рдпрд╣рд╛рдВ рд╕реНрдорд╛рд▓реА рдХреЗ рд▓рд┐рдП рдПрдХ рдзреЛрдЦрд╛ рдкрддреНрд░ рд╣реИ, рдЬреЛ рдПрдВрдбреНрд░реЙрдЗрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдбрд╛рдВрддрд░рдХ рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИред

рд░реВрд╕реА рдореЗрдВ рдореВрд▓ рдкрд╛рда рдпрд╣рд╛рдВ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рд╡рд╣рд╛рдВ, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЗ рдорд╢реАрди рдЕрдиреБрд╡рд╛рдж рд╕реЗ рдкрд╛рда рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ ред
рдирддреАрдЬрддрди, рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ рд╕реВрдЦрд╛ рдкрд╛рда + рд╕рд╣реА рдЯрд╛рдЗрдкреЛ рдФрд░ рдЕрдирд╛рдбрд╝реА рдЕрдиреБрд╡рд╛рдж рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЖрдк рдпрд╛ рддреЛ рдореБрдЭреЗ LAN рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ Gist рдкрд░ PR рдЬрд╛рд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред
рдкреНрд░рдХрд╛рд░
- 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 :targetgoto/16 :target #16bitgoto/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
рдорд╛рдорд▓реЗ рдХреЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдирд╣реАрдВ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдПрдХ рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдирд┐рд░реНрджреЗрд╢ рдирд┐рд░рдВрддрд░ caseрдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░рд╛рдВрдХ рдФрд░ рдСрдлрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд▓реБрдХрдЕрдк рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ ред рдпрджрд┐ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреЛрдИ рдореЗрд▓ рдирд╣реАрдВ рд╣реИ, рддреЛ рдирд┐рд╖реНрдкрд╛рджрди рдЕрдЧрд▓реЗ рдХрдорд╛рдВрдб (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдорд▓реЗ) рдореЗрдВ рдЬрд╛рд░реА рд╣реИред
:target
.sparse-switch
0x3 -> :sswitch_1 # sswitch_1 vAA == 0x3
0x65 -> :sswitch_2 # sswitch_2 vAA == 0x65
.end sparse-switch