快捷搜索: 王者荣耀 脱发

frida 如何Hook app启动阶段的方法

参考上面的文章,但是代码在最新的frida15.2上面总是报错,

{type: error, description: Error: VM::AttachCurrentThread failed: -1, stack: Error: VM::AttachCurrentThread failed: -1
    
at o (frida/node_modules/frida-java-bridge/lib/result.js:4)
    
at <anonymous> (frida/node_modules/frida-java-bridge/lib/vm.js:25)
    
at <anonymous> (frida/node_modules/frida-java-bridge/lib/vm.js:14)
    
at Xe (frida/node_modules/frida-java-bridge/lib/android.js:499)
    
at Ie (frida/node_modules/frida-java-bridge/lib/android.js:195)
    
at Ce (frida/node_modules/frida-java-bridge/lib/android.js:16)
    
at _tryInitialize (frida/node_modules/frida-java-bridge/index.js:17)
    
at g (frida/node_modules/frida-java-bridge/index.js:9)
    
at <anonymous> (frida/node_modules/frida-java-bridge/index.js:317)
    
at call (native)
    
at o (/_java.js)
    
at <anonymous> (/_java.js)
    
at <anonymous> (frida/runtime/java.js:1)
    
at call (native)
    
at o (/_java.js)
    
at r (/_java.js)
    
at <eval> (frida/runtime/java.js:3)
    
at _loadJava (native)
    
at get (frida/runtime/core.js:125)
    
at <eval> (/script1.js:11), fileName: frida/node_modules/frida-java-bridge/lib/result.js, lineNumber: 4, columnNumber: 1}

重新搞了一下,在原来

Java.perform(function()
    {  
        var MainActivity = Java.use("com.rom.cpptest.MainActivity"); // 类的加载路径

        MainActivity.onCreate.overload(android.os.Bundle).implementation = function(str){   
            send("success1");
            this.onCreate(str);
            send("success2 "+str);
        };
    });

再包裹一下

function hook_OnCreate()
{
    Java.perform(function()
    {
        var MainActivity = Java.use("com.rom.cpptest.MainActivity"); // 类的加载路径

        MainActivity.onCreate.overload(android.os.Bundle).implementation = function(str){
            send("success1");
            this.onCreate(str);
            send("success2 "+str);
        };
    });
}
setImmediate(hook_OnCreate);

整体代码如下,就可以运行了

import frida  # 导入frida模块
import sys  # 导入sys模块

jscode = """ 
function hook_OnCreate()
{
    Java.perform(function()
    {  
        var MainActivity = Java.use("com.rom.cpptest.MainActivity"); // 类的加载路径
    
        MainActivity.onCreate.overload(android.os.Bundle).implementation = function(str){   
            send("success1");
            this.onCreate(str);
            send("success2 "+str);
        };
    });  
}
setImmediate(hook_OnCreate);
"""
def on_message(message, data):  # js中执行send函数后要回调的函数
    if message["type"] == "send":
        print("[*] {0}".format(message["payload"]))
    else:
        print(message)


device = frida.get_usb_device()
pid = device.spawn([com.rom.cpptest])  # app包名
process = device.attach(pid)  # 加载进程号
script = process.create_script(jscode)  # 创建js脚本
script.on(message, on_message)  # 加载回调函数,也就是js中执行send函数规定要执行的python函数
script.load()  # 加载脚本
device.resume(pid)  # 重启app
sys.stdin.read()
经验分享 程序员 微信小程序 职场和发展