【APP逆向06】Hook的两种方案
-
hook有两种方案
- 1.attach方案
- Attach 方式是在目标应用程序已经运行的过程中动态地连接并注入 Frida 的 Agent 代码
- 需要对已经运行的应用程序进行 Hook,即动态地连接到正在运行的进程。
- 需要在应用程序运行时拦截和修改特定的方法调用。
- 需要实时监视和修改应用程序的行为,例如参数修改、返回值篡改等。
- 需要对应用程序进行调试和分析,以查找潜在的问题和漏洞。
- 2.spawn方案
- Spawn 方式是在目标应用程序启动时直接注入 Frida 的 Agent 代码
- 需要在应用程序启动的早期阶段进行 Hook。
- 需要访问和修改应用程序的内部状态,例如应用程序的全局变量、静态变量等。
- 需要 Hook 应用程序的初始化过程,以实现对应用程序的自定义初始化逻辑。
- 需要在应用程序的上下文中执行代码,并与其他模块或库进行交互。
- 1.attach方案
-
python实现
- 1.attach方案
import frida
import sys
### 以后这个代码不需要动### ### ###
rdev = frida.get_remote_device()
session = rdev.attach("app_name") # 写上要hook的app的名字
### 以后这个代码不需要动### ###
# 要改动的地方,js语法
scr = """
Java.perform(function () {
//找到类 反编译的首行+类名:com.autohome.ahkit.utils下的
var SecurityUtil = Java.use("com.autohome.ahkit.utils.SecurityUtil");
//替换类中的方法,方法有几个参数,就要传几个参数
SecurityUtil.encodeMD5.implementation = function(str){
console.log("参数:",str); // 传入的参数打印了,我们猜是明文密码
var res = this.encodeMD5(str); //调用原来的函数
console.log("返回值:",res); // 打印出正常执行这个方法,返回的结果
return res; // 通过hook技术--》把传入的明文,直接返回--》抓包抓到的密码就是明文
}
});
"""
####下面代码完全不需要动
script = session.create_script(scr)
def on_message(message, data):
print(message, data)
script.on("message", on_message)
script.load()
sys.stdin.read()
- 2.spawn方案,他会自动重启app-->>适应于应用程序启动初期进行hook
import frida
import sys
rdev = frida.get_remote_device()
pid = rdev.spawn(["com.che168.autotradercloud"])
session = rdev.attach(pid)
scr = """
Java.perform(function () {
// 包.类
var SecurityUtil = Java.use("com.autohome.ahkit.utils.SecurityUtil");
SecurityUtil.encodeMD5.implementation = function(str){
console.log("明文:",str);
var res = this.encodeMD5(str);
console.log("md5加密结果=",res);
return "305eb636-eb15-4e24-a29d-9fd60fbc91bf";
}
});
"""
script = session.create_script(scr)
def on_message(message, data):
print(message, data)
script.on("message", on_message)
script.load()
rdev.resume(pid)
sys.stdin.read()
- JavaScript实现
- 由于frida提供了js的api,所以也可以使用js脚本运行hook
- 1.attach方案
// 名字叫:hook.js
Java.perform(function () {
// 包.类
var SecurityUtil = Java.use("com.autohome.ahkit.utils.SecurityUtil");
SecurityUtil.encodeMD5.implementation = function(str){
console.log("明文:",str);
var res = this.encodeMD5(str);
console.log("md5加密结果=",res);
return res;
}
});
// attach 运行 命令 (应用已经在前台运行了,不需要指定应用名字和包名)
// frida -UF -l hook.js
- 2.spawn方案
Java.perform(function () {
// 包.类
var SecurityUtil = Java.use("com.autohome.ahkit.utils.SecurityUtil");
SecurityUtil.encodeMD5.implementation = function(str){
console.log("明文:",str);
var res = this.encodeMD5(str);
console.log("md5加密结果=",res);
return "123";
}
});
// spawn 方案运行 命令,会重启应用,需要指定应用的包名,不能不写包名,不写包名,不知道启动哪个应用
// frida -U -f 包名 -l hook.js