Skip to content

Latest commit

 

History

History
118 lines (74 loc) · 5.48 KB

README_zh.md

File metadata and controls

118 lines (74 loc) · 5.48 KB

English

中文

追求极致的代码安全性保障

  • ndk实现AES加密,性能不佳,已废弃此方式, 如果您仍旧需要该算法,check out tag: v2.2.
  • 使用CHACHA20加密,TLS1.3也在移动端用了CHACHA20了,性能对ARM架构CPU更好。
  • 使用JniOnload 隐藏C函数
  • 使用签名校验避免被再次打包(这是绕过破解加密算法直接调用你的jni函数)
  • key存在符号表中,同时隐藏字符表 该方案已经废弃,废弃原因issues5
  • 手工处理隐藏key,最复杂的方案:将密钥分成不同的几段,存储在不同的代码中,最后将他们拼接起来,可以将整个操作写的很复杂,增加逆向难度。(目前代码里用的是稍微简单的方案)
  • 使用obfuscator扰乱C的代码,关于破解obfuscator
  • 增加obfucator对x86的支持,具体配置obfucator的教程底部有链接。
  • 反动态调试 , 目前代码里是比较简单的方案, 有更复杂更高明的方案,比如:每次执行加密解密签先去判断是否被trace,想要更复杂的自己fork之后去写
  • 代码运行时屏蔽模拟器 :代码来自我的另外一个仓库Check_Emulator_In_NDK
  • TODO:防止so代码被code inject

尝试编译,并跑起来

click to open 1.准备:

运行这个shell :

./build_libsodium_for_all_android_abi.sh 当你初次运行该脚本, 一些错误你可能会看到:

env: python: No such file or directory
...
See "config.log" for more details or others.

这些都是一些基础依赖需要安装到电脑,您可以尝试复制该错误信息,进行Google搜索。

2.打开AS运行app,从adb/AS里看日志。

集成

click to open a.先配置local.properties中ndk.dir 要求使用ndk版本必须11-13b,新版本ndk没有测试过,或许不能编译通过。

b.集成到项目中请修改类名方法名,不要暴露加密算法,自行修改key存储到代码里的方案.

b.1. 生成 chacha20 key:

run test_in_exexutaing.sh,然后请看logcat. 我用C语言随机生成的key & nonce会显示出来. 你需要粘贴到 JNIEntry.c.

c.生成和修改签名.

c.1.生成keystore

# my generate record:
mkdir keystore
cd keystore/
keytool -genkey -alias client1 -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -storetype PKCS12 -keystore ./androidyuan.keystore

c.2.用java取得当前keystore的hash值,并修改native代码中的包名和hash

用[getSignature()](https://github.com/BruceWind/AESJniEncrypt/blob/519a4f16ee0a61b05f8dd41419e3fe61836ee5c7/aesjni/src/main/java/com/androidyuan/aesjni/SignatureTool.java#L26)打log取出之后,然后写入到C文件中,重新build项目。

集成到自己项目中请先修改check_signature.h中的keystore hashcode和包名。

鸣谢

  1. Libsodium 算法 来自:https://github.com/jedisct1/libsodium
  2. Native代码混淆器:obfuscation-o-llvm-ndk

注意 : SO会变大的问题

未混淆的so 已混淆的so

对比: 混淆后的so是混淆前的三倍大小。

如果SO文件大小对您的项目有影响,你可以选择停用SO扰乱的,因为还有其他安全检查。

补充:

因为需要做签名校验,所以无法提供jcenter依赖了,望见谅!!

不管代码安全性多高,我依旧反对key存到代码里。

有问题及时提:new issues

想要编译出混淆过native代码的so需要修改aesjni/build.gradle文件中的externalNativeBuild,并配置NDK下的Obfuscator-LLVM。

这是我的NDK配置混淆器教程:Obfuscator-LLVM-4.0-BUILD-NDK.

如果您觉得配置Obfuscator-LLVM太难,我推荐您使用docker : github.com/nickdiego/docker-ollvm.

其他语言怎么配合加解密?

如果你遇到了崩溃,请看FigureOutJNICrash.md,这个是个so崩溃定位的教程。


合规

如果你生活在中国,请注意工信部整治八项违规. 我调用了PackageManger检查签名,我只是读取当前安装的app, 这可能被认为收集了安装列表。从规定上来讲并不违规,只是读取了,并没收集,收集是违规的,读取是合规的。 只是目前有可能被误认为收集

贡献者

https://github.com/larry19840909

https://github.com/zxp0505

https://github.com/baoyongzhang