静态分析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

原文地址:https://www.cnblogs.com/r1ng0/p/9448115.html

时间: 2024-11-09 03:29:10

静态分析Android程序的相关文章

[Android Pro] 静态分析Android程序——smali文件解析

cp : https://blog.csdn.net/hp910315/article/details/51823236 cp : http://www.jb51.net/softjc/119036.html 静态分析Android程序的两种方法: 一.阅读反编译生成的Dalvik字节码. 1.使用文本编辑器阅读baksmali反编译生成的smali文件 (1)解压apk包 unzip xxx.apk 1 (2)用baksmali进行对解压出来的dex文件反编译 java -jar baksma

Android程序能够构建和运行,但是报以下报错,为什么?

安卓程序写完之后能够构建和运行,但是会报以下的错误.不知道原因为何?求大神解答. 网上说的是混淆编译的原因,不过程序没有开启混淆编译. Error:warning: Ignoring InnerClasses attribute for an anonymous inner class Error:(com.alipay.android.phone.mrpc.core.c) that doesn't come with an Error:associated EnclosingMethod at

在Android程序中使用已有的SQLite数据库

已经将这篇文章迁移至 Code问答,你也能够到这里查看这篇文章,请多多关注我的新技术博客CodeWenDa.com 在中文搜索中,没有找到一篇比較好的关于怎样在Android应用中使用自己事先创建好的数据库的文章,于是在谷歌上找到这篇英文文章,依照它的步骤,測试成功.决定把这篇文章大致的翻译一下,想看原文的能够点击这里:http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ .

处理Android程序运行时的配置变化

本篇文章翻译自Android官方文档Handling Runtime Changes,有翻译错误请留言告知,多谢. Android程序在运行期间设备的配置是可能发生改变的(例如屏幕的方向,键盘可用性,和语言等).当这些配置发生变化时,Android会重启正在运行的Activity(先调用onDestory(),紧接着调用onCreate()).这个设计是为了让你的程序在配置发生变化时,使用不同的资源自动去适配新的配置机器. 正确的处理重启,一件很重要的事就是通过Activity正常的生命周期去恢

在Eclipse中开发Android程序时截屏的方法

在Eclipse中调试Android程序时,有时需要将程序截图保存到电脑中.步骤如下: Window --- Show View --- Other : 在弹出的窗口中,选择 Devices : 在打开的Device选项卡中,选择要截图的设备或模拟器,然后点击旁边的截图按钮: 在弹出的窗口中,点击 Save 按钮,将程序截图保存到指定的目录中即可.

Android 程序员必须知道的 53 个知识点

1. android 单实例运行方法 我们都知道 Android 平台没有任务管理器,而内部 App 维护者一个 Activity history stack 来实现窗口显示和销毁,对于常规从快捷方式运行来看都是 startActivity 可能会使用 FLAG_ACTIVITY_NEW_TASK 标记来打开一个新窗口,比如 Launcher,所以考虑单任务的实现方法比较简单,首先 Android123 纠正下大家一种错误的方法就是直接在androidmanifest.xml 的 applica

android程序----&gt;android五子棋的实现

在慕课网上学习了五子棋的课程,感觉挺不错.然后自己写了个关于五子棋的android程序,从中还是能够学习到很多东西的.现在我们开始今天五子棋程序的编写历程.程序的源码请参见友情链接: 目录导航 一些前期做准备的代码 自定义棋盘的View 保存残局并恢复棋局 判断游戏是否结束的算法 友情链接 好了,我们现在开始一步步的构建出项目来,首先是如下的项目结构图: 运行的效果图: 一些前期做准备的代码 一. 主活动类MainActivity,在菜单中加入了再来一局的功能: public class Mai

Delphi Android程序启动过程

Delphi的Android程序是原生的程序,也就是NativeActivity.那么就需要先看一下NativeActivity的原理, 在AndroidManifest.xml文件里面指定入口activity为nativeactivity,这样应用程序一启动,java虚拟机这边就开一个主线程,主线程创建一个活动,就是nativeactivity,这个nativeactivity在创建的过程中就会去应用程序的.so动态链接库中寻找一个函数: __ANativeActivity_onCreate(

Android程序Crash异常处理

在写程序时,肯定会碰到各种问题,在解决这些问题肯定要去看控制台打印的异常信息,根据控制台打印的异常信息来进行针对性的解决. 那么要解决程序运行在用户手机上崩溃的问题,必须得找到问题的原因.因此就要收集崩溃信息,也就是log日志. Android程序Crash时我们可以做的操作: 1.将Crash信息存到本地,然后上传到服务器,根据上传的异常信息进行针对性的处理: 2.系统自带的Crash界面是很不友好的,我们可以自定义程序Crash后的界面,做的友好点: 关于以上2中操作方式,自己的见解: 1.