【APP逆向06】Hook的两种方案

  • hook有两种方案

    • 1.attach方案
      • Attach 方式是在目标应用程序已经运行的过程中动态地连接并注入 Frida 的 Agent 代码
      • 需要对已经运行的应用程序进行 Hook,即动态地连接到正在运行的进程。
      • 需要在应用程序运行时拦截和修改特定的方法调用。
      • 需要实时监视和修改应用程序的行为,例如参数修改、返回值篡改等。
      • 需要对应用程序进行调试和分析,以查找潜在的问题和漏洞。
    • 2.spawn方案
      • Spawn 方式是在目标应用程序启动时直接注入 Frida 的 Agent 代码
      • 需要在应用程序启动的早期阶段进行 Hook。
      • 需要访问和修改应用程序的内部状态,例如应用程序的全局变量、静态变量等。
      • 需要 Hook 应用程序的初始化过程,以实现对应用程序的自定义初始化逻辑。
      • 需要在应用程序的上下文中执行代码,并与其他模块或库进行交互。
  • 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
posted @ 2024-01-14 23:15  Tony_xiao  阅读(463)  评论(0编辑  收藏  举报