博客
关于我
Android DEX加固方案与原理
阅读量:488 次
发布时间:2019-03-07

本文共 2212 字,大约阅读时间需要 7 分钟。

Android应用反编译威胁及保护方案

一、反编译威胁

通过对Android应用程序反编译,攻击者可能辗转回收源代码,进而钓取应用的核心业务逻辑和敏感数据。现代反编译工具已比较成熟,能够破解APK包装,挖掘代码隐藏、协议解析以及自动化分析潜在漏洞。这些威胁主要表现在以下几个方面:

  • 逆向分析:通过分析.dex、.class文件,逆向推断原始开发者意图,挖掘应用程序的安全漏洞和潜在接口。
  • 二次打包:通过伪编译、脱壳技术,将源码或查询结果重新打包,进行破解、插桩、广告植入。

二、保护方案

针对上述反编译威胁,开发者可以采用多层级加固方案,从代码层面进行防护和优化:

  • 代码混淆

    • 对Java代码进行字节码混淆,使用插桩技术加密关键逻辑代码。
    • 对C/C++代码进行预处理,随机更名、代码加密等。
    • 对HPAMC生成的JavaScript和HTML代码进行动态加密,保护敏感业务流程。
  • 应用加固

    • 利用Android的Dex文件格式特点,通过多dex分包和加密技术,保护核心代码。
    • 将防护逻辑封装到库文件(SO文件)中,防止反编译破解。
  • 三、应用构建工具

    在Android应用开发和打包过程中,可以使用以下工具和技术:

    • Android Studio:提供强大的反编译工具链和代码分析功能。
    • ProGuard:一个开源的代码保护工具,能够实现类级的密封和混淆,加密核心逻辑。
    • R8:由Google推出的ProGuard的替代工具,能够更高效地进行代码优化和混淆。
    • JavaCreator:提供语法分析和代码变换功能,支持多种代码加密方式。
    • FFB++:一个强大的C/C++加密工具,支持多种加密模式和保护机制。

    四、编译流程

    对于一个普通的Android项目来说,源代码需要经历以下几个步骤编译:

  • Java源码编译:使用javac编译Java源代码,生成.class文件。
  • 多dex分包:对编译后的类文件根据需要划分到主DEX和从DEX中,生成相应的分包策略文件。
  • ProGuard优化/mixing:对生成的.class文件进行优化、压缩和混淆处理。
  • 转化为DEX文件:使用Dalvik的d8工具,将优化后的.class文件转换为.dex文件。
  • 五、DX加固方案演进

    随着加固需求的增加,DX加固方案也在不断演进。为了应对进攻性反编译技术,本文将详细介绍几种当前比较领先的加固方法和改进思路:

  • 动态加载

    • 将核心业务逻辑分离到单独的Dex文件中,通过服务器端提供的接口动态加载至应用。
    • 优势:能够在一定程度上降低加固后的文件体积,提高应用运行效率。
    • 缺点:动态加载的文件可能会因为网络延迟或者中断导致应用崩溃,需要额外处理网络稳定性问题。
  • Dex内存加载

    • 将加固后的Dex文件根据虚拟机(NDK中Dalvik或ART)的支持方式,直接在应用内存中加载并解析。
    • 优势:通过模拟应用启动的生命周期,让加固后的逻辑在原应用运行时感知不到任何差异。
    • 缺点:大量使用内存加载技术可能导致内存泄漏风险增加,需要谨慎处理生命周期管理。
  • Dex指令抽取

    • 提取Dex文件中关键方法的指令集,在运行时创建特殊的内存段,解析并执行抽取的指令集。
    • 优势:能够在一定程度上保护源码的完整性,但由于指令集的简化,难以应对更为复杂的反编译攻击。
    • 缺点:反编译工具发展一旦达到一定水平,此类方法可能被攻破。
  • 虚拟化加固

    • 以实现一个像虚拟机一样的Dex运行环境,在主应用运行时,通过自定义的虚拟机加载和执行被加密的逻辑代码。
    • 优势:能够有效提升反编译攻击门槛,迫使攻击者破解整个虚拟化框架才能获取核心逻辑信息。
    • 缺点:增加了资源占用和执行效率的负担,每个Dex方法都需要经过虚拟机进行解释执行。
  • Java2C加固

    • 将Java代码转换为本地(JNI)实现,最终编译成.so文件。
    • 优势:提升应用性能和运行效率,在本地执行时避免了解析解析的开销。
    • 缺点:需要红外开发经验和环境支持,且否则本地代码的安全性和可维护性也有所考量。
  • 六、Dex内存加载的实现原理

    对于Dex内存加载的碰撞实施方案,其核心原理包括以下几个方面:

  • 框架原理

    • 使用代理机制对原始Application进行包装。
    • ProxyApplication作为代理入口,负责解密和初始化加固Dex文件。
    • DelegateApplication负责管理原始应用的生命周期。
  • 代理初始化

    • 端否改动AndroidManifest.xml,使用自定义的ProxyApplication作为应用程序入口。
    • 通过代理Characteristic的方式,针对ClassLoader、Application引用等进行处理,确保加固逻辑不会被轻易解码和逆向分析。
  • 壳启动流程

    • 内存加载Dex文件:利用Dalvik或ART的JNI接口,实现被加密或隐藏Dex文件的动态加载。
    • 类加载器设置:将加密解密的Dex文件对应的mCookie设置入新的ClassLoader中。
    • 应用启动:通过替换后的ClassLoader,加载原始的DelegateApplication类并生成实例。
    • API代理:将系统的Application引用替换回原始类型,确保在集成层面的接口原生性。
  • 这种Dex内存加载的方案结合代理框架的优势,能够在应用程序运行时透明化地加载加固代码,有效降低反编译风险,同时保证应用程序的正常运行和性能表现。

    转载地址:http://isfjz.baihongyu.com/

    你可能感兴趣的文章
    linux补充权限:rwt rwT rws rwS 特殊权限
    查看>>
    shell脚本获得当前日期前一个月的日期
    查看>>
    linux centos6.4 磁盘分区、格式化、挂载
    查看>>
    Installing ESXi - fatal error 6 (Buffer too small)
    查看>>
    【CCNA】之配置DHCP
    查看>>