# reinforce加固

[dex格式](https://jiek.gitbook.io/android/dex)

[decompiler反编译说明](https://jiek.gitbook.io/android/decompiler)

## 原理解析

### 加固需要三个stuff

1. 源Apk
2. 壳Apk
3. 加密工具

### 主要步骤

1. 编译出原包original.apk
2. 编译加固包reinforce.apk
3. 把reinforce.apk的classes.dex解压出来
4. 使用encrypt对classes.dex与original.apk,进行隐藏处理。
5. 使用FQA的修改meta-data方法，把原包的application-name设置上去。
6. 对original.apk或reinforce.apk进行重签名jarsigner。
7. 进行加固包真机测试。以确保apk加固成功。

详情，请参考稍后放进我github上的原代码。<https://github.com/jiek2529/reinforce>

## FQA

1. 使用Application反射加载原应用original.apk时，应用音视频无法识别现象。
   1. 在使用反射时，项目中的 assets res/raw里的音视频资源会无法识别；
   2. 因为在使用MediaPlayer里，会使用到Assetmanager.openNonAssetFdNative 此so方法，会出现无法获取以AssetsFileDescriptor 资源文件描述符的问题
   3. 所以处理此问题的方式：把此类资源转为文件系统文件去使用。

      file:///android\_asset/sound.{ogg|mp3|mp4...}
   4. R.raw\.sound此类方式都在加固后被得无效了。但其它资源还是有效的。
   5. 此文件的根源为Assetmanager.openNonAssetFdNative无法读取文件的资源描述符。
2. AndroidManifest修改meta-data方法
   1. `apktool d original.apk`完成反编译。
   2. 用文本或代码修改需要改的键值，或增减。
   3. `apktool b original`会把反编译的包重编译出来，但可能会有缺陷。
   4. `unzip original/dist/original.apk AndroidManifest.xml`把修改好的此文件弄出来。
   5. `zip -d original.apk AndroidManifest.xml`删除原包的AndroidManifest.xml。
   6. `zip -ur original.apk AndroidManifest.xml`把前面重编译出来的文件更新到原包中去。
   7. 最后使用jarsigner进行重签名，就大功告成了。
