1625-5 王子昂 总结《2017年7月16日》 【连续第287天总结】
A. Smali文件深入
B.
包信息:
.class public Lcom/aaaaa;
.super Lcom/bbbbb;
.source “ccccc.java”
意思为:
这是一个由ccccc.java编译得到的smali文件
它是com.aaaaa这个package下的一个类
继承自com.bbbbb这个类
声明信息:
#annotations
.annotation system Ldalvik/annotation/MemberClasses;
value={
Lcom/aaa$qqq;
Lcom/aaa$www;
}
.end annotation
这个声明是一个内部类的声明:aaa这个类有两个成员内部类:qqq和www
寄存器:
本地寄存器用v表示,如v0,v1,v2…
参数寄存器用p表示,如p0,p1,p2…
特别注意的是p0不一定是函数的第一个参数,在非static函数中,p0代表this,p1表示第一个参数;
而在static函数中p0表示第一个参数(因为JAVA的static方法中没有this方法)
成员变量指令简析:
sget-object v0,Lcom/aaa;->ID:Ljava/lang/String;
sget-object就是用来获取这个变量值并保存到紧接着的参数的寄存器中
本例中它获取ID这个string类型的成员变量并放入v0这个寄存器中
注意:前面需要该变量所属的类的类型,后面加冒号和该成员变量的类型,中间->表示所属关系
iget-object v0,p0,Lcom/aaa;->view:Lcom/aaa/view;
可以看到iget-object比sget-object多一个参数,就是该变量所在类的实例,在这里就是p0,即this
获取array的话则要使用aget和aget-object,指令和上述相同
put指令的使用和get指令是统一的:
const/4 v3,0x0
sput-object v3,Lcom/aaa;->timer:Lcom/aaa/timer;
相当于this.timer=null;
注意:这里因为是赋值object所以是null,如果是boolean的话,则是False
.local v0,args:Landroid/os/Message;
const/4 v1,0x12
iput v1,v0,Landroid/os/Message;->what:I
相当于 args.what=18;(args是Message的实例)
C.明日计划
安卓逆向知识