Coder Social home page Coder Social logo

nedexprevent's Introduction

DEX加固与反编译

[TOC]

一、常用的Android反编译工具

1.1 编译与反编译

1.1.1 编译

  • java代码转换为Dalvik字节码;
  • res资源文件、AndroidManifest.xml等配置文件编译为二进制文件。

1.1.2 反编译

  • DEX文件转换为jar包或者Smali文件;
  • 将二进制资源文件还原为资源源码文件。

1.2 反编译工具

  • Apktool
  • dex2jar
  • jd-gui

1.2.1 Apktool

作用:反编译DEXsmali文件,反编译资源文件,支持重打包。

image

# 解包apk
java -jar apktool.jar d demo.apk -o out
# 重新打包
java -jar apktool.jar b out  # out 为上面的输出目录

image

1.2.2 dex2jar

# 把DEX转换为jar包
d2j-dex2jar.bat demo.apk

image

1.2.3 JD-GUI

jar包的图形化阅读工具:

image

二、反编译带来的安全威胁与保护方案

2.1 应用安全与反编译

2.1.1 Android应用反编译威胁

  • 逆向分析:漏洞挖掘、协议分析;
  • 二次打包:盗版、破解。

2.1.2 保护方案

  • 代码混淆:Java代码、C/C++代码、JS/HTML代码;
  • 应用加固:DEX文件、SO文件、资源文件。

2.2 应用开发安全生态链

image

三、DEX加固的常见方案与原理

3.1 DEX加固方案演进

动态加载 --> DEX内存加载 --> DEX指令抽取 --> 虚拟机加固 --> JAVA2C

3.1.1 DEX内存加载实现原理

Android加壳框架原理为Proxy/Delegate Application,即使用自定义的代理Application类作为程序入口(修改AndroidManifest.xml),在代理Application中完成壳的解密操作,最后启动原来的Application

  • ProxyApplication:框架会提供一个ProxyApplication抽象基类(abstract class),使用者需要继承这个类,并重载其initProxyApplication()方法,在其中改变surrounding,如替换ClassLoader等;
  • DelegateApplication:即应用原有的Application,应用从getApplicationContext()等方法中取到的都是DelegateApplication

修改AndroidManifext.xml入口:

<!-- old AndroidManifest.xml -->
<Application
             android:name=".MyApplication"
             android:icon="@drawable/icon"
             android:label="@string/app_name"></Application>

<!-- new AndroidManifest.xml -->
<Application
             android:name=".MyProxyApplication"
             android:icon="@drawable/icon"
             android:label="@string/app_name"></Application>

代理Application

public abatract class ProxyApplication extends Application {
  protected abstract void initProxyApplication();
  
  @Override
  protected void attachBaseContext(Context context) {
    super.attachBaseContext(context);
    initProxyApplication();
  }
  //...
}

initProxyApplication实现内容:

  1. 内存加载DEX:加载原Application;
  2. ClassLoader设置;
  3. Application引用替换。

3.2 壳启动流程

  • 内存加载DEX文件:通过DalvikART虚拟机JNI接口内存加载被加密隐藏的DEX文件;
  • 设置ClassLoader:将DEX文件内存加载产生的mCookie放入到ClassLoader中(MutiDex);
  • 加载Application:基于替换后的ClassLoader查找原始Application类并生成实例;
  • Application还原:将换API层的所有Application引用替换为原始Application.

image

3.3 DEX加固效果

image

nedexprevent's People

Contributors

tianyalu avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.