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参数