【问题标题】:Frida not hooking function in private processFrida 没有在私有进程中挂钩函数
【发布时间】:2021-01-20 11:14:02
【问题描述】:

Ubuntu 18.06 上的 Frida 客户端 v.12.11.11

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

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

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

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

我能够检测到进程何时被调用,因为 spawn_added 事件在 jscode 代码中正常工作。但是没有调用hook实现函数。

我确信原始函数正在被调用,因为我可以看到 logcat 打印。

谁能帮帮我?我在这个问题上被困了好几个星期。 我错过了什么还是有其他方法可以实现这一目标?

以下是我正在使用的 Python 代码。正如我所说,我能够捕捉到何时创建服务进程“my_app_package:my_process”,因为正确调用了 jscode,并且我可以看到“脚本调用...”打印。问题是挂钩函数 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, message, 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()

谢谢

【问题讨论】:

  • 你确定frida也在服务进程中活跃吗?因为我不确定应用程序进程是否会产生/分叉服务进程。可能是Android直接创建的进程。其次,您应该发布使用的 frida 挂钩代码的相关部分。否则很难判断它是否可行以及为什么。
  • 您好罗伯特,感谢您的回复。我已经更新了放置 php 代码的问题。希望这可以帮助澄清我的问题。
  • 这是 Python 代码,而不是 php。挂钩服务的 onCreate 方法可能会有点问题,因为它执行得非常早,如果 frida 稍后附加,您将永远不会再看到此调用。因此,为了进行测试,我会挂钩一个定期调用或可以从外部(例如从应用程序)触发的方法。
  • 这很奇怪,因为“spawn_added”检测到“my_app_package:my_process”何时被生成,不应该在生成捕获后调用 onCreate 吗?问题是这个子进程是在应用程序启动后立即创建的,所以无法从外部触发(有没有办法做到这一点?)。顺便说一下,这个问题只有在我想在服务进程中挂钩函数时才会发生。如果我尝试捕获主应用程序进程的 onCreate(使用相同的脚本),则该钩子可以完美运行。您知道是否有更好的方法来执行应用程序子流程中的方法挂钩?谢谢

标签: android frida


【解决方案1】:

你错过了超载。

my_class.onCreate.implementation = function (a) {

}      
   

应该是

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

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

【讨论】:

    猜你喜欢
    • 2020-12-11
    • 2022-09-26
    • 2016-08-13
    • 2020-12-17
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多