黄沙百战穿金甲,不破楼兰终不还。这篇文章主要讲述静态分析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反汇编形式差不多)
- packed-switch(有规律的)
- sparse-switch (无规律的)
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
推荐阅读
- 导入AppiumLibrary报错( ImportError: cannot import name 'InvalidArgumentException)
- Spring的beanFactory与ApplicationContext区别
- Android逆向学习资料
- 动态分析Android程序
- 关于spring获取webApplication.getBean多种途径和简单解释
- 关于TokenPocket钱包Dapp开发的一些常见问题
- spring里头各种获取ApplicationContext的方法
- android jni介绍
- android 开发将view保存为image的实现及将html保存为pdf格式