Hook框架frida,让逆向更简单
frida简介
Frida 是一款基于 Python + JavaScript 的 Hook 与调试框架。
Firda 是一款易用的跨平 Hook 工具, Java 层到 Native 层的 Hook 无所不能,是一种 动态的插桩工具,可以插入代码到原生 App 的内存空间中,动态的去监视和修改行为,原生平台包括Win、Mac、Linux、Android、iOS 全平台。
下面的操作使用python3.7.9+frida16.0.1+frida-tools12.0.1
安装frida【PC】
pip install frida==16.0.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
安装frida-tools【PC】
pip install frida-tools==12.0.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
frida-server【手机端】
-
查看CPU架构
adb shell getprop ro.product.cpu.abi
-
下载frida-server
frida-server-github地址
按照架构类型进行选择下载
-
上传到手机
下载的是一个压缩包,需要将压缩包解压,然后将解压出来的文件(非文件夹)上传至手机的/data/local/tmp/目录下。
-
1.【电脑】文件上传到设备
adb push D:\frida-server-16.0.1-android-arm64 /sdcard/
-
2.【手机】将frida-server…文件移动到手机的 /data/local/tmp 目录
adb shell su - cd sdcard mv frida-server-16.0.1-android-arm64 /data/local/tmp/
-
3.【进入】
cd /data/local/tmp
-
4.【授权】授予可执行的权限
chmod 777 frida-server-16.0.1-android-arm64
启动和Hook
-
手机端
adb shell su - cd /data/local/tmp/ ./frida-server-16.0.1-android-arm64
-
PC端
-
1.端口转发
adb forward tcp:27042 tcp:27042 adb forward tcp:27043 tcp:27043
-
2.获取进程
# 枚举手机上的所有进程 & 前台进程 import frida # 获取设备信息 rdev = frida.get_remote_device() print(rdev) # 枚举所有的进程 processes = rdev.enumerate_processes() for process in processes: print(process) # 获取在前台运行的APP front_app = rdev.get_frontmost_application() print(front_app)
-
3.hook脚本-密码(此处以hook某软件登陆为例)
import frida import sys # 连接手机设备 rdev = frida.get_remote_device() # Hook手机上的那个APP(app的包名字) # session = rdev.attach("com.che168.autotradercloud") # 车智赢+ 或 进程ID session = rdev.attach("车智赢+") scr = """ Java.perform(function () { // 包.类 var UserModel = Java.use("com.che168.autotradercloud.user.model.UserModel"); // Hook,替换 UserModel.loginByPassword.implementation = function(str,str2,str3,str4,str5,responseCallback){ console.log(str,str2,str3,str4,str5); // 执行原来的方法 this.loginByPassword(str,str2,str3,str4,str5,responseCallback); } }); """ script = session.create_script(scr) def on_message(message, data): print(message, data) script.on("message", on_message) script.load() sys.stdin.read()
-
4.hook脚本-md5加密(此处以hook某软件登陆为例)
import frida import sys # 连接手机设备 rdev = frida.get_remote_device() # Hook手机上的那个APP(app的包名字) # session = rdev.attach("com.che168.autotradercloud") # 车智赢+ 或 进程ID session = rdev.attach("车智赢+") scr = """ Java.perform(function () { // 包.类 var UserModel = Java.use("com.che168.autotradercloud.user.model.UserModel"); var SecurityUtil = Java.use("com.autohome.ahkit.utils.SecurityUtil"); // Hook,替换 UserModel.loginByPassword.implementation = function(str,str2,str3,str4,str5,responseCallback){ console.log(str,str2,str3,str4,str5); // 执行原来的方法 this.loginByPassword(str,str2,str3,str4,str5,responseCallback); } // Hook,替换 SecurityUtil.encodeMD5.implementation = function(str){ console.log("md5加密,明文:",str); var res = this.encodeMD5(str); console.log("md5加密,密文:",res); return res; } }); """ script = session.create_script(scr) def on_message(message, data): print(message, data) script.on("message", on_message) script.load() sys.stdin.read()
-
5.hook脚本-查看调用栈
Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new())
加上这一句就可以查看调用栈了import frida import sys rdev = frida.get_remote_device() session = rdev.attach("车智赢+") scr = """ Java.perform(function () { // 包.类 var SPUtils = Java.use("com.che168.autotradercloud.util.SPUtils"); // Hook,替换 SPUtils.saveDeviceId.implementation = function(str){ console.log("执行了,参数:",str); console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new())); // 执行原来的方法 this.saveDeviceId(str); } }); """ script = session.create_script(scr) script.load() sys.stdin.read()
-
效果图:
至此,hook的使用就结束啦~~~~~