ورقة الغش الروسية بواسطة Smali
تحيات عشاق الهندسة العكسية أندرويد. هنا ورقة غش لـ Smali ، وهو نظير مجمع لتطبيقات Android.

النص الأصلي بالروسية مأخوذ من هنا . هناك ، ظهر النص من ترجمة آلية للوثائق الرسمية .
ونتيجة لذلك ، قام بتصميم نص جاف + تصحيح الأخطاء المطبعية الصغيرة والترجمة الخرقاء. فيما يتعلق بالتعليقات والاقتراحات ، يمكنك الكتابة إلي في شبكة LAN أو إصدار PR على Gist .
أنواع
- 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
تنفيذ بيان التبديل حيث لا تكون ثوابت الحالة متسلسلة. تستخدم التعليمات جدول بحث يحتوي على ثوابت case
وتعويضات لكل حالة ثابتة. إذا لم يكن هناك تطابق في الجدول ، يستمر التنفيذ في الأمر التالي (الحالة الافتراضية).
:target
.sparse-switch
0x3 -> :sswitch_1 # sswitch_1 vAA == 0x3
0x65 -> :sswitch_2 # sswitch_2 vAA == 0x65
.end sparse-switch