写在前面
这是一个朋友的经历记录了下来。朋友开发完了一个公司的app,过了一段时间,在清理电脑空间的时候把该app的项目目录给删了,突然公司针对该app提出了新的需求,这不完了?幸好有之前打包好的apk,所以可以通过逆向去弥补…..
Apk文件结构
apk的本质是压缩包,apk解压后会生成下列所示文件夹
- Assets:存放的是不会被编译处理的文件。
- Lib:存放的是一些so库,native库文件
- META-INF:存放的是签名信息,用来保证apk的完整性和系统安全。防止被重新修改打包。
- res:存放的资源文件,图片、字符串、颜色信息等
- AndroidManifest.xml:是Android程序的配置文件,权限和配置信息
- Classes.dex:Android平台下的字节码文件。
- Resources.arcs:编译后的二进制资源文件,用来记录资源文件和资源ID的关系
逆向
这里用了逆向神器——jdax。支持命令行和图形化界面,地址如下:
下载好之后,直接解压后打开exe,将apk文件拖入进去就可以,图形化界面,更方便搜索查看,可以看到下列文件夹
先看资源文件,asset存放的是静态资源文件,一般不会被压缩,但是会占用更多的安装包空间,res文件是由Android目录下的res进行压缩得到的,所以里面的文件直接解压打开会乱码,在这个工具里打开是正常的。
话不多说直接找回我的代码,找到我写的一个类,拷贝回去,补齐里面缺失的资源文件和一些新增的接口,跟着自己之前开发的流程,一步一步的找回去,发现其中局部变量在编译的时候都被进行了优化,以便缩小体积
找到我写的最核心的代码,发现被混淆了,我在代码里没有进行代码混淆配置,还是被一些工具给我进行了混淆,只能凭借着记忆去还原了。
终于进行了不到一天多的时间,把所有的代码还原了,然后自测通过。
代码混淆
现在其实也可以看到自己的程序是非常危险的,任何人拿到我的apk进行一个逆向就可以看到大概的逻辑。所以要在Android中进行代码混淆的配置。
项目中如果含有多个module时,在主app中设置了混淆其他module都会混淆,在build.gradle中配置下列代码 proguardFiles getDefaultProguardFile
1 | java复制代码android { |
这里代表的是混淆文件,我们在项目里找到proguard-rules.pro,这里就是混淆规则,规定了哪些代码进行混淆,哪些不进行混淆。混淆规则一般有以下几点:
- 混淆规则,等级、预校验、混淆算法等
- 第三方库
- 自定义类、控件
- 本地的R类
- 泛型 注解 枚举类等
示例配置如下:
1 | ruby复制代码 |
再次打包,然后打开apk后就会发现包名类名变量名都变得很奇怪。
这样代码混淆就完成了。
本文转载自: 掘金