app(apktool)

# apktool d App-debug.apk

使用d进行反编译并且储存在App-debug文件里面

image-20231127221353881

反编译后到app-debug文件夹里面看每个类都对应这一个smali文件

smali

在Java字节码中,寄存器都是32位的,能够支持任何类型,64位类型(Long/Double)用2个寄存器表示

p命名法和v命名法: p命名法通常用于表示函数参数,比如p0、p1等

​ v命名法用于表示函数内部的变量,比如v0、v1等

数据类型

image-20231127222232731

引用类型

对象类型:

​ “Lpackage/name/ObjectName;”的形式表示。

​ 其中,L表示这是一个对象类型,“;”标识对象名称的结束,

​ 中间的package/name表示对象的包名,ObjectName表示对象名。

​ 最终这样的形式相当于java源代码中package.name.ObjectName类的完整表示, 比如com.roysue.demo02.MainActivity 类 ,

​ 最 终 表 示 为“Lcom/roysue/demo02/MainActivity;”

if-eqz p1, :cond_0(如果p1寄存器中的内容为0就跳转到:cond_0处)

数组类型:

​ 只需要在类型的前面加上“[”即可

​ [Ljava/lang/String表示一个String字符串的数组类型

“#”用于注释

#smali的文件头三行描述了类的信息

1
2
3
.class <访问权限> [关键修饰字] <类名>;
.super <父类名>;
.source <源文件名>

image-20231127224605201

“Lcom/roysue/demo02/ MainActivity;”的表示方式符合字节码的相关约定,即表示MainActivity类。

.super后跟着的是类的父类,与Java中的extends关键词后跟着AppCompatActivity类是一致的。

.source关键词后跟着的是当前类的源文件名。需要注意的是,第三行的.source关键词后的文件名可以通过ProGuard优化器去除掉。

.field关键词后跟着成员变量的访问权限

image-20231128110406333

函数的声明以.method关键词开始,以.end method关键词结束

image-20231128110607168

.locals关键词用于表示函数中非参数的变量的多少

.registers关键词则表示函数中使用寄存器的数量

.param关键词用于声明方法中的参数名,比如:.param p1, “savedInstanceState”表明onCreate()函数的参数名为”savedInstanceState”;

.line参数则保存着相应代码在Java源文件中的行号信息

常量操作指令主要是const相关指令,方法调用指令是以invoke关键词开头的一类指令,通常用于 调 用 外 部 函 数 其基本格式 invoke-kind{vA,vB,vC},mehtod@DDDD

mehtod@DDDD表示函数的引用;vA,vB,vC则表示函数的参数,其定义顺序与调用函数的参数一一 对 应 ;kind 则 代 表 被 调 用 的 类 型 , 主 要 有 static 、 virtual 、super(被调用的函数是静态函数、正常的函数和父类函数等)

签名

实战去弹框