Android hook工具主要有Xposed、Substrate和Frida,Xposed用于hook java层,Substrate用于hook Native层,Frida既能用户hook java层,又能用于hook Native层。这三款工具中Frida配置环境简单,兼容性好,用户逆向破解非常方便。
本文中配置环境为:
PC端:win10
Android端:基于arm64
python:2.7
Frida安装
Frida安装分为两部分,PC端安装客户端和Android端安装服务器。
客户端安装:直接执行pip install frida,发现安装进度非常慢,于是选择https://pypi.org/project/frida/#files网址进行源码下载,选择frida-12.6.8.tar.gz进行下载。下载后解压,在当前路径下打开命令行,执行python setup.py install进行安装。
执行pip install frida-tools,安装frida-tools。
执行frida-ps,验证是否安装成功。如下图所示,则表明frida客户端安装成功。
服务端安装:frida服务端版本应与客户端一致,因此需要先在PC中输入frida --version查看frida版本,然后在https://github.com/frida/frida/releases中下载对应的服务端版本,本文环境应下载frida-server-12.6.8-android-arm64.xz,下载之后解压,并将frida-server-12.6.8-android-arm64传到Android端,命令为:adb push frida-server-12.6.8-android-arm64 /data/local/tmp/frida-server,如下图:
如果使用的是模拟器,那么对应的应该下载frida-server-12.6.8-android-x86或64位的,如果安装错误的版本,在执行frida-server时会提示报错,报错信息为sh: ./frida-server: not executable: 64-bit ELF file。
下一步就是执行frida-server,普通用户没有权限,需要su切换到root用户,然后到/data/local/tmp/路径下,对frida-server进行提权操作,执行chmod 777 frida-server,再执行./frida-server运行服务端frida。
确认是否安装成功,在PC端执行frida-ps -U,如果出现Android的进程,则代表安装成功。
利用Frida hook绕过登录检测
在某些情况下,修改Android应用程序的行为是可取的,比如禁用指纹验证等应用程序的某些敏感功能,或者不允许在root上运行,或者希望绕过登录或禁用SSL证书来拦截流量,本例使用frida绕过App的登录检测。绕过登录的步骤如下:
启动服务端frida
上一节已经详细描述了frida环境配置,配置成功后在Android端开启frida,在/data/local/tmp/路径下执行./frida-server。
安装APK
安装目标App Sieve,Sieve是一个MWR实验室构建的漏洞密码存储程序,用于逆向研究。下载地址:https://github.com/as0ler/Android-Examples/blob/master/sieve.apk
反编译APK确定登录验证函数
接下来需要反编译APK找到登录验证函数,将apk后缀改为zip后解压缩,得到class.dex文件,使用dex2jar工具对其反编译为jar文件:d2j-dex2jar.bat classes.dex
,将classes-dex2jar.jar拖到jd-gui打开。在MainLoginActivity.class类下面找到checkKeyResult登录函数,查看其登录处理逻辑,即判断布尔值参数是否为真,如果为真则返回登录成功,否则登录失败。
编写hook代码
frida支持多种语言,python、c、.net和swift,本文使用python。
import frida, sys
def on_message(message, data):
if message['type'] == 'send':
print("[*] {0}".format(message['payload']))
else:
print(message)
jscode = """
Java.perform(function () {
//Obtain referrence of the Activity currently running
var MainActivity = Java.use('com.mwr.example.sieve.MainLoginActivity');
//Obtain reference of the function whcih needs to be called
MainActivity.checkKeyResult.implementation = function (b) {
send('checkKeyResult');
//Calling the function and passing the boolean parameter as true
this.checkKeyResult(true);
console.log('Done:');
};
}); //需要通过frida执行的js代码
"""
process = frida.get_usb_device().attach('com.mwr.example.sieve')
script = process.create_script(jscode) //用于attach到目标进程
script.on('message', on_message)
script.load()
sys.stdin.read()
接下来打开App,执行上面python代码,然后输入空密码,点击Sign in,进入Enter your pin页面,而不进行hook时输入空密码登录,会提示密码错误,可见绕过了登录。
直接空密码登录:
hook后空密码登录: