Android逆向 Flashcards
【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
什么意思
.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
【smali语法】
smali语法操作指令方向是怎样的
move 目标,源
【smali语法】
假设用6个寄存器,其中两个用于存放参数,请用v命名法和p命名法表示寄存器
v命名法: V0:第一个局部变量 V1:第二个局部变量 V2:第三个局部变量 V3:第四个局部变量 V4:第一个参数 V5:第二个参数
p命名法: V0:第一个局部变量 V1:第二个局部变量 V2:第三个局部变量 V3:第四个局部变量 P0:第一个参数 P1:第二个参数
【smali语法】 .line 123 .invoke-super .locals const/high 16 v0,0x7f03 什么意思
.line 123 //此方法位于123行
.invoke-super //调用父函数
.locals //指定了使用局部变量的个数
const/high 16 v0,0x7f03 //把0x7f03 赋值给v0
安卓静态反汇编smali,动态调试smali,分析原生so分别用什么工具
静态反汇编smali:android killer;jeb
动态调试smali:AS+smalidea
分析原生so:IDA Pro
【Arm汇编】 AND R0,R0,#1 ORR R0,R0,#0x0F EOR BIC Rd,Rn,op2 什么意思
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)
iget-object v0,p0,Lcom/aaa;->view;Lcom/aaa/view;
什么意思
iget-object比sget-object多了一个参数,就是该变量所在类的实例,这里p0就是this,类似与python的self。
获取array的花用aget-object
classes.dex是什么
Java代码编译的Dalvik VM能直接执行的文件
所有代码都在dex文件中
Button长按事件响应的函数是什么?
OnLongClickListener
请解释以下指令:
SWP R1,R1,[R0]
SWPB R1,R2,[R0]
SWP R1,R1,[R0]
将R1寄存器与R0指向的存储单元的内容进行交换
SWPB R1,R2,[R0]
从R0指向的存储单元读取一个Byte存入R1,(高24位清零)。然后将R2寄存器的Byte存入[R0]
adb工具命令: 查看当前设备 上传文件到手机 打开手机shell 安装apk
查看当前设备:adb devices
上传文件到手机:adb push 文件名 目标路径
打开手机shell:adb shell
安装apk:adb install xxx.apk
寄存器R13干什么用的?
SP:栈顶指针
ListView
列表
const/4 v3,0x0
sput-object v3,Lcom/aaa;->timer:Lcom/aaa/timer;
什么意思
相当于this.timer=null
之所以是null而不是0,是因为这里赋值object
寄存器R15干什么用的
PC:相当于x86的EIP
invoke-direct {p0},Landroid/app/TabActivity;->()V
什么意思
调用private函数,这里init()就是定义在TabActivitay中的private函数
解释:
SUB R0,R1,R2
SUB R0,R1,#256
SUB R0,R2,R3,LSL#1
SUB R0,R1,R2 //R0 = R1-R2
SUB R0,R1,#256 //R0 = R1-256
SUB R0,R2,R3,LSL#1 //R0 = R2-(R3<<1)
在分析apk之前,怎样做才能让程序可以被调试
在Android killer中双击打开AndroidManifest.xml,在application标签厘米啊添加一个属性android:debuggable=”true“,然后回编成apk
解释:
.class public Lcom/aaaaa;
.super Lcom/bbbbb;
.source “ccccc.java”
这是一个由ccccc.java编译得到的smali文件
它是com.aaaaa包下的一个类,继承自com.bbbbb这个类
resources.arsc是干什么用的
对res目录下的资源的一个索引文件,保存了原工程中strings.xml等文件内容
ARM中每个寄存器是多少位的
32
lib文件夹是干什么的
so库存放位置,有NDK编译得到,常见与游戏引擎或JNI native调用的工程中
哪个寄存器相当于x86中的EBP
FP
const-string v0,”NDKLIB”
invoke-static{v0},Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
什么意思
这个是调用static void System.loadLibrary(String)来加载NDK编译的so库用的方法,这里v0就是参数”NDKLIB“
ldr伪指令是什么
相当于x86的lea
格式为:
LDR Rn,=expr
ldr r0,=0x12345678:把0x12345678这个值写入r0
如果没等号,就是把0x12345678地址处的值给r0
sget-object v0,Lcom/aaa;->ID:Ljava/lang/String;
是什么意思?
;->前面的Lcom/aaa是什么意思
;->后面的Ljava/lang/String是什么意思
获取ID这个String类型的成员变量并放到v0中
前面需要该变量所属类的类型,后面加个冒号和成员变量的类型
Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I 请说出它的 类是什么 方法是什么 参数的数据类型是什么 返回值的数据类型是什么
类是Landroid/util/Log
方法是d
参数类型是String
返回值类型是整数型
寄存器R16干什么用的
标志寄存器(CPSR),相当于x86中的EFLAGS N:负标志位 Z:零标志位 C:进位标志位 V:溢出标志位
LpackageName/objectName;
LpackageName/objectName;
对象(或类)的表示以L作为开头,格式为L+包名(即类的完整路径)
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参数
.annotation system Ldalvik/annotation/MemberClasses; value={ Lcom/aaa$qqq;, Lcom/aaa$www; } .end annotation 什么意思
这个声明是内部声明:
aaa这个类有两个成员内部类:qqq和www
静态方法是什么
非静态方法是什么
静态方法:不需要this,使用static修饰,p0是起始参数
非静态方法:需要实例,p0代表this,p1是起始参数
STR指令是什么意思,怎么用
STR用法类似LDR
STR{}{type},
如:STR R0,{R1};
意思是[R1]=R0,将R0的值放到[R1]中
android反编译分哪两种情况
android代码分为:
java代码(SDK)
原生代码(NDK):C和C++通过JNI编译
数据类型缩写: J F D L [ [[[I 什么意思
J:长整型 F:浮点型 D:双精度浮点型 L:java类类型 [:数组类型 [[[I:int[][][]
Lpackage/name/ObjectName;->MethodName(参数签名)返回类型
Lpackage/name/ObjectName;->MethodName(参数签名)返回类型
方法的表示:
类;->方法名(参数签名)返回类型
;->表示访问
smali里面的nop字节码是多少
x86里面的nop字节码是多少
smali里面的nop字节码是0x00
x86里面的nop字节码是0x90
解释指令
MVN R0,#0xFF
MVN R0,R2
可以理解为move not
MVN R0,#0xFF
解释:R0=0xFFFFFF00
MVN R0,R2
解释:R2取反后存入R0
弹出提示的api是什么?
Toast.MakeText().Show()
LSL LSR ASR ROR RRX 请解释上面5条指令及用法
Rx,LSL, 逻辑左移 Rx,LSR, 逻辑右移 Rx,ASR, 算数右移 Rx,ROR, 循环右移 Rx,RRX, 带扩展的循环右移
怎样判断方法是原生方法
native关键字就是原生方法,原生方法都是在so里面
距离:如果是jni,那么so的名字就是libjni.so
LDM干什么用的
STM干什么用的
LDM批量数据加载(恢复现场用)
STM批量数据存储(保存现场用)
寄存器R14干什么用的
LR:存返回地址
解释下列指令: 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 (十进制的)
asset文件夹是什么?
资源目录
asset目录下的资源不需要生成索引。使用C++游戏引擎的资源均需要放在asset下
Button点击事件响应的函数是什么
OnClickListener
ARM汇编中返回地址用什么表示
LR
META-INF文件夹是什么
存放属性文件,如:
Manifest.MF
invoke-static {},Lcom/aaa;->CheckSignatue()Z;
{}是什么意思
这里的花括号其实是调用该方法的实例+参数列表,由于这个方法不需要参数,且静态,所以{}为空
R4-R11是干什么用的
保存局部变量
ldr什么意思
相当于x86的mov xx,[]
LDR R0,[R1]
R0=[R1]
如果参数2是数字如:LDR R0,0x12345678则不用加括号,表示把地址0x12345678中的值放到R0中
解释指令:
B
BL
B:跳转
BL:相当于call
apk里面都有什么
apk其实就是个压缩包,所有代码都放在dex文件中 apk里面有: asset文件夹 lib文件夹 META-INF文件夹 res文件夹 AndroidManifest.xml classes.dex resources.arsc
什么是public函数
什么是private函数
什么是protected函数
public函数可以被任何类访问
private函数只能被该类访问
protected函数可以被同一包中的所有类及其他包中该类的子类访问
const-string v0,”Eric”
invoke-static {v0},Lcmb/pbi;->t(Ljava/lang/String)Ljava/lang/String;
move-result-object v2
函数返回的结果操作
iput-object
iget-object
incoke-static
是什么意思
iput-object 对象赋值
iget-object 调用对象
incoke-static 调用静态函数
AndroidManifest.xml是什么
Android工程的基础配置属性文件
.local v0,args:Landroid/os/Message;
const/4 v1,0x12
iput v1,v0,Landroid/os/Message;->what:I
什么意思
相当于args.what = 18
args是Message的实例
如ADDS,SUBS中的S指什么?
S指定指令是否影响CPSR标志寄存器的值
direct method
virtual method
分别什么意思
direct method:就是私有函数
virtual method:public和protected函数
.field ptivate isFlag:z .method .parameter .prologue 分别什么意思
.field ptivate isFlag:z:定义变量
.method:方法
.parameter:参数
.prologue:方法开始
invoke-direct/range{v0..5},Lcmb/pb/ui/PBContainerActivity;->h(lLjava/lang/Char/Sequence;Ljava/lang/String;Landroid/content/Intend;I)Z
是什么意思
当方法参数大于5个,加上/range表示范围
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字节
当参数多余4个,R0-R3不够用了怎么办
放栈里面: R0 = 参数1 R1 = 参数2 R2 = 参数3 R3 = 参数4 LR = 返回地址 栈: |参数 5| |参数 5| |参数 5| 栈底,高地址
res文件夹干什么的
资源目录
res下的资源在编译时会生成索引文件(R.java)
使用java开发的资源放到res文件夹中,C和C++开发的资源放到asset文件夹中
列表项的点击事件响应函数是什么?
列表项的点击事件响应
什么是Dalvik指令集
就是smali语法
invoke-super
调用基类方法
一般用于onCreate,onDestroy等方法
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
move vA,vB是把谁赋值给谁
vA = vB
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)
说出一下指令什么意思:
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
invoke-direct return-void .end method new-instance 分别是什么意思
invoke-direct:调用函数
return-void:函数返回
.end method:函数结束
new-instance:创建实例
寄存器R0-R3干什么用的
放参数
Dalvik数据类型缩写: V Z B S C I 都是什么类型
V:表示没有返回值 Z:布尔值 B:byte字节型 S:短整型 C:char字符型 I:int整数型