前言
继上篇实现了自己的hook工具后,如果想要把这些代码投入业务中,还需要做好安全防护。
自觉初出茅庐,水平足以对已有的知识进行梳理。
本文总结了操作简单,效果良好的java层和native层的加密和混淆。
本文无图,MD 插个图太烦了
native层保护
1. ollvm混淆
Armariris比起官方版ollvm,少了bcf伪造控制流,多了字符串加密,强度也略高于其他方案的字符串加密。
日后有空可以进行整合,毕竟ollvm源码思路清晰。 ## 2.隐藏符号表
app的gradle文件中添加cflags
defaultConfig {
...
externalNativeBuild {
cmake {
cppFlags "-fvisibility=hidden"
}
}
...
} ## 3.section加密 [Android逆向之旅—基于对so中的section加密技术实现so加固](http://www.520monkey.com/archives/563)
section加密的样本很多,大多可以通过F8大神的SoDumpHelper来dump。
所以要在loader中做调用者检测 比如类名检测 ## 4.反调试技巧 [【SO壳】17种安卓native反调试收集](https://bbs.pediy.com/thread-223460.htm) ## 5.加密关键方法的context检查(防黑盒调用) [攻击侧例子 使用Unicorn Engine绕过混淆完成算法的调用](https://bbs.pediy.com/thread-225018.htm) 1.首先,关键加解密方法应传入context对象作为参数。 2.context对象可以在读取文件、获取设备信息等时候使用。 3.检测函数可以通过内联,ollvm等方式,和加密逻辑复杂的结合在一起,使其找不到检测函数首地址,不便于hook。 ## 6.签名检查 自身CRC(或学习数盟 只检查随机部分字节) ## 7.native层hook检测 我们首先看看美团与众不同的地方是怎么做的。 - 环境检测 美团在/data/data/美团包名/lib下查找libsubstrate.so libiohook.so libva++.so 三个文件 (其实这里做的不是最好,可疑文件和策略都应该在服务器下发) 然后遍历每个so文件,使用 ```bash strings %s/%s|grep -E 'GodinHook|SubstrateHookFunction ``` 命令寻找so文件中的关键字 攻击侧应对:注入后删除/不放在这个目录注入/zygote注入
java层保护
1.超强空白混淆
空白混淆实现-珍惜Any
此贴内容其实只有普通的空白混淆,还没有做到极致的suck
NameFactory里既然可以放简单的abcd,也可以放简单的字符,为什么不能放一个长一点的字符串呢?
2.字符串加密
Android安全防护之旅—字符串批量加密工具(AndStringGuard)原理介绍
3.反jadx字节码trick(仿美团)
通用保护技巧
1.检查调用栈(不止找xposed 还可找脱壳插件特征)
2.检测maps里的module
3.仿反作弊SDK的设备指纹验证
4.风险APP检查
-1.SafetyNet 不存在的google play
to be continued 挖坑真tm有意思