静态分析Android程序

Posted r1ng0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态分析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 = {
        Lcom/droider/crackme/MainActivity#SNChecker;
    }
.end annotation

MemberClasses为父类提供一个member classes 列表.通俗的将就是一个内部类列表

#annotations
.annotation system Ldalvik/annotation/EnclosingMethod;
    value = {
        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


以上是关于静态分析Android程序的主要内容,如果未能解决你的问题,请参考以下文章

静态代码分析-概念:敏感性

静态代码分析-概念:敏感性

在android studio中升级repo v9后,片段必须是公共静态类崩溃错误

如何使用 Firebase 分析跟踪 android 片段

Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段

2016-2017-1 20155215 信息安全技术 补课上测试