静态分析Android程序

黄沙百战穿金甲,不破楼兰终不还。这篇文章主要讲述静态分析Android程序相关的知识,希望能为你提供帮助。
快速定位android程序的关键代码1.通过apktool反编译apk文件,得到AndroidManifest.xml文件,可以得到程序用到的组建、配置、以及主Activity
2.信息反馈法(特殊字符串)
3.特征函数法(Toast)
4.一行一行代码看
5.插桩法
6.查看调用栈
7.Method Profiling(记录每个函数的CPU时间,以及调用栈)
smali文件格式主要框架
.class < 访问权限> [修饰关键字] < 类名>
.super < 父类名>
.source < 源代码名称>
后面是具体的字段、方法、注解(下面
字段表示
静态字段:

#static fields .field < 访问权限> static [修饰关键字] < 字段名> :< 字段类型>

实例字段
#instance fields .field < 访问权限> [修饰关键字] < 字段名> :< 字段类型>

方法表示
.method < 访问权限> [修饰关键字] < 方法原型> .prologue 具体代码 .end method

接口
.implements < 接口名>

注解类
.annotation [注解属性] < 注解类名> [注解字段 = 值] .end annotation

Android程序中的类baksmali反编译dex文件时,会为每一个类都生成一个smali文件
内部类
如下
class Outer{ class Inner{} }

baksmali反编译的时候会生成 Outer.smali文件 与 Outer$Inner.smali文件。其中内部内文件名形式为"[外部类]$[内部类].smali"。
我们打开Outer$Inner.smali文件会发现,存在一个this$0 的synthetic的字段(synthetic表示由编译器合成),其指向父类,供内部类的其他方法调用(其中0表示第几层父类)
查看内部类的初始化函数,我们可以发现该类的初始化为:先保存外部类的引用,然后调用父类的构造函数,然后是自身的初始化
监听器
也就是匿名类,其形式与内部类差不多。文件名形式为"[外部类]$[数字].smali"
注解类
#annotations .annotation system Ldalvik/annotation/Memberclasses; value = https://www.songbingjia.com/android/{ Lcom/droider/crackme/MainActivity#SNChecker; } .end annotation

【静态分析Android程序】MemberClasses为父类提供一个member classes 列表.通俗的将就是一个内部类列表
#annotations .annotation system Ldalvik/annotation/EnclosingMethod; value = https://www.songbingjia.com/android/{ Lcom/droider/crackme/MainActivity; -> onCreate()V; } .end annotation

EnclosingMehtod注解用来说明其作用范围,Method表示他作用于一个方法。value表示其作用的具体类中的函数.相应的还用EnclosingClass注解
#annotations .annotation system Ldalvik/annotation/InnerClass; accessFlags = 0x1 name = "SNChecker" .end annotation

InnerClass注解表示类为一个内部类
自动生成的类
R类每个工程下的res目录下的每个资源都会有一个id,其保存在R类中
阅读反汇编的smali代码 循环语句
  • 迭代器(hasNext,next)
  • 普通循环(x86反汇编形式差不多)
switch 分支语句
  • packed-switch(有规律的)
  • sparse-switch (无规律的)
smali格式大概如下:
xxxxx-switch p0,switch_goto_table
switch_goto_table指向一个跳转表。
其中默认 default 分支 位于 xxxxx-switch p0,switch_goto_table 指令之后
try-catch 语句
smali 代码中,try语句块使用 try_start_x ,try_end_x 包围 (其中 x为数字).
在 try_end_x下面是.catch 指令,指定处理的异常类型与处理代码的位置
在处理catch代码时,发现异常会调用外围catch


    推荐阅读