- 对本书的赞誉
- 前言
- 基础篇
- 第 1 章 Android 中锁屏密码加密算法分析
- 第 2 章 Android 中 NDK 开发
- 第 3 章 Android 中开发与逆向常用命令总结
- 第 4 章 so 文件格式解析
- 第 5 章 AndroidManifest.xml 文件格式解析
- 第 6 章 resource.arsc 文件格式解析
- 第 7 章 dex 文件格式解析
- 防护篇
- 第 8 章 Android 应用安全防护的基本策略
- 第 9 章 Android 中常用权限分析
- 第 10 章 Android 中的 run-as 命令
- 第 11 章 Android 中的 allowBackup 属性
- 第 12 章 Android 中的签名机制
- 第 13 章 Android 应用加固原理
- 第 14 章 Android 中的 so 加固原理
- 工具篇
- 第 15 章 Android 逆向分析基础
- 第 16 章 反编译神器 apktool 和 Jadx
- 第 17 章 Hook 神器 Xposed
- 第 18 章 脱壳神器 ZjDroid
- 第 19 章 Native 层 Hook 神器 Cydia Substrate
- 操作篇
- 第 20 章 静态方式逆向应用
- 第 21 章 动态调试 smali 源码
- 第 22 章 IDA 工具调试 so 源码
- 第 23 章 逆向加固应用
- 第 24 章 逆向应用经典案例分析
- 第 25 章 Android 中常见漏洞分析
- 第 26 章 文件加密病毒 Wannacry 样本分析
8.2 签名保护
Android 中的每个应用都有一个唯一的签名,如果一个应用没有被签名是不允许安装到设备中的,一般在运行 debug 程序的时候也是有默认的签名文件的,只是 IDE 帮开发者做了签名工作,在应用发版的时候会用唯一的签名文件进行签名。那么在以往的破解中可以看到,有时候需要在反编译应用之后,重新签名再打包运行,这又给很多二次打包团队谋取利益提供了一种手段。就是反编译市场中的包,然后添加一些广告代码,最后使用自家的签名重新打包发布到市场中,因为签名在反编译之后是获取不到的,所以只能用自己的签名文件去签名,但是在已经安装了应用设备再去安装一个签名不一致的应用会导致安装失败,这样也有一个问题就是有些用户安装了这些二次打包的应用之后,无法再安装正规的应用了,只有卸载重装。根据这个原理可以利用应用的签名是唯一的特性做一层防护。
为了防止应用被二次打包,在程序入口处添加签名验证,如果发现应用的签名不正确就立即退出程序,可以在应用启动的时候获取应用的签名值,然后和正确的签名值作比对,如果不符合就直接退出程序。下面做一个简单的案例测试一下,如下所示:
这里定义一个简单的工具类用于比较应用的签名,只是简单处理,正常情况下这里应该比对签名的 MD5 值,为了简单就忽略了,然后在程序的入口处做一次比对,如果不正确就退出程序如下所示。
得到上面的 apk 之后,下面来反编译,重新签名安装(关于这里如何反编译和签名,不做解释了,使用 apktool 和 jarsigner 工具即可,签名文件是自己的),然后运行如下所示:
发现程序根本运行不起来,一点击就闪退,这就说明做到了防止应用被二次签名打包。
但是这也不是最安全的,因为既然有签名比对方法的地方,那么只需要反编译 apk 之后,修改 smali 语法,把这个方法调用的地方注释即可,如下所示:
只需要使用#把这行代码注释,然后回编译重新打包安装即可。这里的难点是如何找到这个检测签名方法的地方,比如有的程序在 native 层做的,但是不管在哪里,只要是在代码中,就可以找出来的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论