Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

Statistical Deobfuscation of Android Applications

论文下载

这篇文章提出一种Android上反混淆的技术,这里的混淆指的是layout obfuscation,即我们熟悉的用proguard对类名,方法名,变量名进行的混淆。反混淆的方式是通过大规模的学习未混淆的APK,来总结出一个概率模型(probabilistic model)。再用该model来识别混淆后的代码。

ProGuard

proguard大家都很熟悉,这里要强调一点是proguard不会混淆所有的program elements。例如一些Android API或manifest中声明的一些组件名是不会混淆的。

DeGuard

DeGuard是本文提出的反混淆系统。系统流程如下图:

Fig

整个过程分如下三步:

  1. 生成一个依赖关系图 (dependency graph based on program elements),图中每个点是program element,每条线代表依赖关系。
  2. 自动导出一些限制规则,这些限制规则保证恢复的APK是个正常的APK,且和原APK语义相同。
  3. 对混淆的元素的原始名字进行预测并恢复。

Background

文章在本章节介绍了一些概率学中的基本概念和方法。包括如何生成依赖图,如何生成权重,如何预测等等。

FEATURE FUNCTIONS

Program Elements

  • 关注的elements包括types,fields,packages,methods,expressions(常量数值或null),access modifiers(static private public…),operations(+,-..)。
  • 同时会区分已知的元素和未知的元素。
  • 为了识别继承的方法,还会计算每个method的签名(a method’s signature is dened by the method’s name along with the number and types of its parameters.)

Fig

CONSTRAINTS

Naming Constraints for Methods

举个例子:

Fig 注意如下几点:

  1. A.a不受其它method限制,因为只有它的参数是A
  2. 但A.b一定不能rename为equals(Object),因为A是隐性继承Object的,且存在java.lang.Object.equals(Object)。
  3. B.g和B.h的名字一定不一样,即使他们的access level和return type不同。
  4. B.g和A.c的名字一定不一样,B.h和A.c也一定不一样。否则就变为继承。
  5. B.h和C.x可以一样,因为B.h是private,不会被继承。

Naming Constraints for Fields, Classes, and Packages

  1. any two packages contained in the same package must have distinct names
  2. any two classes contained in the same package must have distinct names
  3. any two fields declared in the same class must have distinct names.

Evaluation

  • 1784个APK,选100个作为benchmark,其余1684作为训练集。
  • 恢复元素名字能够做到79.1%。
  • 识别三方库可以做到91.3%
  • 速度平均1min。
  • 且给出了两个分析恶意软件的case study。