Фрида не перехватывает функцию в приватном процессе

Клиент Frida v.12.11.11 на Ubuntu 18.06

Frida Server v12.11.17 на эмуляторе Android Studio (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. Но функция реализации перехвата не вызывается.

Я уверен, что исходная функция вызывается, так как я вижу отпечатки logcat.

Кто-нибудь может мне помочь? Я застрял в этой проблеме на несколько недель. Я что-то упустил или есть альтернативный способ добиться этого?

Ниже приведен код Python, который я использую. Как я уже сказал, я могу уловить, когда создается сервисный процесс my_app_package:my_process, поскольку jscode вызывается правильно, и я вижу, что скрипт называется... print. Проблема в том, что перехваченная функция my_subclass_to_hook.onCreate не присоединяется, так как я не вижу Hooked!! Распечатать. Кстати, я уверен, что вызывается функция 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()

Спасибо


person ThomasFoss    schedule 05.10.2020    source источник
comment
Вы уверены, что Фрида также активно участвует в процессе обслуживания? Потому что я не уверен, будет ли процесс приложения порождать/разветвлять сервисный процесс. Может быть, процесс непосредственно создан Android. Во-вторых, вы должны опубликовать соответствующие части используемого кода перехвата frida. В противном случае трудно сказать, может ли это работать или нет и почему.   -  person Robert    schedule 06.10.2020
comment
Привет, Роберт, спасибо за ваш ответ. Я обновил свой вопрос, добавив код php. Надеюсь, это поможет прояснить мою проблему.   -  person ThomasFoss    schedule 06.10.2020
comment
Это код Python, а не php. Перехват метода onCreate службы может быть немного проблематичным, так как он выполняется очень рано, и если frida подключится позже, вы больше никогда не увидите этот вызов. Следовательно, для тестирования я бы подключил метод, который вызывается регулярно или может запускаться извне (например, из приложения).   -  person Robert    schedule 06.10.2020
comment
Это странно, так как spawn_added определяет, когда 'my_app_package:my_process' создается, разве onCreate не должен вызываться после захвата spawn? Проблема в том, что этот подпроцесс создается, как только приложение запускается, поэтому нет возможности запустить его извне (есть ли способ сделать это?). Кстати, эта проблема возникает только тогда, когда я хочу перехватить функцию в сервисном процессе. Если я попытаюсь поймать onCreate основного процесса приложения (с тем же скриптом), хук работает отлично. Знаете ли вы, есть ли лучший способ выполнить перехват метода в подпроцессах приложения? Спасибо   -  person ThomasFoss    schedule 06.10.2020


Ответы (1)


Вам не хватает перегрузки.

my_class.onCreate.implementation = function (a) {

}      
   

должно быть

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

Это очень дерьмовый способ вызова скрипта frida. У вас должен быть сон(1) между script.load() и script.resume()

person MitchHS    schedule 05.11.2020