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
Q

ldr伪指令是什么

A

相当于x86的lea
格式为:
LDR Rn,=expr
ldr r0,=0x12345678:把0x12345678这个值写入r0

如果没等号,就是把0x12345678地址处的值给r0

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

sget-object v0,Lcom/aaa;->ID:Ljava/lang/String;
是什么意思?
;->前面的Lcom/aaa是什么意思
;->后面的Ljava/lang/String是什么意思

A

获取ID这个String类型的成员变量并放到v0中

前面需要该变量所属类的类型,后面加个冒号和成员变量的类型

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
27
Q
Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
请说出它的
类是什么
方法是什么
参数的数据类型是什么
返回值的数据类型是什么
A

类是Landroid/util/Log
方法是d
参数类型是String
返回值类型是整数型

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

寄存器R16干什么用的

A
标志寄存器(CPSR),相当于x86中的EFLAGS
N:负标志位
Z:零标志位
C:进位标志位
V:溢出标志位
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
29
Q

LpackageName/objectName;

A

LpackageName/objectName;

对象(或类)的表示以L作为开头,格式为L+包名(即类的完整路径)

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

sget-object v0,Lcom/dddd;->bbb:Lcom/ccc;

invoke-virtual {v0,v1},Lcom/ccc;->Messages(Ljava/lang/Object;)V
什么意思

A

v0是bbb

v1是传递给Messages方法的Ljava/lang/Object参数

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
31
Q
.annotation system
Ldalvik/annotation/MemberClasses;
value={
Lcom/aaa$qqq;,
Lcom/aaa$www;
}
.end annotation
什么意思
A

这个声明是内部声明:

aaa这个类有两个成员内部类:qqq和www

32
Q

静态方法是什么

非静态方法是什么

A

静态方法:不需要this,使用static修饰,p0是起始参数

非静态方法:需要实例,p0代表this,p1是起始参数

33
Q

STR指令是什么意思,怎么用

A

STR用法类似LDR
STR{}{type},
如:STR R0,{R1};
意思是[R1]=R0,将R0的值放到[R1]中

34
Q

android反编译分哪两种情况

A

android代码分为:
java代码(SDK)
原生代码(NDK):C和C++通过JNI编译

35
Q
数据类型缩写:
J
F
D
L
[
[[[I
什么意思
A
J:长整型
F:浮点型
D:双精度浮点型
L:java类类型
[:数组类型
[[[I:int[][][]
36
Q

Lpackage/name/ObjectName;->MethodName(参数签名)返回类型

A

Lpackage/name/ObjectName;->MethodName(参数签名)返回类型
方法的表示:
类;->方法名(参数签名)返回类型
;->表示访问

37
Q

smali里面的nop字节码是多少

x86里面的nop字节码是多少

A

smali里面的nop字节码是0x00

x86里面的nop字节码是0x90

38
Q

解释指令
MVN R0,#0xFF
MVN R0,R2

A

可以理解为move not
MVN R0,#0xFF
解释:R0=0xFFFFFF00

MVN R0,R2
解释:R2取反后存入R0

39
Q

弹出提示的api是什么?

A

Toast.MakeText().Show()

40
Q
LSL
LSR
ASR
ROR
RRX
请解释上面5条指令及用法
A
Rx,LSL,    逻辑左移
Rx,LSR,    逻辑右移  
Rx,ASR,   算数右移
Rx,ROR,   循环右移
Rx,RRX,   带扩展的循环右移
41
Q

怎样判断方法是原生方法

A

native关键字就是原生方法,原生方法都是在so里面

距离:如果是jni,那么so的名字就是libjni.so

42
Q

LDM干什么用的

STM干什么用的

A

LDM批量数据加载(恢复现场用)

STM批量数据存储(保存现场用)

43
Q

寄存器R14干什么用的

A

LR:存返回地址

44
Q
解释下列指令:
MOV R0,R1
MOV PC,R14
MOV R0,R1,LSL#3
MOV R0,#100
A

MOV R0,R1
R0=R1

MOV PC,R14
PC=R14

MOV R0,R1,LSL#3
R0=R1«3

MOV R0,#100
R0=100 (十进制的)

45
Q

asset文件夹是什么?

A

资源目录

asset目录下的资源不需要生成索引。使用C++游戏引擎的资源均需要放在asset下

46
Q

Button点击事件响应的函数是什么

A

OnClickListener

47
Q

ARM汇编中返回地址用什么表示

A

LR

48
Q

META-INF文件夹是什么

A

存放属性文件,如:

Manifest.MF

49
Q

invoke-static {},Lcom/aaa;->CheckSignatue()Z;

{}是什么意思

A

这里的花括号其实是调用该方法的实例+参数列表,由于这个方法不需要参数,且静态,所以{}为空

50
Q

R4-R11是干什么用的

A

保存局部变量

51
Q

ldr什么意思

A

相当于x86的mov xx,[]
LDR R0,[R1]
R0=[R1]

如果参数2是数字如:LDR R0,0x12345678则不用加括号,表示把地址0x12345678中的值放到R0中

52
Q

解释指令:
B
BL

A

B:跳转

BL:相当于call

53
Q

apk里面都有什么

A
apk其实就是个压缩包,所有代码都放在dex文件中
apk里面有:
asset文件夹
lib文件夹
META-INF文件夹
res文件夹
AndroidManifest.xml
classes.dex
resources.arsc
54
Q

什么是public函数
什么是private函数
什么是protected函数

A

public函数可以被任何类访问
private函数只能被该类访问
protected函数可以被同一包中的所有类及其他包中该类的子类访问

55
Q

const-string v0,”Eric”
invoke-static {v0},Lcmb/pbi;->t(Ljava/lang/String)Ljava/lang/String;
move-result-object v2

A

函数返回的结果操作

56
Q

iput-object
iget-object
incoke-static
是什么意思

A

iput-object 对象赋值
iget-object 调用对象
incoke-static 调用静态函数

57
Q

AndroidManifest.xml是什么

A

Android工程的基础配置属性文件

58
Q

.local v0,args:Landroid/os/Message;
const/4 v1,0x12
iput v1,v0,Landroid/os/Message;->what:I
什么意思

A

相当于args.what = 18

args是Message的实例

59
Q

如ADDS,SUBS中的S指什么?

A

S指定指令是否影响CPSR标志寄存器的值

60
Q

direct method
virtual method
分别什么意思

A

direct method:就是私有函数

virtual method:public和protected函数

61
Q
.field ptivate isFlag:z
.method
.parameter
.prologue
分别什么意思
A

.field ptivate isFlag:z:定义变量
.method:方法
.parameter:参数
.prologue:方法开始

62
Q

invoke-direct/range{v0..5},Lcmb/pb/ui/PBContainerActivity;->h(lLjava/lang/Char/Sequence;Ljava/lang/String;Landroid/content/Intend;I)Z
是什么意思

A

当方法参数大于5个,加上/range表示范围

63
Q
B
BT
H
SB
SH
T
分别多少位
A
B:Byte
BT:用户模式的Byte,1字节
H:x86中的Word型,2字节
SB:有符号Byte,1字节
SH:有符号Word型,2字节
T:x86中的dword,4字节
64
Q

当参数多余4个,R0-R3不够用了怎么办

A
放栈里面:
R0 = 参数1
R1 = 参数2
R2 = 参数3
R3 = 参数4
LR = 返回地址
栈:
|参数 5|
|参数 5|
|参数 5|
栈底,高地址
65
Q

res文件夹干什么的

A

资源目录
res下的资源在编译时会生成索引文件(R.java)

使用java开发的资源放到res文件夹中,C和C++开发的资源放到asset文件夹中

66
Q

列表项的点击事件响应函数是什么?

A

列表项的点击事件响应

67
Q

什么是Dalvik指令集

A

就是smali语法

68
Q

invoke-super

A

调用基类方法

一般用于onCreate,onDestroy等方法

69
Q

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
什么意思

A

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
Q

move vA,vB是把谁赋值给谁

A

vA = vB

71
Q

ADD R0,R1,R2
ADD R0,R1,#256
ADD R0,R2,R3,LSL#1
解释上面指令

A

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
Q

说出一下指令什么意思:
const/4 v0,0x1
iput-boolean
v0,p0,Lcom/aaa;->lsRegisterd:Z

A
const/4 v0,0x1    //v0赋值为1
iput-boolean v0,p0,Lcom/aaa;->lsRegistered:Z
//把v0中的值放到aaa.IsRegistered中,即this.Registered=true
73
Q
invoke-direct
return-void
.end method
new-instance
分别是什么意思
A

invoke-direct:调用函数
return-void:函数返回
.end method:函数结束
new-instance:创建实例

74
Q

寄存器R0-R3干什么用的

A

放参数

75
Q
Dalvik数据类型缩写:
V
Z
B
S
C
I
都是什么类型
A
V:表示没有返回值
Z:布尔值
B:byte字节型
S:短整型
C:char字符型
I:int整数型