十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
android源码被混淆了还原方法为:
网站建设哪家好,找创新互联建站!专注于网页设计、网站建设、微信开发、小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了扎赉诺尔免费建站欢迎大家使用!
1、得到 classes.dex文件;直接用机器上的解压软件 打开 .apk 文件,解压出 classes.dex 文件。
2、还原.jar文件;这一步需要用到一个工具 dex2jar (谷歌的代码库里有)下载完了,解压,然后把第一步的 产物(即那个classes.dex文件)放到 dex2jar的解压目录(解压目录里 有 dex2jar.bat 文件,检查一下,没有的话说明目录不对)。
3、查看.jar文件;这一步就是传统的 反编译 了,需要工具辅助,这里用到的工具是jd-gui()下载系统对应的版本,解压,(xp系统)会看到一个 .exe文件,没错就是 单文件绿色版,双击,选择 第二步 生成的 .jar,即可。
其实不要混淆的主旨就在于混淆会改变方法的名字,类的名字,但是对于外部的一些引用是通过名字找到对应的方法,类,这些可能是通过string找到方法,类,但是string里的字段是不会进行混淆,所以还是会保留原来的名字,这样混淆过后通过原来的名字去找混淆后的名字,是肯定找不到,所以就会报出nosuchfileException,(对于gson,反射,jsbridge,第三方库都是这个原因),至于说枚举类型,我还暂时没懂 为什么,还望共同学习,一起成长。
文章是读了两篇博客写出来,也是自己总结,消化成自己的知识了,若有什么错误的地方,还望指出,相信读了这两篇文章之后你也会懂混淆,一个是如何混淆,一个是哪些该混淆,为什么不能混淆
-keepclasseswithmembernames class * { # 保持native方法不被混淆 native methods; }
-keep class * implements Android.os.Parcelable { # 保持Parcelable不被混淆 public static final Android.os.Parcelable$Creator *; }
发布一款应用除了设minifyEnabled为ture,你也应该设置zipAlignEnabled为true,像Google Play强制要求开发者上传的应用必须是经过zipAlign的,zipAlign可以让安装包中的资源按4字节对齐,这样可以减少应用在运行时的内存消耗。
原文:
其实不要混淆的主旨就在于混淆会改变方法的名字,类的名字,但是对于外部的一些引用是通过名字找到对应的方法,类,这些可能是通过string找到方法,类,但是string里的字段是不会进行混淆,所以还是会保留原来的名字,这样混淆过后通过原来的名字去找混淆后的名字,是肯定找不到,所以就会报出nosuchfileException,(对于gson,反射,jsbridge,第三方库都是这个原因),至于说枚举类型,我还暂时没懂 为什么,还望共同学习,一起成长。
文章是读了两篇博客写出来,也是自己总结,消化成自己的知识了,若有什么错误的地方,还望指出,相信读了这两篇文章之后你也会懂混淆,一个是如何混淆,一个是哪些该混淆,为什么不能混淆
混淆apk是一个很基础的工作,博客上也有一堆介绍,本文提供一下这类工作的解决思路。在安卓源码下面和android studio里面的做法差异不大,本文以android源码举例。
首先在对应mk文件里面添加proguard enabled的语句,系统有一个自带的build/core/proguard.flags,默认是使用这个文件,而且一般项目默认是关闭的,这也是有原因的。因为这里的proguard.flags是没有针对app的配置的,使用默认的混淆,app很有可能就不工作了。
添加了mk文件修改之后,在Android.mk同级根目录创建本app自有的proguard.flags。新增内容如下,这里需要注意,网上很多demo,基本分为三部分,一部是保留app基础功能部分的内容不混淆;2是保持app对外接口,例如get、set、isxx、AIDL、public、native层的接口或者类;3.是第三方jar包或接口。混淆的基本原理就是将上诉类或接口进行统一简单字母的替换,如果改变了这些对外接口的名字,很有可能被别人使用的时候就找不到对应哦接口
一些第三方的库如何不进行混淆,这个根据项目特点,可以自行搜索,比如百度的地图包什么的。
然后是如何验证和解决混淆过程遇到的问题,因为是对接口名进行替换,如果出现混淆问题的话,log里面一定会有类似
这个时候只需要对相关接口进行例外(-keep)即可,然后用android-studio,直接打开或者dex2jar进行反解可以看到相关的接口是否被简单替换。
简单来说,Android 进行ProGuard,可以起到压缩,混淆,预检,优化的功能,虽然不能说更安全但还是一个不容忽视的环节。
首先在build.gradle 中将混淆的开关打开,即 minifyEnabled 置为 true
然后就要去proguard-rules.pro写入我们的混淆的规则(如文件其名),防止重要的类被混淆移除了。
省事第一步,先套个模板,就是找到网上博客上别人分享好的模板,像四大组件,主流开源库,JNI调用本地方法,R资源等的混淆规则都一般有了,注意一点就是套模板,也要套个时间比较近的,没有翻车的模板,可以能比较节省自己的时间,毕竟这么多行不一定能快速看出来,打个包出来才发现有问题就尴尬啦。
一般来说,用了混淆的模板后,我们还会有很多项目专属的需要混淆的部分,例如我们的自定义View,Json解析的实体类,反射用到的类,还有我们依赖的非主流的开源框架,SDK等等。
对于自定义View,很多的模板都会将继承与View的类用keep指令防止被混淆。有个偷懒的方法就是把自定义View 放入同一个包,再把这个包的类都写入混淆规则,就可以搞定了。
对于Json解析的实体类,反射用到的类都是同理可得,找到那些不能被移除的,把它们写入自己的混淆规则里面。
所以如果在做项目时,有提前想到要给项目做混淆的,在导入依赖时就顺手把对应混淆规则写了,那事后就快活似神仙了。
首先,先判断下它是否内置了混淆规则。如果不声明它的混淆规则也正常运行,说明已经它带了混淆。
但是生活往往不会一帆风顺,一般来说会有各种报错,所以还是需要对它声明混淆。
最简单的办法就是找到依赖的这个包,就这个包的类都写入混淆规则。例如:
项目里导入了一个非主流的开源库,然后我需要对它写入混淆规则,确保它能正常工作。
这时候不可以认为直接去使用它的地方,将有关它 import的类 keep class 就可以。
因为可能它内部还会使用包内其他类,所以最好仔细排查,最简(tou)单(lan)就是把这个包的类都 用 keep 指令,防止它们被混淆。如下所示:
一般来说就可以防止这个开源库里的类被混淆了。
例如
先使用 -libraryjars 命令 ,对导入的jar包和 so 文件进行声明保留它们。
如果依旧出错,尝试去External library文件夹 或者使用 这个SDK的地方 找到这个 SDK的包找到,并把这个包里的类 都用 keep 指令保持不被移除。如:
根据包名,写入混淆规则
一般来说,这样就可以避免这个SDK的类被混淆啦
好了,最后附上一份自己做的项目的混淆规则(伪模板)
代码混淆(code obfuscation)是指将计算机程序的代码,转换成一种功能上等价,所谓功能上的等价是指其在变换前后功能相同或相近。其解释如下:程序P经过混淆变换为P‘,若P没有结束或错误结束,那么P’也不能结束或错误结束;而且P‘程序的结果应与程序P具有相同的输出。否则P’不是P的有效的混淆。
目前对于混淆的分类,普遍是以Collberg 的理论为基础,分为布局混淆(layout obfuscation)、数据混淆(data obfuscation)、控制混淆(control obfuscation)和预防混淆(preventive obfuscation)这四种类型。
1. 布局混淆
布局混淆是指删除或者混淆软件源代码或者中间代码中与执行无关的辅助文本信息,增加攻击者阅读和理解代码的难度。软件源代码中的注释文本、调试信息可以直接删除,用不到的方法和类等代码或数据结构也可以删除,这样即可以使攻击者难以理解代码的语义,也可以减小软件体积,提高软件装载和执行的效率。软件代码中的常量名、变量名、类名和方法名等标识符的命名规则和字面意义有利于攻击者对代码的理解,布局混淆通过混淆这些标识符增加攻击者对软件代码理解的难度。标识符混淆的方法有多种,例如哈希函数命名、标识符交换和重载归纳等。哈希函数命名是简单地将原来标识符的字符串替换成该字符串的哈希值,这样标识符的字符串就与软件代码不相关了;标识符交换是指先收集软件代码中所有的标识符字符串,然后再随机地分配给不同的标识符,该方法不易被攻击者察觉;重载归纳是指利用高级编程语言命名规则中的一些特点,例如在不同的命名空间中变量名可以相同,使软件中不同的标识符尽量使用相同的字符串,增加攻击者对软件源代码的理解难度。布局混淆是最简单的混淆方法,它不改变软件的代码和执行过程。
2. 数据混淆
数据混淆是修改程序中的数据域,而对代码段不作处理。常用的数据混淆方式有合并变量、分割变量、数组重组、字符串加密等。
合并变量是将几个变量合并为一个数据,原来的每个变量占据其中一个区域,类似于一个大的数据结构。分割变量则是将一个变量分割为两个变量,对分割前后提供一种映射关系,将对一个变量的操作转化为对分割后两个变量的操作。
数组重组有数组的分割、合并、折叠和平滑等几种方式。分割是将一个数组分成2个或多个相同维度的数组;合并则相反;折叠是增加数组的维数;平滑则是相反。
在ELF文件中,全局变量和常量字符串存放在数据段中,反汇编工具可以轻易查找到字符串与代码之间的引用关系。在软件破解中,通过一些字符串提示可以很方便的找到代码关键语句,从而破解软件。字符串加密则可以对这些明显的字符串进行加密存储,在需要时再进行解密。
3. 控制混淆
控制混淆也称流程混淆,它是改变程序的执行流程,从而打断逆向分析人员的跟踪思路,达到保护软件的目的。一般采用的技术有插入指令、伪装条件语句、断点等。伪装条件语句是当程序顺序执行从A到B,混淆后在A和B之间加入条件判断,使A执行完后输出TRUE或FALSE,但不论怎么输出,B一定会执行。
控制混淆采用比较多的还有模糊谓词、内嵌外联、打破顺序等方法。
模糊谓词是利用消息不对称的原理,在加入模糊谓词时其值对混淆者是已知的,而对反混淆者却很难推知。所以加入后将干扰反汇编者对值的分析。模糊谓词的使用一般是插入一些死的或不相关的代码(bogus code),或者是插入在循环或分支语句中,打断程序执行流程。
内嵌(in-line)是将一小段程序嵌入到被调用的每一个程序点,外联(out-line)是将没有任何逻辑联系的一段代码抽象成一段可被多次调用的程序。
打破顺序是指打破程序的局部相关性。由于程序员往往倾向于把相关代码放在一起,通过打破顺序改变程序空间结构,将加大破解者的思维跳跃。
4. 预防混淆
预防混淆一般是针对专用的反编译器设计的,目的就是预防被这类反编译器反编译。他是利用特定的反编译器或反混淆器的弱点进行专门设计。预防混淆对于特定的反编译器非常有效,所以在使用时要综合利用各种反编译器的特点进行设计。