frida hook android子进程
最近在调试一款V*P应用,该应用使用了开源的openv*n框架。在跟踪的时候,大部分底层逻辑是在fork出来的子进程中实现的。顺便借此学习了一下frida关于子进程hook的支持。
1 enable_child_gating
frida官方通过enable_child_gating特性支持子进程hook,可以参考官方给出来的例子进行改造,即可实现对子进程的hook。
import codecs import threading from frida_tools.application import Reactor import frida class Application: def __init__(self): self._stop_requested = threading.Event() self._reactor = Reactor(run_until_return=lambda reactor: self._stop_requested.wait()) self._device = frida.get_device_manager().enumerate_devices()[-1] self._sessions = set() self._device.on("child-added", lambda child: self._reactor.schedule(lambda: self._on_child_added(child))) self._device.on("child-removed", lambda child: self._reactor.schedule(lambda: self._on_child_removed(child))) self._device.on("output", lambda pid, fd, data: self._reactor.schedule(lambda: self._on_output(pid, fd, data))) def run(self): self._reactor.schedule(lambda: self._start()) self._reactor.run() def _start(self): print(f"✔ spawn(com.wxy.vpn2018)") pid = self._device.spawn("com.wxy.vpn2018") self._instrument(pid) def _stop_if_idle(self): if len(self._sessions) == 0: self._stop_requested.set() def _instrument(self, pid): print(f"✔ attach(pid={pid})") session = self._device.attach(pid) session.on("detached", lambda reason: self._reactor.schedule(lambda: self._on_detached(pid, session, reason))) print("✔ enable_child_gating()") session.enable_child_gating() print("✔ create_script()") with codecs.open('./hook-normalvpn.js', 'r', 'utf-8') as f: source = f.read() script = session.create_script(source) script.on("message", lambda message, data: self._reactor.schedule(lambda: self._on_message(pid, message))) print("✔ load()") script.load() print(f"✔ resume(pid={pid})") self._device.resume(pid) self._sessions.add(session) def _on_child_added(self, child): print(f"⚡ child_added: {child}") self._instrument(child.pid) def _on_child_removed(self, child): print(f"⚡ child_removed: {child}") def _on_output(self, pid, fd, data): print(f"⚡ output: pid={pid}, fd={fd}, data={repr(data)}") def _on_detached(self, pid, session, reason): print(f"⚡ detached: pid={pid}, reason='{reason}'") self._sessions.remove(session) self._reactor.schedule(self._stop_if_idle, delay=0.5) def _on_message(self, pid, message): print(f"⚡ message: pid={pid}, payload={message['payload']}") app = Application() app.run()