3.2、基于API序列与基于变量计数的相似度分析

前言

在上一章中我给大家介绍了基于代码流的方案,这一章里,我将会介绍基于API序列与基于变量计数的方案。

由于这两种方案目前在网上还未能找到针对Dex的开源实现,所以这里我会简单介绍下其原理实现。

基于API序列的原理

API(Application Programming Interface)一般指的是系统或他人提供的编程接口。

这里我把API定义为所有被调用的方法,在我们编写代码的过程中,一般情况下都会调用各种API,这些API可以分为三类:

1) 系统API

2) 别人提供的SDK或开源库中的API

3) 自己编写的API。

查看全文

3.1、基于代码流的相似度分析

前言

这里所说的相似度分析是针对Android应用来说的,主要是指Dex文件的分析。

通过相似度分析,可以快速地识别一款应用是否来源于另一款应用,如版本更新、重打包之类的。这对于病毒分析、重打包分析等非常之有用。

目前市面上主流的相似度分析方案有3种:基于代码流、基于API序列、基于变量计数。本章将介绍基于代码流的方案。

基于代码流的方案是指针对同一个方法中的多条指令进行连续性识别,Androguard中的androsim.py工具就是基于这种原理。当然,有了前面的知识,我们也可以自己写一个类似的工具。

androsim.py的使用

androsim.py是Androguard中的一个工具,因此需要先安装Androguard。Androguard下载与安装请参见官方文档:http://code.google.com/p/androguard/

查看全文

android代码混淆系列文章-2.5、asm、asmdex、smali/baksmali的优劣对比

前言

前几章中我们分别介绍asm、asmdex以及smali/baksmali这三个开源库,它们各有其特色之处,这一章我们来对比一下它们的优劣,以便更好地选择方案进行开发。

ASM

asm修改的是class文件,所以无法直接修改android应用,不过幸运的是,我们可以通过dex2jar进行转换。但这样一来,就相当于同时依赖asm和dex2jar了。这样我们开发过程中就需要对asm和dex2jar都保持怀疑的态度,以免由于asm或dex2jar的Bug而影响到开发的效率。

幸运的是,asm5.0版非常地成熟,到目前还没发现Bug,而dex2jar0.95版有一点Bug,但更新到2.0版后,至今也没发现有严重的Bug。不过dex2jar有个小问题,就是不支持保留行号和调试信息。

查看全文

android代码混淆系列文章-2.4、ASMDEX库的介绍

简介

ASMDEX官方地址:http://asm.ow2.org/

在2.3章中我给大家介绍了ASM,细心的童鞋应该能发现,ASM与ASMDEX的官方地址是同一个。ASM是针对class文件,而Java在很久以前就已经有了,所以说ASM已经非常的成熟。而ASMDEX是针对的Dex文件的,Android的出现也没多少年,因此ASMDEX到现在,也只有1.0版,相对来说并不稳定。

ASMDEX的设计与ASM类似,因此学过ASM的童鞋,学习ASMDEX应该是没多少难度的。本文假设大家已经学过ASM,还没学过的童鞋,请参考2.3章。

Java与Android

这里强调一下Java与Android的关系。

Java是一门编程语言,我们在编写完Java代码后,一般使用javac工具(由JDK提供)把Java代码转换为字节码(bytecode),存放在相应的.class文件中,由JVM来识别运行。JDK是用来开发及运行Java应用程序的工具集。

查看全文

android代码混淆系列文章-2.3、ASM库的介绍

简介

ASM官方地址:http://asm.ow2.org/

这里使用的是asm-debug-all-5.0.2.jar,其它版本基本类似。

ASM是一个用于操作或分析bytecode的框架,ASM可以新增,读取甚至修改class文件。通过ASM,我们可以根据需要修改class文件,如增加日志、删除无用代码、分析程序行为等等。

ASM中的常用类

  • ClassReader:类读取工具。
  • ClassVisitor:类访问者接口,ASM的设计主要基于访问者模式以及基于对象树,此接口中包含与操作该类相关的接口。
  • MethodVisitor:方法访问者接口,此接口中包含与操作方法相关的接口。
  • FieldVisitor:属性访问者接口,此接口相对比较少用。
  • ClassWriter:类写入工具,继承自ClassVisitor。
  • MethodWriter:方法写入工具,继承自MethodVisitor,此类非公开类,由ClassWriter来使用。
  • ClassNode:代表一个类结点的结构,继承自ClassVisitor。
  • MethodNode:代表一个方法结点的结构,继承自MethodVisitor。
  • FieldNode:代表一个属性结点的结构,继承自FieldVisitor。
  • AbstractInsnNode:代表一条指令的抽象。

查看全文

android代码混淆系列文章-2.2、相关工具的介绍与使用

dex2jar

dex2jar的最新版下载地址http://sourceforge.net/projects/dex2jar/,这里使用的是2.0版本。

dex2jar是一款开源工具,主要用于把dex转换为jar,同样的,也可以把jar转换为dex。

下面命令可把classes.dex转换为tmp.jar:

1
$DEX2JAR_PATH/d2j-dex2jar.sh -f classes.dex -o tmp.jar

注意$DEX2JAR_PATH指的是dex2jar的根目录,这里用的是.sh,在windows下改为.bat即可。其中-f代表输入,-o代表输入。

查看全文

android代码混淆系列文章-2.1、bytecode与dalvik opcodes介绍及对比

Java方法签名

学习bytecode、dalvik bytecode甚至JNI时,都会用到方法的签名,因此这里先给大家介绍下。

使用javap(将在2.2章中介绍)工具可生成方法的签名,如:

方法定义:

1
public native int add(long a, String b);

对应的签名:

1
(JLjava/lang/String;)I

我们可以看到,在签名中,返回值在最后,参数使用括号括住。

查看全文

android代码混淆系列文章-1、概述

序言

正所谓授人以鱼,不如授人以渔。前段时间一直研究在android代码混淆的相关内容,同时写了两个工具:方法合并工具、混淆工具。这方面的内容网上资料非常少,但入门门槛其实并不高,因此希望通过这系列的文章,让更多人能够了解到这方面的技术。

谁能从中获益?

对于android开发者来说,能更好的保护自己的软件。

对于学生或技术爱好者来说,能学到一门虽冷门但却有意思的技术,开拓视野。

对于安全从业者来说,能够针对性地做出更好的防护系统。

对于骇客来说…技术无国界嘛^_^

查看全文

android代码混淆系列文章-编写计划

在接下来的时间,打算写一系列的文章,介绍与Android混淆相关一些的内容,这里先列出大概提纲,之后会陆续更新,相应的链接也会同步到这里。

1、概要

主要介绍一下本系列文章的内容及相关的知识点和工具。

2、相关基础知识

2.1 bytecode与dalvik bytecode介绍及对比

介绍了bytecode和dalvik bytecode的知识点及其差异。

2.2 相关工具的介绍与使用

介绍dex2jar、aapt、apktool、zipalign、javap、ndk等工具。

2.3 asm开源库的介绍

对asm库进行详细地介绍。

2.4 asmdex开源库的介绍

对asm库进行详细地介绍。

2.5 asm、asmdex、smali/baksmali的优劣对比

对asm、asmdex以及smali/baksmali进行比较。

3、相似度识别方案

3.1 基于代码流的相似度分析

介绍androguard中的androsim.py工具,并介绍相应的原理与实现。

3.2 基于API序列与基于变量计数的相似度分析

介绍基于API序列及基于变量计数的相似度检测工具的原理与实现。

4、代码混淆方案

4.1 反射调用与字符串加密

介绍把正常调用转换为反射调用的方案以及对常量字符串加密的方案。

4.2 指令替换与花指令

介绍指令的等价替换以及花指令的方案。

4.3 重构方法

介绍把一部分代码抽取出来作为一个方法的方案。

4.4 合并方法

介绍把多个方法合并一个方法的方案。

4.5 重构为本地方法

介绍把普通方法转换为本地方法的方案。

5、总结

针对所有方案进行比较,并给出相应的测试结果与说明等等。