type
Post
status
Published
date
May 6, 2024
slug
android-sign-check
summary
安卓签名校验常见三种方式:调用
PackageManager 原生 API 对比签名、在 native 层反射 Java API(本质同 1)、自行解压 APK 校验 META-INF 中的 RSA 文件;其中原生 API 方式易被 hook 或一键重定向工具绕过,可通过直接获取 package 系统服务并调用隐藏 API getPackageInfo 规避常规 hook,而 native 层读取 APK 文件或内存特征的校验更为稳固,是对抗重定向和注入的推荐方案。tags
Kotlinx
安全
category
技术分享
icon
password
常见签名校验
一般来说,签名校验的方式有以下几种
- 通过安卓提供的api,利用
PackageManager获取签名数据,和已存的正确值进行对比.
- 在native中,反射Java的api,进行对比,本质上和1相同
- 自己读取apk文件,解压,校验META-INF里的RSA文件(主流加固实现在native)
重定向过签名校验小记
在安卓中,签名校验是一个很重要的环节,一般来说,签名校验是通过
PackageManager获取签名数据,和已存的正确值进行对比。但是,这个方法很容易被逆向者过掉,甚至有工具可以一键过掉(重定向)。
其中重定向呢,市面上主流的一键重定向过签名工具目前都是值只去hook主进程,如果有需要的话,我可以在一个小节说明如果利用子进程去对抗重定向以及其它的一些会修改注入app的操作
基于安卓原生API签名校验
基于安卓原生API的底层的签名校验方式
众所周知,安卓系统启动的时候就会创建一堆系统服务,PackageManager就是利用的其中一个叫
package的系统服务去获取的安装的各种应用的信息。再众所周知,应用与APP进行交互的唯一途径就是安卓的匿名内存共享 也就是+IBinder。
通常情况下,一键反签名校验工具都会去hook那些getPackageInfo的方法,然后返回一个假的签名数据。
但是呢,我不走寻常路,我直接去获取
package这个系统服务,然后调用getPackageInfo方法,这样就不会被hook到了。是不是很抽象呢?其实这个狠小儿科啦,只是利用了一些隐藏的api而已。
对于那些对于Android API进行背书的卷王们,他们可能不是很了解这个操作,嘻嘻。
基于native的签名校验
在native中,最建议的方式就是去读取apk文件,解压,校验META-INF里的RSA文件。 这个操作很朴实无华,在子进程反反签名校验的时候,也可以调用这个检测。 进阶一点就是去内存里面读取特征咯...只要是注入总会有马脚的...
