Frida在私有进程中没有挂钩功能

问题描述

Ubuntu 18.06上的Frida客户端v.12.11.11

Android Studio模拟器(Android 9.0 Google X86_ARM)上的Frida Server v12.11.17

我正在尝试挂钩实现实现在私有进程中运行的服务的子类的onCreate方法。这是清单声明:

<service android:enabled="true" android:name="my_subclass_to_hook" android:process=":my_process">

为了执行挂钩,我按照此处报告的示例进行操作: https://www.programmersought.com/article/97331588304/

我能够检测到何时调用了该进程,因为spawn_added事件在jscode代码内部正常工作。但是没有调用挂钩实现函数

我确定正在调用原始函数,因为我可以看到logcat的打印内容

有人可以帮我吗?在这个问题上,我已经呆了好几个星期了。 我是否缺少任何东西,或者有其他方法可以实现这一目标?

以下是我正在使用的Python代码。正如我说的那样,由于可以正确调用jscode,因此可以在创建服务进程“ my_app_package:my_process”时捕获到的信息,并且可以看到“被调用的脚本...”打印。问题是由于我看不到“已钩住!!”钩子函数my_subclass_to_hook.onCreate没有被附加。打印。顺便说一下,我可以确定正在调用函数my_subclass_to_hook.onCreate,因为我可以在logcat中看到打印内容。希望这可以澄清我的问题:

import codecs
import frida
import time
import sys
import threading
 
 
device = frida.get_device_manager().enumerate_devices()[-1]
print(device)
  
pending = []
sessions = []
scripts = []
event = threading.Event()
 
jscode = """

console.log("Script called...");

Java.perform(function x() { 

    var my_class = Java.use("my_subclass_to_hook");
        
    my_class.onCreate.implementation = function (a) {        
        console.log("Hooked!!");
        var ret_value = this.onCreate(a);
        return ret_value;
    }
"""
 
def on_spawned(spawn):
    print('on_spawned:',spawn)
    pending.append(spawn)
    event.set()
 
def spawn_added(spawn):
    print('spawn_added:',spawn)
    event.set()
    if(spawn.identifier.startswith('my_app_package:my_process')):        
        session = device.attach(spawn.pid) 
        script = session.create_script(jscode)
        script.on('message',on_message)
        script.load()
        device.resume(spawn.pid)
        print('Resumed')

        
def spawn_removed(spawn):
    print('spawn_removed:',spawn)
    event.set()
 
def on_message(spawn,message,data):
    print('on_message:',spawn,data)
    
def on_message(message,data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)

def child_added(spawn):
    print('child_added:',spawn)

device.on('spawn-added',spawn_added)
device.on('spawn-removed',spawn_removed)
device.on('child-added',child_added)
device.on('child-removed',on_spawned)
device.on('process-crashed',on_spawned)
device.on('output',on_spawned)
device.on('uninjected',on_spawned)
device.on('lost',on_spawned)
device.enable_spawn_gating()
event = threading.Event()
print('Enabled spawn gating')
 
pid = device.spawn(["my_app_package"])
  
session = device.attach(pid)
device.resume(pid)
sys.stdin.read()

谢谢

解决方法

您错过了超载。

my_class.onCreate.implementation = function (a) {

}      
   

应该是

my_class.onCreate.overload('android.os.Bundle').implementation = function (bundle)
{
 .....
} 

这是调用frida脚本的一种非常讨厌的方式。您应该在script.load()和script.resume()之间有一个sleep(1)