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、总结

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