android app怎么防止反编译
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android app怎么防止反编译相关的知识,希望对你有一定的参考价值。
APK在PC上面就被看作一个压缩格式文件,在手机上面它就算一个可执行格式文件。两种格式对它的读取要求也有区别,所以说利用这个区别来实现伪加密。对PC端来讲伪加密的APK没法被解包无法被反编译,但是对android系统来说它完全不会影响正常的安装运行(对4.2以前的系统)。伪加密的原理:读取APK的字节,找到连续4位字节标记为”P K 01 02”的后第5位字节,如果是0表示不加密,如果是1就表示加密(伪加密就强行改成1 反伪加密就是把1改成0就可以了)。
2
伪加密前和伪加密后的对比图如下:
伪加密前:
3
伪加密后:
END
使用第三方平台加密
步骤如下:
登录/注册→上传APK→等待系统加密→完成后下载APK→给APK签名→完成!
2
爱加密作为移动安全行业的第三方平台,为Android APP移动应用提供专业的加固保护方案,包括DEX文件保护、资源文件保护、XML主配文件保护、防二次打包保护、so文件保护、内存保护、高级混淆等,全方位保护Android App,防止被反编译、破解等,维护广大开发者朋友的切身利益! 参考技术A
1 说说我自己的经验
我是使用的360加固,你用梆梆加固也行,还有爱加密,百度也有加固,app加固之后反编译很难。
2 android学习手册就是使用360加固
更多问题解决办法请参考android学习手册,例子、源码、文档全部搞定,采用androidstudo的目录结构,360手机助手中下载。下面是截图。
3 下面是防止反编译的原理:
android基于java的,而java反编译工具很强悍,所以对正常apk应用程序基本上可以做到100%反编译还原。因此开发人员如果不准备开源自己的项目就需要知道怎样防止反编译和反编译他人的项目来学习。2.3版本以上在eclipse自动生成的default.properties文件中加上一句“proguard.config=proguard.cfg”可以对代码进行混淆,反编译后是很难看懂的。
2.3之前的SDK版本也没关系,把上面的proguard.cfg文件复制一份放到项目中,然后进行相同的操作即可。
Android - proguard混淆器使用,有引用第三方jar包的时候报错:
You may need to specify additional library jars (using '-libraryjars')
处理方法:在proguard.cfg文件顶部加入
-dontwarn com.motorola.**
-keep class com.motorola.** *;
说明:-dontwarn和-keep结合参数使用来保持第三方库中的类而不乱,-dontwarn com.motorola.**意思是保持com.motorola.**这个包里面的所有类和所有方法而不混淆
-keep class com.motorola.** *;意思是ProGuard不要警告找不到com.motorola.**这个包里面的类的相关引用。对应包名改成你对应的jar包顶层package
详细可以查看官方文档 http://developer.android.com/tools/help/proguard.html
有些应用反编译后java代码用jd-ui根本都无法打开,连混淆的代码都看不到的,本人尝试多次都做不到(网上有说是混淆工具针对反编译工具的),希望知道的告知下怎么处理的。
--注:上面的问题经过本人多次尝试终于找到部分原因了,一.使用的版本比较低,现在最新版的是dex2jar-0.0.9.7,二.dex2jar目录不要有中文的,三.需要把class.dex直接拖到dex2jar.bat,生成 classes.dex.dex2jar.jar。如果生成jar过程中报一堆at com.googlecode.dex2jar.ir.ts.TopologicalSort.dfsRemove(TopologicalSort.java:135)错误的话还是不能打开的,看了下官方的问题报告有很多人有类似的问题,貌似进入了一个死循环,跟apk文件大小有点关系,应该是dex2jar的一个bug。
注意:上面的功能只是把java代码混淆了,xml和资源文件、图片并没有混淆,有些游戏应用图片比较重要需要转换成dat文件 再加上自己的加密解密算法还原。
另外加了混淆功能后还有压缩的功能,混淆后的apk比原来的小(具体比例看你的代码重复量了)
说完防止反编译再来说说怎么反编译吧
先说一下反编译的流程和原理:
1.用apktool 把apk--> 资源包(java代码变成smali文件看不懂的),可以修改资源包里面的文件。
2.apk后缀名改成zip或rar解压,获取 classes.dex 文件,用dex2jar转换成jar包(注:直接解压出来的资源文件是不能直接打开的,要用第一步的反编译工具,dex2jar.bat文件目录不要有中文)。
------------------------------------------
新版使用说明(不用把apk换成zip解压了,可以直接把apk文件拖到dex2jar.bat上--不能包含中文名称)
下载dex2jar最新版http://code.google.com/p/dex2jar/downloads/list
解压dex2jar-version.zip文件到一个目录. 比方说 /home/panxiaobo/, C:\\
unzip -x dex2jar-version.zip -d /home/panxiaobo
使用 dex2jar 来生成 .jar 文件. dex2jar会在someApk.apk所在目录下生成一个someApk_dex2jar.jar文件.
linux sh /home/panxiaobo/dex2jar-version/dex2jar.sh /home/panxiaobo/someApk.apk
windows C:\\dex2jar-version\\dex2jar.bat someApk.apk
--------------------------------------------------
3.用jd-ui等java反编译工具直接查看java代码。
4.把java代码和第一版的资源包整到一起重新组成一个新的应用。
5.用apktool 重新编译。
6.用签名工具重新签名。
7.重新发布带新的签名的应用。
注:如果不用改java代码,只是换换风格和汉化2.3.4步则不用做。
本回答被提问者采纳app加固&apk文件防止反编译&apk打包流程
文章目录
- 【1】加固
- 【2】加固方案的实现方式
- 【3】apk文件构造
- 【3】dex文件构造(分段dex文件加密需要)
- 【4】apk打包流程分析
- 【5】项目构造(加密、解密)暂不涉及逻辑
- 【6】加密流程
- 【7】解密流程
- 【8】使用反编译技术查看
- 【9】完整项目代码
【1】加固
一、为什么要加固
通过反编译apk可以获得dex文件和一些res文件,也可获得相应的java文件,从而也可以达到自定义apk,或者汉化等效果,甚至直接窃取相关机密代码。这对某些apk来说是不安全的,也侵犯了开发者的权益,所以有时会用到app加固技术。
二、加固方案
①免费的第三方加固方案
360加固等
②付费的第三方加固方案SDK
360加固等
③Java IO 流实现AES加密dex
后文【5】、【6】、【7】
【2】加固方案的实现方式
- 反模拟器
- 代码虚拟化
- 加密(dex)
【3】apk文件构造
Android上可直接运行的文件类型是apk文件,它其实是一种zip文件。就好比windows上的exe文件。exe文件在Windows上能直接运行,Android中能直接运行的就是apk
解压后得到:
-
META_INF
目录下存放的是签名信息,用来保证apk包的完整性和系统的安全。生成一个apk包时,会对所有要打包的文件做一个校验计算,并把计算结果放在META-INF目录下。而在Android平台上安装apk包时,应用管理器会按照同样的算法对包里的文件做校验,如果校验结果与META-INF下的内容不一致,系统就不会安装这个apk。这就保证了apk包里的文件不能被随意替换。比如拿到一个apk 包后,如果想要替换里面的一幅图片,一段代码,或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有助于保护系 统的安全。 -
AndroidManifest.xml
是每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等等信息,如要把apk上传到Google Market上,也要对这个xml做一些配置。 -
classes.dex
是java源码编译后生成的java字节码文件。但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容 的,dex文件与class文件相比,不论是文件结构还是opcode都不一样。目前常见的java反编译工具都不能处理dex文件。 -
res
目录存放资源文件。 -
resources.arsc
编译后的二进制资源文件。
【3】dex文件构造(分段dex文件加密需要)
【4】apk打包流程分析
-
①打包资源文件,生成R.java文件
打包资源的工具是aapt(The Android Asset Packaing Tool)在这个过程中,项目中的AndroidManifest.xml文件和布局文件XML都会编译,然后生成相应的R.java,另外AndroidManifest.xml会被aapt编译成二进制。存放在APP的res目录下的资源,该类资源在APP打包前大多会被编译,变成二进制文件,并会为每个该类文件赋予一个resource id。对于该类资源的访问,应用层代码则是通过resource id进行访问的。Android应用在编译过程中aapt工具会对资源文件进行编译,并生成一个resource.arsc文件,resource.arsc文件相当于一个文件索引表,记录了很多跟资源相关的信息。 -
②处理aidl文件,生成相应的.Java文件
这一过程中使用到的工具是aidl(Android Interface Definition Language),即Android接口描述语言。aidl工具解析接口定义文件然后生成相应的.Java代码接口供程序调用。如果在项目没有使用到aidl文件,则可以跳过这一步。 -
③编译项目源代码,生成class文件项目中所有的.Java代码
包括R.java和.aidl文件,都会变Java编译器(javac)编译成.class文件,生成的class文件位于工程中的bin/classes目录下。 -
④转换所有的class文件
生成classes.dex文件dx工具生成可供Android系统Dalvik虚拟机执行的classes.dex文件。任何第三方的libraries和.class文件都会被转换成.dex文件。dx工具的主要工作是将Java字节码转成成Dalvik字节码、压缩常量池、消除冗余信息等。 -
⑤打包生成APK文件所有没有编译的资源
如images、assets目录下资源(该类文件是一些原始文件,APP打包时并不会对其进行编译,而是直接打包到APP中,对于这一类资源文件的访问,应用层代码需要通过文件名对其进行访问);编译过的资源和.dex文件都会被apkbuilder工具打包到最终的.apk文件中。打包的工具apkbuilder位于 android-sdk/tools目录下。 -
⑥对APK文件进行签名
一旦APK文件生成,它必须被签名才能被安装在设备上。在开发过程中,主要用到的就是两种签名的keystore。一种是用于调试的debug.keystore,它主要用于调试,在Eclipse或者Android Studio中直接run以后跑在手机上的就是使用的debug.keystore。另一种就是用于发布正式版本的keystore。 -
⑦对签名后的APK文件进行对齐处理
如果你发布的apk是正式版的话,就必须对APK进行对齐处理,用到的工具是zipalign。对齐的主要过程是将APK包中所有的资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问apk文件时的速度会更快。对齐的作用就是减少运行时内存的使用。
【5】项目构造(加密、解密)暂不涉及逻辑
- 项目中新建module-library,在这个library中application的attachBaseContext方法中实现dex解密逻辑,并且通过反射和类加载机制将解密后的dex动态添加到element数组中(可以参考微信热修复框架)
- app从这个application启动
- aar文件是什么?
aar文件相比apk文件没有签名文件,里面是jar包而不是dex文件,在这里作为壳dex
- 获取aar:
【6】加密流程
-
解压apk文件,过滤得到源dex文件(同时丢掉签名文件META_INF,后续打包后重新签名)
-
通过流操作将dex文件写到自定义目录下面
-
循环所有dex文件对其进行AES字节加密,最后修改dex文件名,以示区分(与未密过的dex文件)
-
将aar文件解密,获取jar包
-
通过jar2dex 将获取的jar转换为dex文件(壳dex)
-
将壳dex通过io输出到上面有加密后dex文件的目录下
至此已经得到了加固项目的整个dex文件,接下来要做的就是利用apktool和keystore进行打包签名。
- 打包、签名
- 得到加固后的apk文件
- 发布
【7】解密流程
- 在壳
module-library
的application
里面的attachBaseContext
里面写解密代码(商用项目中通常hookApplication,因为像我这样操作实际的项目就没有application了
) - 得到解密后的dex
- 参考微信
Tinker
,利用反射和Android类加载机制将解密后的dex动态插入到element数组中。
【8】使用反编译技术查看
使用apktool
拿到加密后得到的classes_.dex
文件之后,用dex2jar
进行转换为jar
包,发现转换出错,加密后的dex不能转换为jar,而没加密的可以得到
- ①得到未加密
classe.dex
的jar
包:
- ②使用jd-jui工具查看源码
- ③dex2jar得到加密后的jar包失败!!!
【9】完整项目代码
如果需要完整项目代码,请评论区留言,留下邮箱。
至此解密流程完成,本文所写仅为个人理解,可能会有多处不正确的地方。
以上是关于android app怎么防止反编译的主要内容,如果未能解决你的问题,请参考以下文章