Android逆向 Flashcards

1
Q

【smali语法】
.method private ifRegistered()Z
.locals 2
.prologue
const/4 v0,0x1
.local v0,temFlage:Z
if-eqz v0:vond_0
cond_0
const/4 v1,0x1
:goto_0
return v1
:cond_0
const/4 v1,0x0
goto :goto_0
.end method
什么意思

A

.method private ifRegistered()Z
.locals 2 //在这个函数中本地寄存器的个数为2个
.prologue //标识方法开始
const/4 v0,0x1
.local v0,temFlage:Z
if-eqz v0:vond_0 //如果v0等于0则跳到cond_0;如果不等于0,继续执行至return
const/4 v1,0x1
:goto_0 //这就是个标签而已
return v1 //返回v1的值
:cond_0 //这也是个标签
const/4 v1,0x0
goto :goto_0 //跳到goto_0执行,即返回v1的值,这里直接改成return v1也行
.end method

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

【smali语法】

smali语法操作指令方向是怎样的

A

move 目标,源

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

【smali语法】

假设用6个寄存器,其中两个用于存放参数,请用v命名法和p命名法表示寄存器

A
v命名法:
V0:第一个局部变量
V1:第二个局部变量
V2:第三个局部变量
V3:第四个局部变量
V4:第一个参数
V5:第二个参数
p命名法:
V0:第一个局部变量
V1:第二个局部变量
V2:第三个局部变量
V3:第四个局部变量
P0:第一个参数
P1:第二个参数
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q
【smali语法】
.line 123
.invoke-super
.locals
const/high 16 v0,0x7f03
什么意思
A

.line 123 //此方法位于123行
.invoke-super //调用父函数
.locals //指定了使用局部变量的个数
const/high 16 v0,0x7f03 //把0x7f03 赋值给v0

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

安卓静态反汇编smali,动态调试smali,分析原生so分别用什么工具

A

静态反汇编smali:android killer;jeb
动态调试smali:AS+smalidea
分析原生so:IDA Pro

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q
【Arm汇编】
AND R0,R0,#1
ORR R0,R0,#0x0F
EOR
BIC Rd,Rn,op2
什么意思
A

AND R0,R0,#1 //R0=R0 AND 1

ORR R0,R0,#0x0F //R0=R0 or 0xF

EOR :异或

BIC Rd,Rn,op2 //Rd=Rn AND not(op2)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

iget-object v0,p0,Lcom/aaa;->view;Lcom/aaa/view;

什么意思

A

iget-object比sget-object多了一个参数,就是该变量所在类的实例,这里p0就是this,类似与python的self。

获取array的花用aget-object

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

classes.dex是什么

A

Java代码编译的Dalvik VM能直接执行的文件

所有代码都在dex文件中

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Button长按事件响应的函数是什么?

A

OnLongClickListener

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

请解释以下指令:
SWP R1,R1,[R0]
SWPB R1,R2,[R0]

A

SWP R1,R1,[R0]
将R1寄存器与R0指向的存储单元的内容进行交换

SWPB R1,R2,[R0]
从R0指向的存储单元读取一个Byte存入R1,(高24位清零)。然后将R2寄存器的Byte存入[R0]

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q
adb工具命令:
查看当前设备
上传文件到手机
打开手机shell
安装apk
A

查看当前设备:adb devices
上传文件到手机:adb push 文件名 目标路径
打开手机shell:adb shell
安装apk:adb install xxx.apk

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

寄存器R13干什么用的?

A

SP:栈顶指针

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

ListView

A

列表

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

const/4 v3,0x0
sput-object v3,Lcom/aaa;->timer:Lcom/aaa/timer;
什么意思

A

相当于this.timer=null

之所以是null而不是0,是因为这里赋值object

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

寄存器R15干什么用的

A

PC:相当于x86的EIP

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

invoke-direct {p0},Landroid/app/TabActivity;->()V

什么意思

A

调用private函数,这里init()就是定义在TabActivitay中的private函数

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

解释:
SUB R0,R1,R2
SUB R0,R1,#256
SUB R0,R2,R3,LSL#1

A
SUB R0,R1,R2
//R0 = R1-R2
SUB R0,R1,#256
//R0 = R1-256
SUB R0,R2,R3,LSL#1
//R0 = R2-(R3<<1)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

在分析apk之前,怎样做才能让程序可以被调试

A

在Android killer中双击打开AndroidManifest.xml,在application标签厘米啊添加一个属性android:debuggable=”true“,然后回编成apk

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

解释:
.class public Lcom/aaaaa;
.super Lcom/bbbbb;
.source “ccccc.java”

A

这是一个由ccccc.java编译得到的smali文件

它是com.aaaaa包下的一个类,继承自com.bbbbb这个类

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

resources.arsc是干什么用的

A

对res目录下的资源的一个索引文件,保存了原工程中strings.xml等文件内容

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

ARM中每个寄存器是多少位的

A

32

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

lib文件夹是干什么的

A

so库存放位置,有NDK编译得到,常见与游戏引擎或JNI native调用的工程中

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

哪个寄存器相当于x86中的EBP

A

FP

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

const-string v0,”NDKLIB”
invoke-static{v0},Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
什么意思

A

这个是调用static void System.loadLibrary(String)来加载NDK编译的so库用的方法,这里v0就是参数”NDKLIB“

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
ldr伪指令是什么
相当于x86的lea 格式为: LDR Rn,=expr ldr r0,=0x12345678:把0x12345678这个值写入r0 如果没等号,就是把0x12345678地址处的值给r0
26
sget-object v0,Lcom/aaa;->ID:Ljava/lang/String; 是什么意思? ;->前面的Lcom/aaa是什么意思 ;->后面的Ljava/lang/String是什么意思
获取ID这个String类型的成员变量并放到v0中 前面需要该变量所属类的类型,后面加个冒号和成员变量的类型
27
``` Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I 请说出它的 类是什么 方法是什么 参数的数据类型是什么 返回值的数据类型是什么 ```
类是Landroid/util/Log 方法是d 参数类型是String 返回值类型是整数型
28
寄存器R16干什么用的
``` 标志寄存器(CPSR),相当于x86中的EFLAGS N:负标志位 Z:零标志位 C:进位标志位 V:溢出标志位 ```
29
LpackageName/objectName;
LpackageName/objectName; | 对象(或类)的表示以L作为开头,格式为L+包名(即类的完整路径)
30
sget-object v0,Lcom/dddd;->bbb:Lcom/ccc; invoke-virtual {v0,v1},Lcom/ccc;->Messages(Ljava/lang/Object;)V 什么意思
v0是bbb | v1是传递给Messages方法的Ljava/lang/Object参数
31
``` .annotation system Ldalvik/annotation/MemberClasses; value={ Lcom/aaa$qqq;, Lcom/aaa$www; } .end annotation 什么意思 ```
这个声明是内部声明: | aaa这个类有两个成员内部类:qqq和www
32
静态方法是什么 | 非静态方法是什么
静态方法:不需要this,使用static修饰,p0是起始参数 非静态方法:需要实例,p0代表this,p1是起始参数
33
STR指令是什么意思,怎么用
STR用法类似LDR STR{}{type}, 如:STR R0,{R1}; 意思是[R1]=R0,将R0的值放到[R1]中
34
android反编译分哪两种情况
android代码分为: java代码(SDK) 原生代码(NDK):C和C++通过JNI编译
35
``` 数据类型缩写: J F D L [ [[[I 什么意思 ```
``` J:长整型 F:浮点型 D:双精度浮点型 L:java类类型 [:数组类型 [[[I:int[][][] ```
36
Lpackage/name/ObjectName;->MethodName(参数签名)返回类型
Lpackage/name/ObjectName;->MethodName(参数签名)返回类型 方法的表示: 类;->方法名(参数签名)返回类型 ;->表示访问
37
smali里面的nop字节码是多少 | x86里面的nop字节码是多少
smali里面的nop字节码是0x00 | x86里面的nop字节码是0x90
38
解释指令 MVN R0,#0xFF MVN R0,R2
可以理解为move not MVN R0,#0xFF 解释:R0=0xFFFFFF00 MVN R0,R2 解释:R2取反后存入R0
39
弹出提示的api是什么?
Toast.MakeText().Show()
40
``` LSL LSR ASR ROR RRX 请解释上面5条指令及用法 ```
``` Rx,LSL, 逻辑左移 Rx,LSR, 逻辑右移 Rx,ASR, 算数右移 Rx,ROR, 循环右移 Rx,RRX, 带扩展的循环右移 ```
41
怎样判断方法是原生方法
native关键字就是原生方法,原生方法都是在so里面 距离:如果是jni,那么so的名字就是libjni.so
42
LDM干什么用的 | STM干什么用的
LDM批量数据加载(恢复现场用) | STM批量数据存储(保存现场用)
43
寄存器R14干什么用的
LR:存返回地址
44
``` 解释下列指令: MOV R0,R1 MOV PC,R14 MOV R0,R1,LSL#3 MOV R0,#100 ```
MOV R0,R1 R0=R1 MOV PC,R14 PC=R14 MOV R0,R1,LSL#3 R0=R1<<3 MOV R0,#100 R0=100 (十进制的)
45
asset文件夹是什么?
资源目录 | asset目录下的资源不需要生成索引。使用C++游戏引擎的资源均需要放在asset下
46
Button点击事件响应的函数是什么
OnClickListener
47
ARM汇编中返回地址用什么表示
LR
48
META-INF文件夹是什么
存放属性文件,如: | Manifest.MF
49
invoke-static {},Lcom/aaa;->CheckSignatue()Z; | {}是什么意思
这里的花括号其实是调用该方法的实例+参数列表,由于这个方法不需要参数,且静态,所以{}为空
50
R4-R11是干什么用的
保存局部变量
51
ldr什么意思
相当于x86的mov xx,[] LDR R0,[R1] R0=[R1] 如果参数2是数字如:LDR R0,0x12345678则不用加括号,表示把地址0x12345678中的值放到R0中
52
解释指令: B BL
B:跳转 BL:相当于call
53
apk里面都有什么
``` apk其实就是个压缩包,所有代码都放在dex文件中 apk里面有: asset文件夹 lib文件夹 META-INF文件夹 res文件夹 AndroidManifest.xml classes.dex resources.arsc ```
54
什么是public函数 什么是private函数 什么是protected函数
public函数可以被任何类访问 private函数只能被该类访问 protected函数可以被同一包中的所有类及其他包中该类的子类访问
55
const-string v0,"Eric" invoke-static {v0},Lcmb/pbi;->t(Ljava/lang/String)Ljava/lang/String; move-result-object v2
函数返回的结果操作
56
iput-object iget-object incoke-static 是什么意思
iput-object 对象赋值 iget-object 调用对象 incoke-static 调用静态函数
57
AndroidManifest.xml是什么
Android工程的基础配置属性文件
58
.local v0,args:Landroid/os/Message; const/4 v1,0x12 iput v1,v0,Landroid/os/Message;->what:I 什么意思
相当于args.what = 18 | args是Message的实例
59
如ADDS,SUBS中的S指什么?
S指定指令是否影响CPSR标志寄存器的值
60
direct method virtual method 分别什么意思
direct method:就是私有函数 | virtual method:public和protected函数
61
``` .field ptivate isFlag:z .method .parameter .prologue 分别什么意思 ```
.field ptivate isFlag:z:定义变量 .method:方法 .parameter:参数 .prologue:方法开始
62
invoke-direct/range{v0..5},Lcmb/pb/ui/PBContainerActivity;->h(lLjava/lang/Char/Sequence;Ljava/lang/String;Landroid/content/Intend;I)Z 是什么意思
当方法参数大于5个,加上/range表示范围
63
``` B BT H SB SH T 分别多少位 ```
``` B:Byte BT:用户模式的Byte,1字节 H:x86中的Word型,2字节 SB:有符号Byte,1字节 SH:有符号Word型,2字节 T:x86中的dword,4字节 ```
64
当参数多余4个,R0-R3不够用了怎么办
``` 放栈里面: R0 = 参数1 R1 = 参数2 R2 = 参数3 R3 = 参数4 LR = 返回地址 栈: |参数 5| |参数 5| |参数 5| 栈底,高地址 ```
65
res文件夹干什么的
资源目录 res下的资源在编译时会生成索引文件(R.java) 使用java开发的资源放到res文件夹中,C和C++开发的资源放到asset文件夹中
66
列表项的点击事件响应函数是什么?
列表项的点击事件响应
67
什么是Dalvik指令集
就是smali语法
68
invoke-super
调用基类方法 | 一般用于onCreate,onDestroy等方法
69
const/4 v0,0x0 .local v0,i:I :goto_0 if-lt v0,v3,:cond_0 return-void :cond_0 iget-object v1,p0,Lcom/aaa/MainActivity;->listStrings:Ljava/util/List; const-string v2,"Eric" invoke-interface {v1,v2},Ljava/util/List;->add(Ljava/lang/Object;)Z add-int/lit8 v0,v0,0x1 goto:goto_0 什么意思
const/4 v0,0x0 .local v0,i:I //本地寄存器int i=v0 :goto_0 if-lt v0,v3,:cond_0 return-void :cond_0 iget-object v1,p0,Lcom/aaa/MainActivity;->listStrings:Ljava/util/List; //引用对象 const-string v2,"Eric" invoke-interface {v1,v2},Ljava/util/List;->add(Ljava/lang/Object;)Z //List是接口,执行接口方法add add-int/lit8 v0,v0,0x1 //v0=v0+1 goto:goto_0
70
move vA,vB是把谁赋值给谁
vA = vB
71
ADD R0,R1,R2 ADD R0,R1,#256 ADD R0,R2,R3,LSL#1 解释上面指令
ADD R0,R1,R2 R0 = R1+R2 ADD R0,R1,#256 R0 = R1+256 ADD R0,R2,R3,LSL#1 R0=R2+(R3<<1)
72
说出一下指令什么意思: const/4 v0,0x1 iput-boolean v0,p0,Lcom/aaa;->lsRegisterd:Z
``` const/4 v0,0x1 //v0赋值为1 iput-boolean v0,p0,Lcom/aaa;->lsRegistered:Z //把v0中的值放到aaa.IsRegistered中,即this.Registered=true ```
73
``` invoke-direct return-void .end method new-instance 分别是什么意思 ```
invoke-direct:调用函数 return-void:函数返回 .end method:函数结束 new-instance:创建实例
74
寄存器R0-R3干什么用的
放参数
75
``` Dalvik数据类型缩写: V Z B S C I 都是什么类型 ```
``` V:表示没有返回值 Z:布尔值 B:byte字节型 S:短整型 C:char字符型 I:int整数型 ```