混淆
安全防护 减小包大小
代码混淆
- classes.dex + dex2jar -> jar-> jd-gui
- apktool -> smali
资源混淆
类似Java Proguard,但是只针对资源,将原本冗长的资源路径变短
签名
没有签名apk不能安装,每个app都有一个唯一签名。同一包名不同签名不允许。
debug有个默认签名文件进行签名。
为了防止二次打包,检查签名。都二次打包改代码了,干掉检查很难?
APK签名机制
数字签名
- 确保消息来源
- 确保消息不被篡改
S : 发送者 R : 接收者
\[S\xrightarrow{\mathrm{公钥}}R\] \[S\xrightarrow{\mathrm{原始消息}\;+\;\mathrm{私钥加密}(\mathrm{消息摘要})\;}R\] \[R\;\left\{\begin{array}{l}\mathrm{原始消息}\;\xrightarrow[{}]{}\mathrm{摘要}A\\\mathrm{加密摘要}\xrightarrow[\mathrm{公钥解密}]{}\mathrm{摘要}B\end{array}\right.\]对比摘要A 和摘要B是否一致 不能确保正确的公钥->数字证书
sign
jarsign , signapk
用keytool
生成keystore
使用 jarsign
进行签名
签名检查
class.dex CRC
反调试
反IDA
TracerPid > 0
反Android
xml android:debuggable=True
调试器
模拟器
Android组件安全
Activity
串谋权限攻击
防止被外部利用
劫持
Broadcast Receiver
发送安全
Service
Content Provider
数据安全
外部存储
权限
solve
内部存储
MODE_PRIVATE linux 权限 通过root/等更高权限可以破解
MODE_WORLD_READABLE
其他
apk 加固
解
合并
脱壳流程
summary
- 源APK
- 脱壳APK = 壳dex + 壳rest
- 加密解密程序encrypt/decrypt(可以使用native来做)
加壳 classes.dex = encrypt(源APK) + 壳dex APK = sign(classes.dex + 壳rest)
脱壳 run : APK-> classes.dex -> decrypt(加密源APK) -> 加载源APK
so
好难弄懂
so加载过程
init_array
段是在so加载的时候执行的 执行顺序要优先于 JNI_OnLoad 所以这里是最早被执行的函数 把反调试和so的解密放到这里是比较好的选择。
JNI_OnLoad
apk 签名检验
1 |
|
调用
1 |
|
动态注册