美文网首页
防反编译利器技术框架

防反编译利器技术框架

作者: 佼佼者Mr | 来源:发表于2020-04-07 23:39 被阅读0次

了解APK构建打包流程

构建构成中用到的工具

    aapt/aapt2 android资源打包工具

    aidl android接口描述语言转化为跨进程通信.java文件的工具

    javac java编译器

    proguard 代码混淆工具

    dx/d8 转化.class文件为Davik VM能识别的.dex文件

    apkbuilder 打包生成.apk文件

    jarsigner 签名工具

    zipalign 字节码对齐优化工具 

AAPT : Android Asset Packaging Tool 

第一步:资源合并(本地资源,第三方arr库)

第二部: 资源文件编译assets,AndroidManiFest.xml,res.生成R.java文件,赋予每一个非assets文件一个id,以常量的形式定义于R.java文件,生成resources.arsc文件,用来描述那些具有ID值的资源配置文件信息,他的内容就相当于是一个资源索引表,包含了所有的id值的数据集合,在该文件中,如果某个id对应的是string,那么该文件会直接包含该值,如果id对应资源是某个layout或者drawable资源,那么该文件会存入对应资源的路径。

resources.arsc文件可以通过Android studio中的Analyze apk功能查看文件结构

aidl文件编译

aidl:android interface Definition Language

aidl工具解析接口定义文件,然后生成相应的Java代码接口供程序调用,如果在项目中没有用到aidl,则不会走到这一步

输入:aidl后缀的文件,位于工程src/main/aidl目录。

输出:可用于进程通信的C/S端java代码,位于build/generated/source/aidl.

java源码编译

R.java和aidl生成的Java文件,再加上工程的源代码,使用javac编译生成的class文件

输入 java源码文件夹(另外还包括了aapt生成的R.java,aidl生成的文件,以及BuildConfig.java)。

输出 对于gradle编译,生成的class文件保存在build/intermediates/classes.

proguard 代码混淆

javac完成代码编译后,一般还会对源码进行混淆,类似于加密。目的是为了增加反编译的难度,同时也将代码名称进行缩短,减少代码占用体积

输入:编译后的.class文件,混淆规则配置文件proguard-rules.pro

输出:被混淆后的.class文件,混淆前后的映射文件

转化为DEX文件

dx工具生成可供系统虚拟机可以执行的classes.dex文件,dx会将class转化为Dalvik字节码,生成常量池,消除冗余数据

输入:所有的.class文件

输出:classes.dex文件

打包apk文件

打包生成APK文件,旧的apkbuilder脚本已经废弃,现在通过sdklib,jar的ApkBuilder类进行打包。

输入:ap_资源包文件,classes.dex文件,未编译的资源文件(assets资源等),libs等文件

输出:apk文件

签名apk文件

队apk文件进行签名,文件签名后设备才会允许安装

输入 上一步骤的apk文件、签名文件(Debug Release KeyStore)

输出 签名后apk文件

zipalign优化

zipalign对签名后的apk文件进行对齐处理,使APK中所有资源文件距离文件起始偏移为4字节倍数,从而在通过内存映射访问apk时会更快,同时也减少了设备在运行时内存的耗损

输入:签名后的apk文件

输出:对齐优化后的apk文件

APK典型文件

AndroidManiFest.xml  程序全局配置文件表

classes.dex Davilk字节码

resources.arsc 资源索引表

META-INF 该目录下存放的是签名信息

res 该目录存放的是资源文件

assets 该目录下存放的是一些配置或资源文件

关联技术

APK加固

资源混淆

热修复

插件化

快速多渠道打包

Dex文件编译流程

java文件源码编译   通过javac将源码编译为class文件

多DEX分包 脚本将类根据一些规则划分到主dex和从dex中,生成配置文件

proguard优化混淆 对.class文件进行压缩、优化、混淆处理

转化为为dex文件 dx/d8将.class文件转化为dex文件

了解DEX编译过程与MultiDex方案原理

MultiDex方案背景

64K引用限制

原因:DexOpt优化的限制    早期的Android系统中的DexOpt会把每一个类的方法id检索起来,存在一个链表结构里面,链表的长度是由short类型来保存的,导致了方法id的数目不能超过65536个。

dalvik  bytecode的限制

dalvik的invoke-kind指令集,设置16bit表示方法的引用数,最大值为65536,invoke-kind

Android 5.0以前  使用dalvik可执行    文件分包支持库

Android 5.0以后默认支持从apk文件加载多个DEX文件

了解proguard混淆与防反编译

混淆的目的  加大反编译的难度

配置  在build.gradle中配置

常见的混淆配置

keep 用来保留Java的元素不进行混淆

-keep 保留类和类中的成员,防止他们被混淆或移除

-keepClassmembers 只保留类中的成员,防止他们被混淆和移除

-keepClasseswithmembers 保留类和类中的成员,防止他们被混淆或移除,前提是指名的类中的成员必须存在,若不存在还是会混淆

dontwarn

引入的library可能存在一些无法找到的引用和其他问题,在build中可能会发出警告会导致build终止,因此为了build继续进行,需要dontwarn处理这些无法解决的library的警告。

需要keep的情况

enum枚举

Android 四大组件

自定义控件,集成view的类

实现了Parcelable接口

序列化和反序列化的类

反射的成员变量或者方法(包括jni,js中的反射)

注解

Native方法

第三方sdk

反编译工具对抗

花指令 在原始程序中插入一组无用的字节,但又不会改变程序的原始逻辑,程序仍然可以继续运行,然而反编译工具在反编译的时候这些字节会出错,造成反汇编工具失效,提高破解难度,

资源混淆

修改aapt

修改aapt处理资源文件相关的源码,参考proguard方式对APK中资源文件名使用简短无意义名称进行替换,给破解者造成困难,从而做到资源的相对安全  

修改resources.arsc

根据resources.arsc文件格式,修改资源名与路径的映射关系。

相关文章

网友评论

      本文标题:防反编译利器技术框架

      本文链接:https://www.haomeiwen.com/subject/axxephtx.html