问题描述
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)