Compare commits

...
74 Commits
Author SHA1 Message Date
Ole André Vadla Ravnås cf1766d199 subprojects: Prepare for release 2025-05-20 22:40:50 +02:00
Ole André Vadla Ravnås 67fa4db816 Bump frida-compile and frida-fs 2025-05-20 22:39:22 +02:00
Ole André Vadla Ravnås 8e9363cfb5 subprojects: Bump outdated 2025-05-20 22:06:37 +02:00
Ole André Vadla Ravnås 710de8f174 submodules: Bump releng 2025-05-20 22:06:36 +02:00
Ole André Vadla Ravnås 350cfb2d30 subprojects: Prepare for release 2025-05-17 23:48:11 +02:00
Ole André Vadla Ravnås 95ca3422ce subprojects: Bump outdated 2025-05-17 23:46:48 +02:00
Ole André Vadla Ravnås 01cc4d15ac android: Bump frida-java-bridge to 7.0.1 2025-05-17 23:41:13 +02:00
Ole André Vadla Ravnås f8943edf87 darwin: Bump frida-objc-bridge to 8.0.4 2025-05-17 23:40:27 +02:00
Ole André Vadla Ravnås 80ff031073 base: Bump interface versions to match major version 2025-05-17 22:53:42 +02:00
Ole André Vadla Ravnås d133485443 subprojects: Prepare for release 2025-05-17 19:45:33 +02:00
Ole André Vadla Ravnås 56be2c35ad subprojects: Bump outdated 2025-05-17 19:10:44 +02:00
Ole André Vadla Ravnås 9c70e82545 meson: Require Node.js for Darwin and Android too
Now that these have agents built using frida-compile.
2025-05-17 19:07:58 +02:00
Ole André Vadla Ravnås a51fe412c2 subprojects: Bump outdated 2025-05-17 11:46:33 +02:00
Ole André Vadla Ravnås 87916f44b6 Move off deprecated GumJS APIs
Which are now gone.
2025-05-17 11:44:20 +02:00
Ole André Vadla Ravnås e58274b2a0 barebone: Upgrade Module API implementation 2025-05-17 11:43:11 +02:00
Ole André Vadla Ravnås f920aec415 git: Ignore Barebone's script-runtime.js 2025-05-17 11:42:35 +02:00
Ole André Vadla Ravnås f310cd876d Bump @types/frida-gum in internal agents 2025-05-17 11:41:49 +02:00
Ole André Vadla Ravnås dfce66b4b2 compiler: Bump @types/frida-gum 2025-05-17 11:03:37 +02:00
Ole André Vadla Ravnås cc554570f0 ios: Add frida-objc-bridge to agents
Now that the bridges are no longer baked into GumJS.
2025-05-17 09:55:14 +02:00
Ole André Vadla Ravnås 8311484510 android: Add frida-java-bridge to agent
Now that the bridges are no longer baked into GumJS.
2025-05-17 09:55:10 +02:00
Ole André Vadla Ravnås d1b3cb273c barebone: Factor out JS agent build logic 2025-05-17 09:27:33 +02:00
Ole André Vadla Ravnås 4f05cb60ce subprojects: Prepare for release 2025-05-14 15:26:46 +02:00
Ole André Vadla Ravnås 58b8a29938 subprojects: Bump outdated 2025-05-14 15:25:26 +02:00
Ole André Vadla Ravnås 524fa7c68a subprojects: Bump outdated 2025-05-14 09:40:18 +02:00
Ole André Vadla Ravnås fad0ea0209 submodules: Bump releng 2025-05-14 09:40:18 +02:00
Ole André Vadla Ravnås 0d6c0c4e60 subprojects: Prepare for release 2025-05-09 17:43:28 +02:00
Ole André Vadla Ravnås 1403ce084c subprojects: Bump outdated 2025-05-09 17:42:23 +02:00
Ole André Vadla Ravnås 6e29f7b3b6 fruity: Keep TcpTunnelConnection keypair alive
Now that TcpTunnelConnection no longer holds a reference of its own.
2025-05-09 17:33:38 +02:00
Ole André Vadla Ravnås 65d58b8a71 fruity: Use Apple's CoreDeviceProxy as fallback
So we can support systems where NCM is problematic.
2025-05-09 16:06:49 +02:00
Ole André Vadla Ravnås 80a3cb7a89 fruity: Add TcpTunnelConnection.open_stream() 2025-05-09 16:05:12 +02:00
Ole André Vadla Ravnås 59ad0989a7 fruity: Move lockdown service bits to UsbmuxTransport 2025-05-09 15:28:38 +02:00
Ole André Vadla Ravnås 0bdea096d1 fruity: Retransmit mDNS-SD request every 250 ms
Just in case we transmit it too early, we may need to retransmit.
2025-05-09 14:53:17 +02:00
Ole André Vadla Ravnås 3b62211346 subprojects: Prepare for release 2025-05-09 11:55:56 +02:00
Ole André Vadla Ravnås 7bd2507326 subprojects: Bump outdated 2025-05-09 11:54:51 +02:00
Ole André Vadla Ravnås 63739cc623 fruity: Handle OPACK boolean and compact integers
Support for the latter is needed during pairing on iOS 18.4.1.
2025-05-09 11:54:07 +02:00
Ole André Vadla Ravnås ab3026a1ed fruity: Improve portable tunnel error-handling
When we use lockdown to determine if the iDevice supports tunnels, and
that fails due to lack of lockdown-level pairing, simply assume that the
OS supports it.
2025-05-09 11:32:12 +02:00
Ole André Vadla Ravnås 6b712f2262 fruity: Add timeout to the Linux netif wait logic 2025-05-09 11:30:32 +02:00
Ole André Vadla Ravnås e3607bf260 fruity: Handle NetworkManager DISCONNECTED+CARRIER
So we actually wait until the device is ready when it quickly passes
through state=DISCONNECTED with reason=CARRIER.
2025-05-09 11:03:01 +02:00
Ole André Vadla Ravnås c58ad9bec6 fruity: Initiate pairing on macOS too, if needed 2025-05-09 09:52:42 +02:00
Ole André Vadla Ravnås 46a42f8c3d fruity: Move to XpcObjectReader.check_nserror() 2025-05-09 09:51:21 +02:00
Ole André Vadla Ravnås bc9d168581 xpc-object-reader: Add check_nserror() 2025-05-09 09:51:03 +02:00
Ole André Vadla Ravnås 9c8290b51b fruity: Tweak macOS CreateAssertion error handling
So we provide a clean error message when it fails.
2025-05-09 08:52:25 +02:00
Ole André Vadla Ravnås 086af542c9 subprojects: Prepare for release 2025-05-08 22:43:14 +02:00
Ole André Vadla Ravnås badd66adaf subprojects: Bump outdated 2025-05-08 22:41:26 +02:00
Ole André Vadla Ravnås b1bda6f351 subprojects: Prepare for release 2025-05-08 21:30:56 +02:00
Ole André Vadla Ravnås 7b43736e43 api: Install our GLib .gir files if needed
I.e. on systems without such infrastructure in place.
2025-05-08 19:21:15 +02:00
Ole André Vadla Ravnås 5cf879aac8 subprojects: Bump outdated 2025-05-08 17:06:24 +02:00
Ole André Vadla Ravnås b983f9b3fc bus: Remove the device property
Which wasn't meant to be exposed in the first place.
2025-05-07 19:32:46 +02:00
Ole André Vadla Ravnås 55e5cfa7e7 device-manager: Fix crash on early close()
In situations where HostSessionService start() gets cancelled.
2025-05-07 15:44:05 +02:00
Ole André Vadla Ravnås b8319f21e2 web-service: Fix handling of TLS connections
The remote address logic did not take them into account.
2025-05-07 15:21:02 +02:00
Ole André Vadla Ravnås 326190263d gadget: Unseal internal classes
To fix compiler warnings.
2025-05-07 14:41:45 +02:00
Ole André Vadla Ravnås 9acb2dcacd api: Include Injector type struct in the .h 2025-05-07 14:40:23 +02:00
Ole André Vadla Ravnås 2dcabf6a12 api: Hide AgentMessageSink in the .gir 2025-05-03 13:42:08 +02:00
Ole André Vadla Ravnås dce1c12de9 meson: Provide {GLib,GObject}-2.0.gir
For language bindings consuming us as a subproject.

This is a stopgap until we improve our SDKs so .gir assets are included.
2025-04-30 16:39:46 +02:00
Ole André Vadla Ravnås 1d9b0a4787 api: Fix up FridaBase references in the .gir 2025-04-30 16:29:34 +02:00
Ole André Vadla Ravnås f286a57c9c subprojects: Prepare for release 2025-04-25 22:35:55 +02:00
Ole André Vadla Ravnås 7cdc1fa5cd subprojects: Bump outdated 2025-04-25 22:34:26 +02:00
WorksButNotTested b3f7cfec01 linux: Update helpers for armbe8, arm64be and arm64beilp32 (#1160) 2025-04-17 18:36:28 +02:00
Ole André Vadla Ravnås 92f7b0b2a3 subprojects: Bump outdated 2025-04-17 18:15:36 +02:00
WorksButNotTested 7445ad2067 tests: Support big-endian arm64 2025-04-17 18:10:58 +02:00
WorksButNotTested a55e4dc331 tests: Fix labrat support to cover all systems (#1149) 2025-04-17 14:54:26 +02:00
WorksButNotTested 482f0ebebe tests: Skip slow tests on big-endian ARM (#1148) 2025-04-17 14:47:42 +02:00
Ole André Vadla Ravnås 4df7f6f422 subprojects: Prepare for release 2025-04-17 13:53:44 +02:00
Ole André Vadla Ravnås 96a3766f22 subprojects: Bump outdated 2025-04-17 13:52:03 +02:00
Ole André Vadla Ravnås 759dc3aae1 subprojects: Prepare for release 2025-04-16 20:26:45 +02:00
Ole André Vadla Ravnås 23e1dff791 subprojects: Bump outdated 2025-04-16 20:25:26 +02:00
Ole André Vadla Ravnås 08a9ccfe55 subprojects: Bump outdated 2025-04-16 20:16:43 +02:00
Ole André Vadla Ravnås 9f87f61f8e subprojects: Prepare for release 2025-04-14 17:59:46 +02:00
Ole André Vadla Ravnås e323cb1b88 subprojects: Bump outdated 2025-04-14 17:58:21 +02:00
Ole André Vadla Ravnås ef0bb9e844 darwin: Update injector dyld init detection for iOS 18.4 2025-04-14 17:56:53 +02:00
Shane G 35acf74f95 fruity: Update injector dyld init detection for iOS 18.4 (#1154) 2025-04-11 22:32:30 +02:00
Francesco Tamagni 3041f010fd network-stack: Reduce delay between writes
By flagging as writable as soon as some space is available, without
waiting for the low watermark.
2025-04-11 22:29:22 +02:00
Francesco Tamagni 310a3673bf network-stack: Fix TCP write chunk length (#1156) 2025-04-11 11:53:58 +02:00
Francesco Tamagni 270578183b network-stack: Always send enqueued data
This change makes sure `pcb.output()` is called even when no more
space is available on the queue, preventing stall.
2025-04-11 10:27:22 +02:00
114 changed files with 128579 additions and 4968 deletions

No files matched your search

+32
View File
@@ -273,3 +273,35 @@ jobs:
else
echo "No unexpected changes detected."
fi
# This job is used to check that the Linux labrats are built correctly for all
# supported architectures. We do this because the binary artifacts are checked
# in, and we want to ensure that they are up-to-date with respect to the source
# for all architectures.
check-labrats:
strategy:
matrix:
arch: [x86, x86_64, arm, armbe8, arm64, arm64be, arm64beilp32, mips, mipsel, mips64, mips64el]
runs-on: ubuntu-latest
container: ghcr.io/frida/core-linux-helpers-${{ matrix.arch }}:latest
steps:
- name: Check out repo
uses: actions/checkout@v4
with:
submodules: recursive
- name: Build
run: |
./tests/labrats/rebuild.sh ${{ matrix.arch }}
- name: Check for unexpected changes
run: |
git config --global --add safe.directory "$(realpath .)"
status_output="$(git status --porcelain)"
if [ -n "$status_output" ]; then
echo "Unexpected changes detected:"
echo "$status_output"
echo "Diff:"
git diff
exit 1
else
echo "No unexpected changes detected."
fi
+7
View File
@@ -3,9 +3,16 @@
/src/barebone/helpers/memory-scanner/target/
/src/barebone/helpers/target/
/src/barebone/node_modules/
/src/barebone/script-runtime.js
/src/compiler/node_modules/
/src/darwin/agent/osanalytics/node_modules/
/src/darwin/agent/osanalytics/osanalytics.js
/src/darwin/agent/reportcrash/node_modules/
/src/darwin/agent/reportcrash/reportcrash.js
/src/droidy/helper/build/
/src/fruity/helpers/build/
/src/linux/agent/system-server/node_modules/
/src/linux/agent/system-server/system-server.js
/src/linux/helpers/build/
/src/linux/helpers/ext/
/subprojects/*
+11 -11
View File
@@ -1,5 +1,5 @@
namespace Frida {
[DBus (name = "re.frida.HostSession16")]
[DBus (name = "re.frida.HostSession17")]
public interface HostSession : Object {
public abstract async void ping (uint interval_seconds, Cancellable? cancellable) throws GLib.Error;
@@ -43,7 +43,7 @@ namespace Frida {
public signal void uninjected (InjectorPayloadId id);
}
[DBus (name = "re.frida.AgentSessionProvider16")]
[DBus (name = "re.frida.AgentSessionProvider17")]
public interface AgentSessionProvider : Object {
public abstract async void open (AgentSessionId id, HashTable<string, Variant> options,
Cancellable? cancellable) throws GLib.Error;
@@ -58,7 +58,7 @@ namespace Frida {
public signal void child_gating_changed (uint subscriber_count);
}
[DBus (name = "re.frida.AgentSession16")]
[DBus (name = "re.frida.AgentSession17")]
public interface AgentSession : Object {
public abstract async void close (Cancellable? cancellable) throws GLib.Error;
@@ -100,7 +100,7 @@ namespace Frida {
public signal void candidate_gathering_done ();
}
[DBus (name = "re.frida.AgentController16")]
[DBus (name = "re.frida.AgentController17")]
public interface AgentController : Object {
#if !WINDOWS
public abstract async HostChildId prepare_to_fork (uint parent_pid, Cancellable? cancellable, out uint parent_injectee_id,
@@ -121,7 +121,7 @@ namespace Frida {
Cancellable? cancellable) throws GLib.Error;
}
[DBus (name = "re.frida.AgentMessageSink16")]
[DBus (name = "re.frida.AgentMessageSink17")]
public interface AgentMessageSink : Object {
public abstract async void post_messages (AgentMessage[] messages, uint batch_id,
Cancellable? cancellable) throws GLib.Error;
@@ -749,14 +749,14 @@ namespace Frida {
}
}
[DBus (name = "re.frida.Channel16")]
[DBus (name = "re.frida.Channel17")]
public interface Channel : Object {
public abstract async void close (Cancellable? cancellable) throws GLib.Error;
public abstract async void input (uint8[] data, Cancellable? cancellable) throws GLib.Error;
public signal void output (uint8[] data);
}
[DBus (name = "re.frida.ServiceSession16")]
[DBus (name = "re.frida.ServiceSession17")]
public interface ServiceSession : Object {
public signal void close ();
public signal void message (Variant message);
@@ -766,13 +766,13 @@ namespace Frida {
public abstract async Variant request (Variant parameters, Cancellable? cancellable) throws GLib.Error;
}
[DBus (name = "re.frida.TransportBroker16")]
[DBus (name = "re.frida.TransportBroker17")]
public interface TransportBroker : Object {
public abstract async void open_tcp_transport (AgentSessionId id, Cancellable? cancellable, out uint16 port,
out string token) throws GLib.Error;
}
[DBus (name = "re.frida.PortalSession16")]
[DBus (name = "re.frida.PortalSession17")]
public interface PortalSession : Object {
public abstract async void join (HostApplicationInfo app, SpawnStartState current_state,
AgentSessionId[] interrupted_sessions, HashTable<string, Variant> options, Cancellable? cancellable,
@@ -781,14 +781,14 @@ namespace Frida {
public signal void kill ();
}
[DBus (name = "re.frida.BusSession16")]
[DBus (name = "re.frida.BusSession17")]
public interface BusSession : Object {
public abstract async void attach (Cancellable? cancellable) throws GLib.Error;
public abstract async void post (string json, bool has_data, uint8[] data, Cancellable? cancellable) throws GLib.Error;
public signal void message (string json, bool has_data, uint8[] data);
}
[DBus (name = "re.frida.AuthenticationService16")]
[DBus (name = "re.frida.AuthenticationService17")]
public interface AuthenticationService : Object {
public abstract async string authenticate (string token, Cancellable? cancellable) throws GLib.Error;
}
+9 -4
View File
@@ -548,12 +548,17 @@ namespace Frida {
IOStream soup_stream = connection.get_io_stream ();
SocketConnection socket_stream;
soup_stream.get ("base-iostream", out socket_stream);
IOStream base_iostream;
soup_stream.get ("base-iostream", out base_iostream);
SocketAddress remote_address;
SocketAddress? remote_address = null;
SocketConnection? sc = base_iostream as SocketConnection;
if (sc == null) {
IOStream tls_stream = base_iostream;
tls_stream.get ("base-io-stream", out sc);
}
try {
remote_address = socket_stream.get_remote_address ();
remote_address = sc.get_remote_address ();
} catch (GLib.Error e) {
assert_not_reached ();
}
+24
View File
@@ -136,6 +136,8 @@ namespace Frida {
}
}
public delegate int TranslateErrorFunc (string domain, int code, string description);
private Gee.Deque<Scope> scopes = new Gee.ArrayQueue<Scope> ();
public XpcObjectReader (Darwin.Xpc.Object obj) {
@@ -224,6 +226,28 @@ namespace Frida {
return error.get_string (Darwin.Xpc.Error.KEY_DESCRIPTION);
}
public void check_nserror (TranslateErrorFunc translate_error) throws Error {
if (!has_member ("error"))
return;
read_member ("error");
unowned string domain = read_member ("domain").get_string_value ();
end_member ();
var code = (int) read_member ("code").get_int64_value ();
end_member ();
string description = read_member ("userInfo").read_member ("NSLocalizedDescription").get_string_value ();
if (description.has_suffix ("."))
description = description[:description.length - 1];
throw (Error) new GLib.Error.literal (
Quark.from_string ("frida-error-quark"),
translate_error (domain, code, description),
description);
}
public unowned Darwin.Xpc.Object get_object_value (Darwin.Xpc.Type expected_type) throws Error {
return peek_scope ().get_object<Darwin.Xpc.Object> (expected_type);
}
+3 -3
View File
@@ -1694,7 +1694,7 @@ namespace Frida.Gadget {
public abstract async void close (Cancellable? cancellable = null) throws IOError;
}
private sealed class AuthenticationChannel : Object, Peer, AuthenticationService {
private class AuthenticationChannel : Object, Peer, AuthenticationService {
public weak ControlServer parent {
get;
construct;
@@ -1742,7 +1742,7 @@ namespace Frida.Gadget {
}
}
private sealed class ControlChannel : Object, Peer, HostSession {
private class ControlChannel : Object, Peer, HostSession {
public weak ControlServer parent {
get;
construct;
@@ -1941,7 +1941,7 @@ namespace Frida.Gadget {
}
}
private sealed class LiveAgentSession : BaseAgentSession {
private class LiveAgentSession : BaseAgentSession {
public ControlChannel? controller {
get;
set;
+11 -1
View File
@@ -162,6 +162,14 @@ if host_os_family == 'darwin'
endif
endif
if host_machine.endian() == 'big'
if host_abi in ['arm', 'armhf']
host_abi = 'armbe8'
elif host_abi == 'arm64'
host_abi = 'arm64be'
endif
endif
if host_os_family == 'darwin' and host_arch == 'arm64'
host_is_modern = host_abi == 'arm64e'
else
@@ -414,7 +422,7 @@ foreach b : [['local', have_local_backend],
endif
endforeach
if have_barebone_backend or have_compiler_backend
if host_os_family == 'darwin' or host_os == 'android' or have_barebone_backend or have_compiler_backend
node = find_program('node', version: '>=18.0.0', native: true, required: false)
if not node.found()
error('Need Node.js >= 18.0.0 to process JavaScript code at build time')
@@ -664,6 +672,8 @@ post_process = [
'@INPUT0@',
]
compile_js_agent = files('tools' / 'compile-js-agent.py')
mapper_opt = get_option('mapper')
if mapper_opt.auto()
have_mapper = host_os_family == 'darwin'
+1 -1
Submodule releng updated: 2eecc41cbe...5d9edf166c.
+91284
View File
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+5092 -4567
View File
File diff suppressed because it is too large. Load diff
+6 -2
View File
@@ -16,6 +16,7 @@ GIR_NAMESPACES = {
"glib": GLIB_NAMESPACE,
}
CORE_TAG_IMPLEMENTS = f"{{{CORE_NAMESPACE}}}implements"
CORE_TAG_FIELD = f"{{{CORE_NAMESPACE}}}field"
CORE_TAG_CONSTRUCTOR = f"{{{CORE_NAMESPACE}}}constructor"
CORE_TAG_METHOD = f"{{{CORE_NAMESPACE}}}method"
@@ -205,7 +206,9 @@ def emit_gir(api: ApiSpec, core_gir: str, base_gir: str, output_dir: Path) -> st
for elem in core_elements + base_elements:
if tag_name == "class":
for child in list(elem):
if child.tag == CORE_TAG_FIELD or child.get("name").startswith("_"):
if (child.tag == CORE_TAG_IMPLEMENTS and child.get("name") == "FridaBase.AgentMessageSink") \
or child.tag == CORE_TAG_FIELD \
or child.get("name").startswith("_"):
elem.remove(child)
merged_namespace.append(elem)
@@ -217,6 +220,7 @@ def emit_gir(api: ApiSpec, core_gir: str, base_gir: str, output_dir: Path) -> st
result = ET.tostring(merged_root,
encoding="unicode",
xml_declaration=True)
result = result.replace("FridaBase.", "Frida.")
with OutputFile(output_dir / f"Frida-{api.version}.gir") as output_gir:
output_gir.write(result)
@@ -383,7 +387,7 @@ def parse_api(api_version, toplevel_code, core_header, core_vapi, base_header, b
if delegate_cname not in seen_cdelegates:
seen_cdelegates.add(delegate_cname)
object_type.c_delegate_typedefs.append(beautify_cprototype(d.group(0)))
if object_type.kind == 'interface' and object_type.name != "Injector":
if object_type.kind == 'interface':
for m in re.finditer("^(struct _" + object_type.c_name + "Iface {[^}]+};)$", all_headers, re.MULTILINE):
object_type.c_iface_definition = beautify_cinterface(m.group(1))
+5 -2
View File
@@ -34,7 +34,10 @@ core_public_h = core_api[0]
core_public_gir = core_api[1]
core_public_vapi = [core_api[2], core_api[3]]
gio_gir = fs.copyfile('Gio-2.0.gir')
install_glib_girs = not gi_dep.found() and not fs.exists(girdir / 'GLib-2.0.gir')
glib_gir = fs.copyfile('GLib-2.0.gir', install: install_glib_girs, install_dir: girdir)
gobject_gir = fs.copyfile('GObject-2.0.gir', install: install_glib_girs, install_dir: girdir)
gio_gir = fs.copyfile('Gio-2.0.gir', install: install_glib_girs, install_dir: girdir)
core_public_vapi_stamp = custom_target('frida-core-vapi-stamp',
input: core_public_vapi,
@@ -89,7 +92,7 @@ installed_variables = {
}
core_public_dep = declare_dependency(
sources: [core_public_h, core_public_gir, gio_gir, core_public_vapi_stamp, core_public_extra_headers],
sources: [core_public_h, core_public_gir, glib_gir, gobject_gir, gio_gir, core_public_vapi_stamp, core_public_extra_headers],
include_directories: include_directories('.'),
link_args: backend_libs_private,
link_with: core_public_lib,
-36
View File
@@ -1,36 +0,0 @@
from pathlib import Path
import shutil
import subprocess
import sys
def main(argv):
output_dir, priv_dir, input_dir, npm = [Path(d).resolve() for d in argv[1:]]
try:
generate_runtime(output_dir, priv_dir, input_dir, npm)
except Exception as e:
print(e, file=sys.stderr)
sys.exit(1)
def generate_runtime(output_dir, priv_dir, input_dir, npm):
priv_dir.mkdir(exist_ok=True)
shutil.copy(input_dir / "package.json", priv_dir)
shutil.copy(input_dir / "package-lock.json", priv_dir)
runtime_reldir = Path("script-runtime")
runtime_srcdir = input_dir / runtime_reldir
runtime_intdir = priv_dir / runtime_reldir
if runtime_intdir.exists():
shutil.rmtree(runtime_intdir)
shutil.copytree(runtime_srcdir, runtime_intdir)
subprocess.run([npm, "install"], capture_output=True, cwd=priv_dir, check=True)
shutil.copy(priv_dir / "script-runtime.js", output_dir)
if __name__ == "__main__":
main(sys.argv)
+3 -3
View File
@@ -29,11 +29,11 @@ barebone_script_runtime = custom_target('frida-barebone-script-runtime',
],
command: [
python,
files('generate-script-runtime.py'),
meson.current_build_dir(),
compile_js_agent,
'@OUTPUT@',
'@PRIVATE_DIR@',
meson.current_source_dir(),
npm,
'@INPUT@',
],
)
backend_sources += custom_target('frida-data-barebone',
+32 -21
View File
@@ -1,15 +1,15 @@
{
"name": "frida-barebone-runtime",
"name": "frida-barebone-script-runtime",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "frida-barebone-runtime",
"name": "frida-barebone-script-runtime",
"version": "1.0.0",
"devDependencies": {
"@types/frida-gum": "^18.3.2",
"frida-compile": "^16.2.1"
"@types/frida-gum": "^19.0.0",
"frida-compile": "^17.0.0"
}
},
"node_modules/@frida/assert": {
@@ -74,6 +74,13 @@
"node": ">=14.9.0"
}
},
"node_modules/@frida/crypto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@frida/crypto/-/crypto-1.0.1.tgz",
"integrity": "sha512-WXTkVjESvX8TIVXIynJJv9BKSIdQP0Iis04StIXknkDi1ULdMlrypA9p5C4KW1H6GCkNsVnKbybpzsulYCTvag==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/diagnostics_channel": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@frida/diagnostics_channel/-/diagnostics_channel-1.0.0.tgz",
@@ -316,10 +323,11 @@
"dev": true
},
"node_modules/@types/frida-gum": {
"version": "18.3.2",
"resolved": "https://registry.npmjs.org/@types/frida-gum/-/frida-gum-18.3.2.tgz",
"integrity": "sha512-bso8bJRxrhchNRrOMmT18st/THIdjzxFdcMtJ/gGSYSknJeerQ8ArBwBtlWt/f3pqVVs1Mz1Fg6lvUdjXswa+g==",
"dev": true
"version": "19.0.0",
"resolved": "https://registry.npmjs.org/@types/frida-gum/-/frida-gum-19.0.0.tgz",
"integrity": "sha512-qViK1KwvPEAkajwSUv0wpZvZLiX8xO4JFFCh8dfYZfzSyOEfoE0KliCP/nJSKIKG6N3hXnPowrvPufjs5fLKAA==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/node": {
"version": "17.0.45",
@@ -366,24 +374,26 @@
"dev": true
},
"node_modules/commander": {
"version": "9.5.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
"integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
"integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^12.20.0 || >=14"
"node": ">=16"
}
},
"node_modules/frida-compile": {
"version": "16.2.1",
"resolved": "https://registry.npmjs.org/frida-compile/-/frida-compile-16.2.1.tgz",
"integrity": "sha512-be/U5h8l0cb0b+fWeZclhfw1s2xER8fPOjnTU4rZF8oh5GkB0BeAEaApwfGrdmeZkVNdUhDLXud7DqEljHRWmA==",
"version": "17.0.0",
"resolved": "https://registry.npmjs.org/frida-compile/-/frida-compile-17.0.0.tgz",
"integrity": "sha512-ixJRj14qLH/Z0ckFWd5fKeDMm0W2+2WDpSGnLRgpn0nuCQAbDHRCqVCWtPnV8uzPJmA6XOX0pujsMpYe9q9RRw==",
"dev": true,
"dependencies": {
"@frida/assert": "^3.0.1",
"@frida/base64-js": "^2.0.3",
"@frida/buffer": "^7.0.4",
"@frida/crosspath": "^3.0.0",
"@frida/crypto": "^1.0.1",
"@frida/diagnostics_channel": "^1.0.0",
"@frida/events": "^4.0.4",
"@frida/http": "^4.0.2",
@@ -406,8 +416,8 @@
"@frida/url": "^1.0.2",
"@frida/util": "^1.0.3",
"@frida/vm": "^2.0.0",
"commander": "^9.4.0",
"frida-fs": "^5.2.3",
"commander": "^11.1.0",
"frida-fs": "^6.0.0",
"typed-emitter": "^2.1.0"
},
"bin": {
@@ -415,10 +425,11 @@
}
},
"node_modules/frida-fs": {
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/frida-fs/-/frida-fs-5.2.3.tgz",
"integrity": "sha512-jJhtNI86UqDkOtB72XR7Ia9KHudQUxIFIbZadS9kxrDU6Io1jLhoMNp++iW7n7MaDgFQLRR8VgNj9VViGzaydA==",
"dev": true
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/frida-fs/-/frida-fs-6.0.0.tgz",
"integrity": "sha512-I0fnKupZh7fU2ixwCIjJnEqNdhfm/SC1ZYBMy58EmeqOWSbjw1Dpy99mJ7BJdbk2KNXJeaBZGxDYLtn0J9S+UA==",
"dev": true,
"license": "MIT"
},
"node_modules/http-parser-js": {
"version": "0.5.8",
+2 -2
View File
@@ -7,7 +7,7 @@
"build": "frida-compile script-runtime/entrypoint.ts -o script-runtime.js -c"
},
"devDependencies": {
"@types/frida-gum": "^18.3.2",
"frida-compile": "^16.2.1"
"@types/frida-gum": "^19.0.0",
"frida-compile": "^17.0.0"
}
}
+16 -2
View File
@@ -278,6 +278,8 @@ Object.defineProperties(Process, {
base: NULL,
size: 0x1000,
path: "/kernel",
ensureInitialized() {
},
enumerateImports() {
return [];
},
@@ -290,11 +292,23 @@ Object.defineProperties(Process, {
enumerateRanges() {
return [];
},
enumerateSections() {
return [];
},
enumerateDependencies() {
return [];
},
findExportByName() {
return null;
},
getExportByName(exportName) {
throw new Error(`unable to find export '${exportName}'`);
getExportByName(name) {
throw new Error(`unable to find export '${name}'`);
},
findSymbolByName() {
return null;
},
getSymbolByName(name) {
throw new Error(`unable to find symbol '${name}'`);
}
}
];
+39 -23
View File
@@ -9,15 +9,15 @@
"version": "1.0.0",
"dependencies": {
"@frida/crosspath": "3.0.0",
"frida-compile": "16.4.2",
"frida-fs": "5.2.5"
"frida-compile": "17.0.0",
"frida-fs": "6.0.0"
},
"devDependencies": {
"@frida/rollup-plugin-node-polyfills": "^1.0.3",
"@rollup/plugin-node-resolve": "^14.1.0",
"@rollup/plugin-replace": "^4.0.0",
"@rollup/plugin-typescript": "^8.3.4",
"@types/frida-gum": "18.8.2",
"@types/frida-gum": "19.0.0",
"@types/glob": "^8.0.0",
"@types/node": "18.7.23",
"glob": "^8.0.3",
@@ -252,6 +252,13 @@
"frida-fs": "^5.2.1"
}
},
"node_modules/@frida/rollup-plugin-node-polyfills/node_modules/frida-fs": {
"version": "5.2.5",
"resolved": "https://registry.npmjs.org/frida-fs/-/frida-fs-5.2.5.tgz",
"integrity": "sha512-Eyb4OqUlcv1/Eq7Q+B9IZmYZIgIM2YjqDojrjmAGzPSSXBuUKwSkuObQcQ8Dup9JTOMIUcSII9/I8DaTe6LFKw==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/stream": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@frida/stream/-/stream-1.0.2.tgz",
@@ -468,9 +475,9 @@
"dev": true
},
"node_modules/@types/frida-gum": {
"version": "18.8.2",
"resolved": "https://registry.npmjs.org/@types/frida-gum/-/frida-gum-18.8.2.tgz",
"integrity": "sha512-5KH6ITrKJQe1UWrNnbXXx3KXRe/Lx9I1EwkBdC+AMmlo9F5UC0PxdC959aGxhfjXBRIHWxXwXPi3JmeWIbeqeg==",
"version": "19.0.0",
"resolved": "https://registry.npmjs.org/@types/frida-gum/-/frida-gum-19.0.0.tgz",
"integrity": "sha512-qViK1KwvPEAkajwSUv0wpZvZLiX8xO4JFFCh8dfYZfzSyOEfoE0KliCP/nJSKIKG6N3hXnPowrvPufjs5fLKAA==",
"dev": true,
"license": "MIT"
},
@@ -641,9 +648,9 @@
"dev": true
},
"node_modules/frida-compile": {
"version": "16.4.2",
"resolved": "https://registry.npmjs.org/frida-compile/-/frida-compile-16.4.2.tgz",
"integrity": "sha512-wNiFk37JVpCoEsuJF9AHZtccM9Z3KGj3yu0Amsb/DKzKnHCxvl8AlAU5qSfYXfAJtzbNuCKGqNBM8u96KvP28A==",
"version": "17.0.0",
"resolved": "https://registry.npmjs.org/frida-compile/-/frida-compile-17.0.0.tgz",
"integrity": "sha512-ixJRj14qLH/Z0ckFWd5fKeDMm0W2+2WDpSGnLRgpn0nuCQAbDHRCqVCWtPnV8uzPJmA6XOX0pujsMpYe9q9RRw==",
"dependencies": {
"@frida/assert": "^3.0.1",
"@frida/base64-js": "^2.0.3",
@@ -673,7 +680,7 @@
"@frida/util": "^1.0.3",
"@frida/vm": "^2.0.0",
"commander": "^11.1.0",
"frida-fs": "^5.2.3",
"frida-fs": "^6.0.0",
"typed-emitter": "^2.1.0"
},
"bin": {
@@ -681,9 +688,10 @@
}
},
"node_modules/frida-fs": {
"version": "5.2.5",
"resolved": "https://registry.npmjs.org/frida-fs/-/frida-fs-5.2.5.tgz",
"integrity": "sha512-Eyb4OqUlcv1/Eq7Q+B9IZmYZIgIM2YjqDojrjmAGzPSSXBuUKwSkuObQcQ8Dup9JTOMIUcSII9/I8DaTe6LFKw=="
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/frida-fs/-/frida-fs-6.0.0.tgz",
"integrity": "sha512-I0fnKupZh7fU2ixwCIjJnEqNdhfm/SC1ZYBMy58EmeqOWSbjw1Dpy99mJ7BJdbk2KNXJeaBZGxDYLtn0J9S+UA==",
"license": "MIT"
},
"node_modules/fs.realpath": {
"version": "1.0.0",
@@ -1290,6 +1298,14 @@
"@frida/vm": "^2.0.0",
"@rollup/plugin-inject": "^4.0.4",
"frida-fs": "^5.2.1"
},
"dependencies": {
"frida-fs": {
"version": "5.2.5",
"resolved": "https://registry.npmjs.org/frida-fs/-/frida-fs-5.2.5.tgz",
"integrity": "sha512-Eyb4OqUlcv1/Eq7Q+B9IZmYZIgIM2YjqDojrjmAGzPSSXBuUKwSkuObQcQ8Dup9JTOMIUcSII9/I8DaTe6LFKw==",
"dev": true
}
}
},
"@frida/stream": {
@@ -1466,9 +1482,9 @@
"dev": true
},
"@types/frida-gum": {
"version": "18.8.2",
"resolved": "https://registry.npmjs.org/@types/frida-gum/-/frida-gum-18.8.2.tgz",
"integrity": "sha512-5KH6ITrKJQe1UWrNnbXXx3KXRe/Lx9I1EwkBdC+AMmlo9F5UC0PxdC959aGxhfjXBRIHWxXwXPi3JmeWIbeqeg==",
"version": "19.0.0",
"resolved": "https://registry.npmjs.org/@types/frida-gum/-/frida-gum-19.0.0.tgz",
"integrity": "sha512-qViK1KwvPEAkajwSUv0wpZvZLiX8xO4JFFCh8dfYZfzSyOEfoE0KliCP/nJSKIKG6N3hXnPowrvPufjs5fLKAA==",
"dev": true
},
"@types/glob": {
@@ -1597,9 +1613,9 @@
"dev": true
},
"frida-compile": {
"version": "16.4.2",
"resolved": "https://registry.npmjs.org/frida-compile/-/frida-compile-16.4.2.tgz",
"integrity": "sha512-wNiFk37JVpCoEsuJF9AHZtccM9Z3KGj3yu0Amsb/DKzKnHCxvl8AlAU5qSfYXfAJtzbNuCKGqNBM8u96KvP28A==",
"version": "17.0.0",
"resolved": "https://registry.npmjs.org/frida-compile/-/frida-compile-17.0.0.tgz",
"integrity": "sha512-ixJRj14qLH/Z0ckFWd5fKeDMm0W2+2WDpSGnLRgpn0nuCQAbDHRCqVCWtPnV8uzPJmA6XOX0pujsMpYe9q9RRw==",
"requires": {
"@frida/assert": "^3.0.1",
"@frida/base64-js": "^2.0.3",
@@ -1629,14 +1645,14 @@
"@frida/util": "^1.0.3",
"@frida/vm": "^2.0.0",
"commander": "^11.1.0",
"frida-fs": "^5.2.3",
"frida-fs": "^6.0.0",
"typed-emitter": "^2.1.0"
}
},
"frida-fs": {
"version": "5.2.5",
"resolved": "https://registry.npmjs.org/frida-fs/-/frida-fs-5.2.5.tgz",
"integrity": "sha512-Eyb4OqUlcv1/Eq7Q+B9IZmYZIgIM2YjqDojrjmAGzPSSXBuUKwSkuObQcQ8Dup9JTOMIUcSII9/I8DaTe6LFKw=="
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/frida-fs/-/frida-fs-6.0.0.tgz",
"integrity": "sha512-I0fnKupZh7fU2ixwCIjJnEqNdhfm/SC1ZYBMy58EmeqOWSbjw1Dpy99mJ7BJdbk2KNXJeaBZGxDYLtn0J9S+UA=="
},
"fs.realpath": {
"version": "1.0.0",
+3 -3
View File
@@ -9,15 +9,15 @@
},
"dependencies": {
"@frida/crosspath": "3.0.0",
"frida-compile": "16.4.2",
"frida-fs": "5.2.5"
"frida-compile": "17.0.0",
"frida-fs": "6.0.0"
},
"devDependencies": {
"@frida/rollup-plugin-node-polyfills": "^1.0.3",
"@rollup/plugin-node-resolve": "^14.1.0",
"@rollup/plugin-replace": "^4.0.0",
"@rollup/plugin-typescript": "^8.3.4",
"@types/frida-gum": "18.8.2",
"@types/frida-gum": "19.0.0",
"@types/glob": "^8.0.0",
"@types/node": "18.7.23",
"glob": "^8.0.3",
+3 -3
View File
@@ -21,7 +21,7 @@ const substratePidsPending = new Map();
rpc.exports = {
dispose() {
if (suspendedPids.size > 0) {
const kill = new NativeFunction(Module.getExportByName(null, 'kill'), 'int', ['int', 'int']);
const kill = new NativeFunction(Module.getGlobalExportByName('kill'), 'int', ['int', 'int']);
for (const pid of suspendedPids) {
kill(pid, SIGKILL);
}
@@ -49,7 +49,7 @@ rpc.exports = {
applyJailbreakQuirks();
Interceptor.attach(Module.getExportByName('/usr/lib/system/libsystem_kernel.dylib', '__posix_spawn'), {
Interceptor.attach(Process.getModuleByName('/usr/lib/system/libsystem_kernel.dylib').getExportByName('__posix_spawn'), {
onEnter(args) {
const env = parseStringv(args[4]);
const prewarm = isPrewarmLaunch(env);
@@ -238,7 +238,7 @@ function instrumentInserter(at) {
}
function findJbdCallImpl() {
const impl = Module.findExportByName(null, 'jbd_call');
const impl = Module.findGlobalExportByName('jbd_call');
if (impl !== null)
return impl;
@@ -1,3 +1,5 @@
import ObjC from 'frida-objc-bridge';
const YES = ptr(1);
const {
@@ -53,7 +55,8 @@ function tryInitialize() {
}
if (!tryInitialize()) {
const listener = Interceptor.attach(Module.getExportByName('/usr/lib/system/libsystem_trace.dylib', 'os_log_type_enabled'), () => {
const listener = Interceptor.attach(
Process.getModuleByName('/usr/lib/system/libsystem_trace.dylib').getExportByName('os_log_type_enabled'), () => {
tryInitialize();
listener.detach();
});
+18
View File
@@ -0,0 +1,18 @@
osanalytics_js = custom_target('osanalytics.js',
input: [
'package.json',
'package-lock.json',
'index.js',
],
output: [
'osanalytics.js',
],
command: [
python,
compile_js_agent,
'@OUTPUT@',
'@PRIVATE_DIR@',
npm,
'@INPUT@',
],
)
+553
View File
@@ -0,0 +1,553 @@
{
"name": "frida-osanalytics-agent",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "frida-osanalytics-agent",
"version": "1.0.0",
"dependencies": {
"frida-objc-bridge": "^8.0.4"
},
"devDependencies": {
"@types/frida-gum": "^19.0.0",
"frida-compile": "^17.0.0"
}
},
"node_modules/@frida/assert": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@frida/assert/-/assert-3.0.2.tgz",
"integrity": "sha512-JXJq5SbXGrM5EkjrZKfRmB29zOoEOix02NC6A5TSJ+C1GE/X051EinJJsuOO2pEOx7KZwpvAHvS0WXW0+levKg==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/base64-js": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@frida/base64-js/-/base64-js-2.0.3.tgz",
"integrity": "sha512-2w0F+1TynOTCZ/v7du9LdHPWwq0lJhazjo2fF9upMyQmA1zHetT14fLuQ1v/6T0qPgyeEGkiSrybstU8EsgeUA==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
},
"node_modules/@frida/buffer": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/@frida/buffer/-/buffer-7.0.4.tgz",
"integrity": "sha512-RxQ1lZRRiCJj7nhcCiD8xeJx0NsLpGGnjqsmTg7jShGmbnVFMN5W7+J+3gqdPSQhc/IxNBIWc6zRXVp4+qnYHg==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT",
"dependencies": {
"base64-js": "^1.5.1",
"ieee754": "^1.2.1"
}
},
"node_modules/@frida/crosspath": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@frida/crosspath/-/crosspath-3.0.0.tgz",
"integrity": "sha512-bNdO1spIPD2P40XtK89N49oZpJhstdlnkJZcD4yJ17jrdkm9Ctu0sd9MIEX6Z8Tm8ydhVJBAOMEKl9/R27onAQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "^17.0.36"
},
"engines": {
"node": ">=14.9.0"
}
},
"node_modules/@frida/crypto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@frida/crypto/-/crypto-1.0.1.tgz",
"integrity": "sha512-WXTkVjESvX8TIVXIynJJv9BKSIdQP0Iis04StIXknkDi1ULdMlrypA9p5C4KW1H6GCkNsVnKbybpzsulYCTvag==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/diagnostics_channel": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@frida/diagnostics_channel/-/diagnostics_channel-1.0.0.tgz",
"integrity": "sha512-mYX1jp/5Bpk24tHArJNx65iCk7qSuV8YJkdU0gFNVtJUXxfV8BG5WuPa4mL+ynxsbWWpsg/cwKZbLAepYKTdQQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/events": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/@frida/events/-/events-4.0.4.tgz",
"integrity": "sha512-qJVQ6VWHf9sjUKuiJzoCAC00frbpcwxeYfvQ+PP9LU/d70j+QvjWgYe98Qa3ekLaBU6r/AvWm8ThKCDUCLWrQQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.8.x"
}
},
"node_modules/@frida/http": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/@frida/http/-/http-4.0.2.tgz",
"integrity": "sha512-cvkc7ex7GmVXVOWqtjXKBWUUbYEBgpNRKZbEEoMeI8KiIs8zejKwg+N7rx7296Ao+EP3+xcUr4wBVr3xLaUVfQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"http-parser-js": "^0.5.3"
}
},
"node_modules/@frida/http-parser-js": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@frida/http-parser-js/-/http-parser-js-1.0.0.tgz",
"integrity": "sha512-2nMrNXt/OeTlWbqnE8AH4Sfz4I2+BGoN206dzKEyC/g2svtn83Xu+zuv/V3TkwrA27s26Mcy84ZwsXeNlqNxUQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/https": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@frida/https/-/https-1.0.0.tgz",
"integrity": "sha512-OiqQ6qsALcWOktRLq07oJ0i6sH8eX6MXb/MdZS1qVKDRf6wchH4Pjn6fiLB+pt/OlYbggk+DOfpHwSdjTwuHMQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/ieee754": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@frida/ieee754/-/ieee754-2.0.2.tgz",
"integrity": "sha512-wlcUebnne4ENN7GDr5pTH598ZDLMVOsh0FjenxeVOe6u7ewZkz9gGRnLnZKJAm9kl5G6XhdxhI0cSXVQK/rQUw==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "BSD-3-Clause"
},
"node_modules/@frida/net": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/@frida/net/-/net-4.0.2.tgz",
"integrity": "sha512-qQRe7hQ+ZfCcG/SE3P1TRqQ9bmuK/T7wPCYaT4z56rBPWAxsaQbQHpX4fR6OrFaSDr7X0xJLsTbdIp9hGhhLZg==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/os": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@frida/os/-/os-1.0.2.tgz",
"integrity": "sha512-3ISAiGNiyIya3QN2EHBCz1wqP0enTdSxP99wUeroeh8+AQRmgoOr/5TRnrVry8pe378anay3fmV/tdUMMSkehQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/path": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@frida/path/-/path-2.0.3.tgz",
"integrity": "sha512-2RQy36QatoC846fzBhBhV8sXMsSOBGoYvwTHeaE1zUdz7F4RNScP4QEekTTooBYWYX/XjiF36KQpYAzc9OYFtg==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/process": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@frida/process/-/process-1.2.1.tgz",
"integrity": "sha512-nvCu22DstFW2ttGFtOKekHM7vnjbZm+XgtvavOt427GNT6uV7k0JYK9tnMbcLMRWv57DG6udAmuJlWs8Paq1ag==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/punycode": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@frida/punycode/-/punycode-3.0.0.tgz",
"integrity": "sha512-XVSDY2KamDs1D5/fTVgHcOSNxdU4kTboxzqJMBbTjcQC7XScIT9c0EfbwKCq7Kci6gWQdsHSCr7lU+9Oc4KAdg==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/querystring": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@frida/querystring/-/querystring-1.0.0.tgz",
"integrity": "sha512-15m1fOZPmoO/vWlgPJrG/J9/BJDz6a2/JpVGpS8ynNzo+fBhTznaStX5nHxUs24mVTqh/OqLo0EiYJM5WWHXxg==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/readable-stream": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/@frida/readable-stream/-/readable-stream-4.1.3.tgz",
"integrity": "sha512-ntGUFmi+CryRGRJIK13a/VST2Ad19uivbln8Xd92vKPAARq+6vMIASDyZIqyl5BLRccfiyCHdYgrgQ6RI5rUig==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/reserved-words": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@frida/reserved-words/-/reserved-words-1.0.0.tgz",
"integrity": "sha512-2yG/XxJlsGlk/mm6eZTb4OAaQEhkTI2qaFfZFtAsrA/XuCpuMWkS4y/guyBlsRu4hAuhK2HPmNM8+OLLK1zM9Q==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/stream": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@frida/stream/-/stream-1.0.2.tgz",
"integrity": "sha512-4OuaC1ztmEKgTq3WeBhsy8Oq+AwW9n9cYnvLklcC9jwD93AEwgbWpecLlxJCVuALvTMdhKPg0nQVfyGYP/i9Bw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@frida/readable-stream": "^4.1.3"
}
},
"node_modules/@frida/string_decoder": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@frida/string_decoder/-/string_decoder-2.0.0.tgz",
"integrity": "sha512-in371tYZMHQiW9HF5MS3JDw6Ao6tyBoq34UWy2rzOswYyMG1rpizh85ofi/yVkxDiaqybEZefxzkVittpPGT6g==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/terser": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@frida/terser/-/terser-1.0.0.tgz",
"integrity": "sha512-59h9WuNzD1Rx/zwoWqQ/FW/4Y/Q3R91Eng2hEwdHapqiTDvtKbZ08F6CynCR7ZVinrh4tLYsF46AtVPTz1ys9g==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"@jridgewell/source-map": "^0.3.2",
"acorn": "^8.5.0",
"commander": "^2.20.0",
"source-map-support": "~0.5.20"
},
"bin": {
"terser": "bin/terser"
},
"engines": {
"node": ">=10"
}
},
"node_modules/@frida/terser/node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/timers": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@frida/timers/-/timers-3.0.0.tgz",
"integrity": "sha512-3b+0igv10aT8TMxefrTAd06rActqbxJLY2Xkkq9vYcPBffB/yHszl0NYIp/5ko8WC3ecDYPU6bQiY6fjs72zTA==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/tty": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@frida/tty/-/tty-1.0.0.tgz",
"integrity": "sha512-p/kjLnKYxEAB1MdYP8+5rKv9CsHzyA+0jg9BcGETzjQVKHHcroHDULRxDYUh+DC7qs6cpX8QdDQh9E+a6ydgsQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/url": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@frida/url/-/url-1.0.2.tgz",
"integrity": "sha512-ZKunbKJHMr8w2Eb/5K1avy0MzK1B998S17wYXNv3RmzBGxMm8S5T0F3qEpRxkU7/72P8m4izyQU87fWl+FjQsQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@frida/punycode": "^3.0.0",
"@frida/querystring": "^1.0.0"
}
},
"node_modules/@frida/util": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@frida/util/-/util-1.0.3.tgz",
"integrity": "sha512-htcG3uDiRXv89ERVNNYhfase39kJ2X75ZARfrYcYEtJLFEsSk0nemM1YnEIR4CjrHvdvkWHrwgKkS+acOyoNEg==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/vm": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@frida/vm/-/vm-2.0.0.tgz",
"integrity": "sha512-7fsjLWscZT5odNIBtg6qbLNI+vAk1xmii6H5W2kaYkMYt0vRohQEcDSUWacA+eaWlu5SvMjZI82Yibj/3G9pJw==",
"dev": true,
"license": "MIT"
},
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.8",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
"integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/set-array": "^1.2.1",
"@jridgewell/sourcemap-codec": "^1.4.10",
"@jridgewell/trace-mapping": "^0.3.24"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/set-array": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
"integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/source-map": {
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
"integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.25",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
"integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@types/frida-gum": {
"version": "19.0.0",
"resolved": "https://registry.npmjs.org/@types/frida-gum/-/frida-gum-19.0.0.tgz",
"integrity": "sha512-qViK1KwvPEAkajwSUv0wpZvZLiX8xO4JFFCh8dfYZfzSyOEfoE0KliCP/nJSKIKG6N3hXnPowrvPufjs5fLKAA==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/node": {
"version": "17.0.45",
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz",
"integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==",
"dev": true,
"license": "MIT"
},
"node_modules/acorn": {
"version": "8.14.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
"integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
"dev": true,
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
},
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true,
"license": "MIT"
},
"node_modules/commander": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
"integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=16"
}
},
"node_modules/frida-compile": {
"version": "17.0.0",
"resolved": "https://registry.npmjs.org/frida-compile/-/frida-compile-17.0.0.tgz",
"integrity": "sha512-ixJRj14qLH/Z0ckFWd5fKeDMm0W2+2WDpSGnLRgpn0nuCQAbDHRCqVCWtPnV8uzPJmA6XOX0pujsMpYe9q9RRw==",
"dev": true,
"dependencies": {
"@frida/assert": "^3.0.1",
"@frida/base64-js": "^2.0.3",
"@frida/buffer": "^7.0.4",
"@frida/crosspath": "^3.0.0",
"@frida/crypto": "^1.0.1",
"@frida/diagnostics_channel": "^1.0.0",
"@frida/events": "^4.0.4",
"@frida/http": "^4.0.2",
"@frida/http-parser-js": "^1.0.0",
"@frida/https": "^1.0.0",
"@frida/ieee754": "^2.0.2",
"@frida/net": "^4.0.1",
"@frida/os": "^1.0.0",
"@frida/path": "^2.0.3",
"@frida/process": "^1.2.1",
"@frida/punycode": "^3.0.0",
"@frida/querystring": "^1.0.0",
"@frida/readable-stream": "^4.1.3",
"@frida/reserved-words": "^1.0.0",
"@frida/stream": "^1.0.2",
"@frida/string_decoder": "^2.0.0",
"@frida/terser": "^1.0.0",
"@frida/timers": "^3.0.0",
"@frida/tty": "^1.0.0",
"@frida/url": "^1.0.2",
"@frida/util": "^1.0.3",
"@frida/vm": "^2.0.0",
"commander": "^11.1.0",
"frida-fs": "^6.0.0",
"typed-emitter": "^2.1.0"
},
"bin": {
"frida-compile": "dist/cli.js"
}
},
"node_modules/frida-fs": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/frida-fs/-/frida-fs-6.0.0.tgz",
"integrity": "sha512-I0fnKupZh7fU2ixwCIjJnEqNdhfm/SC1ZYBMy58EmeqOWSbjw1Dpy99mJ7BJdbk2KNXJeaBZGxDYLtn0J9S+UA==",
"dev": true,
"license": "MIT"
},
"node_modules/frida-objc-bridge": {
"version": "8.0.4",
"resolved": "https://registry.npmjs.org/frida-objc-bridge/-/frida-objc-bridge-8.0.4.tgz",
"integrity": "sha512-AUzwq/+TFtblQLTI97UPX22pBcvyG2oUde9380DXbcJ0zXts4n9JDVONHUr03aBowa0Le+bdBoVdCs7jyyjvlg==",
"license": "LGPL-2.0 WITH WxWindows-exception-3.1"
},
"node_modules/http-parser-js": {
"version": "0.5.10",
"resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz",
"integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==",
"dev": true,
"license": "MIT"
},
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "BSD-3-Clause"
},
"node_modules/rxjs": {
"version": "7.8.2",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
"integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
"dev": true,
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/source-map-support": {
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
"dev": true,
"license": "MIT",
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"dev": true,
"license": "0BSD",
"optional": true
},
"node_modules/typed-emitter": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz",
"integrity": "sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==",
"dev": true,
"license": "MIT",
"optionalDependencies": {
"rxjs": "*"
}
}
}
}
+16
View File
@@ -0,0 +1,16 @@
{
"name": "frida-osanalytics-agent",
"version": "1.0.0",
"description": "Agent used by Frida's Darwin backend on iOS/iPadOS/tvOS",
"scripts": {
"prepare": "npm run build",
"build": "frida-compile index.js -o osanalytics.js -S -c"
},
"devDependencies": {
"@types/frida-gum": "^19.0.0",
"frida-compile": "^17.0.0"
},
"dependencies": {
"frida-objc-bridge": "^8.0.4"
}
}
@@ -1,6 +1,5 @@
const LIBSYSTEM_KERNEL_PATH = '/usr/lib/system/libsystem_kernel.dylib';
const CORESYMBOLICATION_PATH = '/System/Library/PrivateFrameworks/CoreSymbolication.framework/CoreSymbolication';
const CRASH_REPORTER_SUPPORT_PATH = '/System/Library/PrivateFrameworks/CrashReporterSupport.framework/CrashReporterSupport';
import ObjC from 'frida-objc-bridge';
const YES = ptr(1);
const CSTypeRef = ['pointer', 'pointer'];
@@ -17,42 +16,45 @@ const complexFuncOptions = {
scheduling: 'cooperative',
exceptions: 'propagate'
};
const libsystemKernel = Process.getModuleByName('/usr/lib/system/libsystem_kernel.dylib');
const _pidForTask = new NativeFunction(
Module.getExportByName(LIBSYSTEM_KERNEL_PATH, 'pid_for_task'),
libsystemKernel.getExportByName('pid_for_task'),
'int',
['uint', 'pointer'],
simpleFuncOptions
);
const unlink = new NativeFunction(
Module.getExportByName(LIBSYSTEM_KERNEL_PATH, 'unlink'),
libsystemKernel.getExportByName('unlink'),
'int',
['pointer'],
simpleFuncOptions
);
const coreSymbolication = Process.getModuleByName('/System/Library/PrivateFrameworks/CoreSymbolication.framework/CoreSymbolication');
const CSSymbolicatorGetSymbolWithAddressAtTime = new NativeFunction(
Module.getExportByName(CORESYMBOLICATION_PATH, 'CSSymbolicatorGetSymbolWithAddressAtTime'),
coreSymbolication.getExportByName('CSSymbolicatorGetSymbolWithAddressAtTime'),
CSTypeRef,
[CSTypeRef, 'uint64', 'uint64'],
complexFuncOptions
);
const CSIsNull = new NativeFunction(
Module.getExportByName(CORESYMBOLICATION_PATH, 'CSIsNull'),
coreSymbolication.getExportByName('CSIsNull'),
'int',
[CSTypeRef],
simpleFuncOptions
);
const mappedMemoryRead = new NativeFunction(
Module.getExportByName(CORESYMBOLICATION_PATH, 'mapped_memory_read'),
coreSymbolication.getExportByName('mapped_memory_read'),
'uint',
['pointer', 'uint64', 'uint64', 'pointer'],
simpleFuncOptions
);
const mappedMemoryReadPointer = new NativeFunction(
Module.getExportByName(CORESYMBOLICATION_PATH, 'mapped_memory_read_pointer'),
coreSymbolication.getExportByName('mapped_memory_read_pointer'),
'uint',
['pointer', 'uint64', 'pointer'],
simpleFuncOptions
);
const crashReporterSupport = Process.getModuleByName('/System/Library/PrivateFrameworks/CrashReporterSupport.framework/CrashReporterSupport');
const {
AppleErrorReport,
@@ -67,7 +69,7 @@ const sessions = new Map();
let osaHookState = 'pending';
function initialize() {
const listener = Interceptor.attach(Module.getExportByName(CRASH_REPORTER_SUPPORT_PATH, 'CRCreateDirectoryStructure'), () => {
const listener = Interceptor.attach(crashReporterSupport.getExportByName('CRCreateDirectoryStructure'), () => {
applyInstrumentation();
listener.detach();
});
@@ -144,7 +146,7 @@ function applyInstrumentation() {
},
});
Interceptor.attach(Module.getExportByName(CORESYMBOLICATION_PATH, 'task_is_64bit'), {
Interceptor.attach(coreSymbolication.getExportByName('task_is_64bit'), {
onEnter(args) {
this.pid = pidForTask(args[0].toUInt32());
},
@@ -216,7 +218,7 @@ function applyInstrumentation() {
}
});
} else {
Interceptor.attach(Module.getExportByName(LIBSYSTEM_KERNEL_PATH, 'rename'), {
Interceptor.attach(libsystemKernel.getExportByName('rename'), {
onEnter(args) {
const newPath = args[1].readUtf8String();
const session = getSession(this.threadId, 'rename');
@@ -225,7 +227,7 @@ function applyInstrumentation() {
},
});
Interceptor.attach(Module.getExportByName(LIBSYSTEM_KERNEL_PATH, 'open_dprotected_np'), {
Interceptor.attach(libsystemKernel.getExportByName('open_dprotected_np'), {
onEnter(args) {
const path = args[0].readUtf8String();
this.isCrashLog = /\.ips$/.test(path);
@@ -237,7 +239,7 @@ function applyInstrumentation() {
},
});
Interceptor.attach(Module.getExportByName(LIBSYSTEM_KERNEL_PATH, 'write'), {
Interceptor.attach(libsystemKernel.getExportByName('write'), {
onEnter(args) {
const fd = args[0].toInt32();
this.buf = args[1];
@@ -266,7 +268,7 @@ function applyInstrumentation() {
});
}
Interceptor.attach(Module.getExportByName(CRASH_REPORTER_SUPPORT_PATH, 'OSAPreferencesGetBoolValue'), {
Interceptor.attach(crashReporterSupport.getExportByName('OSAPreferencesGetBoolValue'), {
onEnter(args) {
this.name = new ObjC.Object(args[0]).toString();
this.domain = new ObjC.Object(args[1]).toString();
+18
View File
@@ -0,0 +1,18 @@
reportcrash_js = custom_target('reportcrash.js',
input: [
'package.json',
'package-lock.json',
'index.js',
],
output: [
'reportcrash.js',
],
command: [
python,
compile_js_agent,
'@OUTPUT@',
'@PRIVATE_DIR@',
npm,
'@INPUT@',
],
)
+553
View File
@@ -0,0 +1,553 @@
{
"name": "frida-reportcrash-agent",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "frida-reportcrash-agent",
"version": "1.0.0",
"dependencies": {
"frida-objc-bridge": "^8.0.4"
},
"devDependencies": {
"@types/frida-gum": "^19.0.0",
"frida-compile": "^17.0.0"
}
},
"node_modules/@frida/assert": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@frida/assert/-/assert-3.0.2.tgz",
"integrity": "sha512-JXJq5SbXGrM5EkjrZKfRmB29zOoEOix02NC6A5TSJ+C1GE/X051EinJJsuOO2pEOx7KZwpvAHvS0WXW0+levKg==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/base64-js": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@frida/base64-js/-/base64-js-2.0.3.tgz",
"integrity": "sha512-2w0F+1TynOTCZ/v7du9LdHPWwq0lJhazjo2fF9upMyQmA1zHetT14fLuQ1v/6T0qPgyeEGkiSrybstU8EsgeUA==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
},
"node_modules/@frida/buffer": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/@frida/buffer/-/buffer-7.0.4.tgz",
"integrity": "sha512-RxQ1lZRRiCJj7nhcCiD8xeJx0NsLpGGnjqsmTg7jShGmbnVFMN5W7+J+3gqdPSQhc/IxNBIWc6zRXVp4+qnYHg==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT",
"dependencies": {
"base64-js": "^1.5.1",
"ieee754": "^1.2.1"
}
},
"node_modules/@frida/crosspath": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@frida/crosspath/-/crosspath-3.0.0.tgz",
"integrity": "sha512-bNdO1spIPD2P40XtK89N49oZpJhstdlnkJZcD4yJ17jrdkm9Ctu0sd9MIEX6Z8Tm8ydhVJBAOMEKl9/R27onAQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "^17.0.36"
},
"engines": {
"node": ">=14.9.0"
}
},
"node_modules/@frida/crypto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@frida/crypto/-/crypto-1.0.1.tgz",
"integrity": "sha512-WXTkVjESvX8TIVXIynJJv9BKSIdQP0Iis04StIXknkDi1ULdMlrypA9p5C4KW1H6GCkNsVnKbybpzsulYCTvag==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/diagnostics_channel": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@frida/diagnostics_channel/-/diagnostics_channel-1.0.0.tgz",
"integrity": "sha512-mYX1jp/5Bpk24tHArJNx65iCk7qSuV8YJkdU0gFNVtJUXxfV8BG5WuPa4mL+ynxsbWWpsg/cwKZbLAepYKTdQQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/events": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/@frida/events/-/events-4.0.4.tgz",
"integrity": "sha512-qJVQ6VWHf9sjUKuiJzoCAC00frbpcwxeYfvQ+PP9LU/d70j+QvjWgYe98Qa3ekLaBU6r/AvWm8ThKCDUCLWrQQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.8.x"
}
},
"node_modules/@frida/http": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/@frida/http/-/http-4.0.2.tgz",
"integrity": "sha512-cvkc7ex7GmVXVOWqtjXKBWUUbYEBgpNRKZbEEoMeI8KiIs8zejKwg+N7rx7296Ao+EP3+xcUr4wBVr3xLaUVfQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"http-parser-js": "^0.5.3"
}
},
"node_modules/@frida/http-parser-js": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@frida/http-parser-js/-/http-parser-js-1.0.0.tgz",
"integrity": "sha512-2nMrNXt/OeTlWbqnE8AH4Sfz4I2+BGoN206dzKEyC/g2svtn83Xu+zuv/V3TkwrA27s26Mcy84ZwsXeNlqNxUQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/https": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@frida/https/-/https-1.0.0.tgz",
"integrity": "sha512-OiqQ6qsALcWOktRLq07oJ0i6sH8eX6MXb/MdZS1qVKDRf6wchH4Pjn6fiLB+pt/OlYbggk+DOfpHwSdjTwuHMQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/ieee754": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@frida/ieee754/-/ieee754-2.0.2.tgz",
"integrity": "sha512-wlcUebnne4ENN7GDr5pTH598ZDLMVOsh0FjenxeVOe6u7ewZkz9gGRnLnZKJAm9kl5G6XhdxhI0cSXVQK/rQUw==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "BSD-3-Clause"
},
"node_modules/@frida/net": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/@frida/net/-/net-4.0.2.tgz",
"integrity": "sha512-qQRe7hQ+ZfCcG/SE3P1TRqQ9bmuK/T7wPCYaT4z56rBPWAxsaQbQHpX4fR6OrFaSDr7X0xJLsTbdIp9hGhhLZg==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/os": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@frida/os/-/os-1.0.2.tgz",
"integrity": "sha512-3ISAiGNiyIya3QN2EHBCz1wqP0enTdSxP99wUeroeh8+AQRmgoOr/5TRnrVry8pe378anay3fmV/tdUMMSkehQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/path": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@frida/path/-/path-2.0.3.tgz",
"integrity": "sha512-2RQy36QatoC846fzBhBhV8sXMsSOBGoYvwTHeaE1zUdz7F4RNScP4QEekTTooBYWYX/XjiF36KQpYAzc9OYFtg==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/process": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@frida/process/-/process-1.2.1.tgz",
"integrity": "sha512-nvCu22DstFW2ttGFtOKekHM7vnjbZm+XgtvavOt427GNT6uV7k0JYK9tnMbcLMRWv57DG6udAmuJlWs8Paq1ag==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/punycode": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@frida/punycode/-/punycode-3.0.0.tgz",
"integrity": "sha512-XVSDY2KamDs1D5/fTVgHcOSNxdU4kTboxzqJMBbTjcQC7XScIT9c0EfbwKCq7Kci6gWQdsHSCr7lU+9Oc4KAdg==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/querystring": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@frida/querystring/-/querystring-1.0.0.tgz",
"integrity": "sha512-15m1fOZPmoO/vWlgPJrG/J9/BJDz6a2/JpVGpS8ynNzo+fBhTznaStX5nHxUs24mVTqh/OqLo0EiYJM5WWHXxg==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/readable-stream": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/@frida/readable-stream/-/readable-stream-4.1.3.tgz",
"integrity": "sha512-ntGUFmi+CryRGRJIK13a/VST2Ad19uivbln8Xd92vKPAARq+6vMIASDyZIqyl5BLRccfiyCHdYgrgQ6RI5rUig==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/reserved-words": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@frida/reserved-words/-/reserved-words-1.0.0.tgz",
"integrity": "sha512-2yG/XxJlsGlk/mm6eZTb4OAaQEhkTI2qaFfZFtAsrA/XuCpuMWkS4y/guyBlsRu4hAuhK2HPmNM8+OLLK1zM9Q==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/stream": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@frida/stream/-/stream-1.0.2.tgz",
"integrity": "sha512-4OuaC1ztmEKgTq3WeBhsy8Oq+AwW9n9cYnvLklcC9jwD93AEwgbWpecLlxJCVuALvTMdhKPg0nQVfyGYP/i9Bw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@frida/readable-stream": "^4.1.3"
}
},
"node_modules/@frida/string_decoder": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@frida/string_decoder/-/string_decoder-2.0.0.tgz",
"integrity": "sha512-in371tYZMHQiW9HF5MS3JDw6Ao6tyBoq34UWy2rzOswYyMG1rpizh85ofi/yVkxDiaqybEZefxzkVittpPGT6g==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/terser": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@frida/terser/-/terser-1.0.0.tgz",
"integrity": "sha512-59h9WuNzD1Rx/zwoWqQ/FW/4Y/Q3R91Eng2hEwdHapqiTDvtKbZ08F6CynCR7ZVinrh4tLYsF46AtVPTz1ys9g==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"@jridgewell/source-map": "^0.3.2",
"acorn": "^8.5.0",
"commander": "^2.20.0",
"source-map-support": "~0.5.20"
},
"bin": {
"terser": "bin/terser"
},
"engines": {
"node": ">=10"
}
},
"node_modules/@frida/terser/node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/timers": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@frida/timers/-/timers-3.0.0.tgz",
"integrity": "sha512-3b+0igv10aT8TMxefrTAd06rActqbxJLY2Xkkq9vYcPBffB/yHszl0NYIp/5ko8WC3ecDYPU6bQiY6fjs72zTA==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/tty": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@frida/tty/-/tty-1.0.0.tgz",
"integrity": "sha512-p/kjLnKYxEAB1MdYP8+5rKv9CsHzyA+0jg9BcGETzjQVKHHcroHDULRxDYUh+DC7qs6cpX8QdDQh9E+a6ydgsQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/url": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@frida/url/-/url-1.0.2.tgz",
"integrity": "sha512-ZKunbKJHMr8w2Eb/5K1avy0MzK1B998S17wYXNv3RmzBGxMm8S5T0F3qEpRxkU7/72P8m4izyQU87fWl+FjQsQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@frida/punycode": "^3.0.0",
"@frida/querystring": "^1.0.0"
}
},
"node_modules/@frida/util": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@frida/util/-/util-1.0.3.tgz",
"integrity": "sha512-htcG3uDiRXv89ERVNNYhfase39kJ2X75ZARfrYcYEtJLFEsSk0nemM1YnEIR4CjrHvdvkWHrwgKkS+acOyoNEg==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/vm": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@frida/vm/-/vm-2.0.0.tgz",
"integrity": "sha512-7fsjLWscZT5odNIBtg6qbLNI+vAk1xmii6H5W2kaYkMYt0vRohQEcDSUWacA+eaWlu5SvMjZI82Yibj/3G9pJw==",
"dev": true,
"license": "MIT"
},
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.8",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
"integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/set-array": "^1.2.1",
"@jridgewell/sourcemap-codec": "^1.4.10",
"@jridgewell/trace-mapping": "^0.3.24"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/set-array": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
"integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/source-map": {
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
"integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.25",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
"integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@types/frida-gum": {
"version": "19.0.0",
"resolved": "https://registry.npmjs.org/@types/frida-gum/-/frida-gum-19.0.0.tgz",
"integrity": "sha512-qViK1KwvPEAkajwSUv0wpZvZLiX8xO4JFFCh8dfYZfzSyOEfoE0KliCP/nJSKIKG6N3hXnPowrvPufjs5fLKAA==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/node": {
"version": "17.0.45",
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz",
"integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==",
"dev": true,
"license": "MIT"
},
"node_modules/acorn": {
"version": "8.14.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
"integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
"dev": true,
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
},
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true,
"license": "MIT"
},
"node_modules/commander": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
"integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=16"
}
},
"node_modules/frida-compile": {
"version": "17.0.0",
"resolved": "https://registry.npmjs.org/frida-compile/-/frida-compile-17.0.0.tgz",
"integrity": "sha512-ixJRj14qLH/Z0ckFWd5fKeDMm0W2+2WDpSGnLRgpn0nuCQAbDHRCqVCWtPnV8uzPJmA6XOX0pujsMpYe9q9RRw==",
"dev": true,
"dependencies": {
"@frida/assert": "^3.0.1",
"@frida/base64-js": "^2.0.3",
"@frida/buffer": "^7.0.4",
"@frida/crosspath": "^3.0.0",
"@frida/crypto": "^1.0.1",
"@frida/diagnostics_channel": "^1.0.0",
"@frida/events": "^4.0.4",
"@frida/http": "^4.0.2",
"@frida/http-parser-js": "^1.0.0",
"@frida/https": "^1.0.0",
"@frida/ieee754": "^2.0.2",
"@frida/net": "^4.0.1",
"@frida/os": "^1.0.0",
"@frida/path": "^2.0.3",
"@frida/process": "^1.2.1",
"@frida/punycode": "^3.0.0",
"@frida/querystring": "^1.0.0",
"@frida/readable-stream": "^4.1.3",
"@frida/reserved-words": "^1.0.0",
"@frida/stream": "^1.0.2",
"@frida/string_decoder": "^2.0.0",
"@frida/terser": "^1.0.0",
"@frida/timers": "^3.0.0",
"@frida/tty": "^1.0.0",
"@frida/url": "^1.0.2",
"@frida/util": "^1.0.3",
"@frida/vm": "^2.0.0",
"commander": "^11.1.0",
"frida-fs": "^6.0.0",
"typed-emitter": "^2.1.0"
},
"bin": {
"frida-compile": "dist/cli.js"
}
},
"node_modules/frida-fs": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/frida-fs/-/frida-fs-6.0.0.tgz",
"integrity": "sha512-I0fnKupZh7fU2ixwCIjJnEqNdhfm/SC1ZYBMy58EmeqOWSbjw1Dpy99mJ7BJdbk2KNXJeaBZGxDYLtn0J9S+UA==",
"dev": true,
"license": "MIT"
},
"node_modules/frida-objc-bridge": {
"version": "8.0.4",
"resolved": "https://registry.npmjs.org/frida-objc-bridge/-/frida-objc-bridge-8.0.4.tgz",
"integrity": "sha512-AUzwq/+TFtblQLTI97UPX22pBcvyG2oUde9380DXbcJ0zXts4n9JDVONHUr03aBowa0Le+bdBoVdCs7jyyjvlg==",
"license": "LGPL-2.0 WITH WxWindows-exception-3.1"
},
"node_modules/http-parser-js": {
"version": "0.5.10",
"resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz",
"integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==",
"dev": true,
"license": "MIT"
},
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "BSD-3-Clause"
},
"node_modules/rxjs": {
"version": "7.8.2",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
"integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
"dev": true,
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/source-map-support": {
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
"dev": true,
"license": "MIT",
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"dev": true,
"license": "0BSD",
"optional": true
},
"node_modules/typed-emitter": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz",
"integrity": "sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==",
"dev": true,
"license": "MIT",
"optionalDependencies": {
"rxjs": "*"
}
}
}
}
+16
View File
@@ -0,0 +1,16 @@
{
"name": "frida-reportcrash-agent",
"version": "1.0.0",
"description": "Agent used by Frida's Darwin backend on iOS/iPadOS/tvOS",
"scripts": {
"prepare": "npm run build",
"build": "frida-compile index.js -o reportcrash.js -S -c"
},
"devDependencies": {
"@types/frida-gum": "^19.0.0",
"frida-compile": "^17.0.0"
},
"dependencies": {
"frida-objc-bridge": "^8.0.4"
}
}
+3 -3
View File
@@ -2,7 +2,7 @@ const POSIX_SPAWN_START_SUSPENDED = 0x0080;
applyJailbreakQuirks();
Interceptor.attach(Module.getExportByName('/usr/lib/system/libsystem_kernel.dylib', '__posix_spawn'), {
Interceptor.attach(Process.getModuleByName('/usr/lib/system/libsystem_kernel.dylib').getExportByName('__posix_spawn'), {
onEnter(args) {
const attrs = args[2].add(Process.pointerSize).readPointer();
@@ -42,7 +42,7 @@ function sabotageJbdCall(jbdCallImpl) {
}
function instrumentSubstrateBootstrapper(bootstrapper) {
Interceptor.attach(Module.getExportByName('/usr/lib/system/libdyld.dylib', 'dlopen'), {
Interceptor.attach(Process.getModuleByName('/usr/lib/system/libdyld.dylib').getExportByName('dlopen'), {
onEnter(args) {
this.path = args[0].readUtf8String();
},
@@ -66,7 +66,7 @@ function instrumentSubstrateExec(exec) {
}
function findJbdCallImpl() {
const impl = Module.findExportByName(null, 'jbd_call');
const impl = Module.findGlobalExportByName('jbd_call');
if (impl !== null)
return impl;
+9 -2
View File
@@ -2027,7 +2027,9 @@ _frida_darwin_helper_backend_prepare_spawn_instance_for_injection (FridaDarwinHe
}
}
modern_entry_address = gum_darwin_module_resolve_symbol_address (dyld, "__ZN5dyld44APIs19_libdyld_initializeEPKNS_16LibSystemHelpersE");
modern_entry_address = gum_darwin_module_resolve_symbol_address (dyld, "__ZN5dyld44APIs19_libdyld_initializeEv");
if (modern_entry_address == 0)
modern_entry_address = gum_darwin_module_resolve_symbol_address (dyld, "__ZN5dyld44APIs19_libdyld_initializeEPKNS_16LibSystemHelpersE");
instance->dyld_flavor = (modern_entry_address != 0) ? FRIDA_DYLD_V4_PLUS : FRIDA_DYLD_V3_MINUS;
if (instance->dyld_flavor == FRIDA_DYLD_V4_PLUS)
{
@@ -2113,7 +2115,12 @@ _frida_darwin_helper_backend_prepare_spawn_instance_for_injection (FridaDarwinHe
if (instance->dyld_flavor == FRIDA_DYLD_V4_PLUS)
{
GumAddress restart_with_dyld_in_cache = gum_darwin_module_resolve_symbol_address (dyld,
"__ZN5dyld422restartWithDyldInCacheEPKNS_10KernelArgsEPKN5dyld39MachOFileEPK15DyldSharedCachePv");
"__ZN5dyld422restartWithDyldInCacheEPKNS_10KernelArgsEPKN6mach_o6HeaderEPK15DyldSharedCachePv");
if (restart_with_dyld_in_cache == 0)
{
restart_with_dyld_in_cache = gum_darwin_module_resolve_symbol_address (dyld,
"__ZN5dyld422restartWithDyldInCacheEPKNS_10KernelArgsEPKN5dyld39MachOFileEPK15DyldSharedCachePv");
}
if (restart_with_dyld_in_cache == 0)
{
restart_with_dyld_in_cache = gum_darwin_module_resolve_symbol_address (dyld,
+3 -11
View File
@@ -360,12 +360,7 @@ namespace Frida {
start_request.resolve (true);
} catch (IOError e) {
service.provider_available.disconnect (on_provider_available);
service.provider_unavailable.disconnect (on_provider_unavailable);
service = null;
start_request.reject (e);
start_request = null;
}
}
@@ -1867,18 +1862,15 @@ namespace Frida {
public signal void detached ();
public signal void message (string json, Bytes? data);
public weak Device device {
get;
construct;
}
private weak Device device;
private Promise<BusSession>? attach_request;
private BusSession? active_session;
private Cancellable io_cancellable = new Cancellable ();
internal Bus (Device device) {
Object (device: device);
this.device = device;
}
public bool is_detached () {
+44 -4
View File
@@ -200,6 +200,8 @@ namespace Frida.Fruity {
namespace Network {
public async void wait_until_interfaces_ready (Gee.Collection<string> interface_names, Cancellable? cancellable)
throws Error, IOError {
var wait_cancellable = new Cancellable ();
try {
var connection = yield GLib.Bus.get (BusType.SYSTEM, cancellable);
@@ -215,6 +217,22 @@ namespace Frida.Fruity {
return;
}
var main_context = MainContext.get_thread_default ();
var timeout_source = new TimeoutSource.seconds (5);
timeout_source.set_callback (() => {
wait_cancellable.cancel ();
return Source.REMOVE;
});
timeout_source.attach (main_context);
var cancel_source = new CancellableSource (cancellable);
cancel_source.set_callback (() => {
wait_cancellable.cancel ();
return Source.REMOVE;
});
cancel_source.attach (main_context);
var remaining = interface_names.size + 1;
NotifyCompleteFunc on_complete = () => {
@@ -225,10 +243,10 @@ namespace Frida.Fruity {
foreach (var name in interface_names) {
if (nm != null) {
NetworkManager.wait_until_interface_ready.begin (name, nm, connection, cancellable,
NetworkManager.wait_until_interface_ready.begin (name, nm, connection, wait_cancellable,
on_complete);
} else {
Networkd.wait_until_interface_ready.begin (name, netd, connection, cancellable,
Networkd.wait_until_interface_ready.begin (name, netd, connection, wait_cancellable,
on_complete);
}
}
@@ -238,11 +256,17 @@ namespace Frida.Fruity {
on_complete ();
return Source.REMOVE;
});
source.attach (MainContext.get_thread_default ());
source.attach (main_context);
yield;
cancel_source.destroy ();
timeout_source.destroy ();
} catch (GLib.Error e) {
}
if (wait_cancellable.is_cancelled ())
throw new Error.TIMED_OUT ("Unexpectedly timed out while waiting for interfaces to become ready");
}
private async bool system_has_service (string name, DBusConnection connection, Cancellable? cancellable) throws GLib.Error {
@@ -276,16 +300,25 @@ namespace Frida.Fruity {
wait_until_interface_ready.callback ();
});
var cancel_source = new CancellableSource (cancellable);
cancel_source.set_callback (wait_until_interface_ready.callback);
cancel_source.attach (MainContext.get_thread_default ());
while (!cancellable.is_cancelled ()) {
uint32 state, reason;
device_proxy.get_cached_property ("StateReason").get ("(uu)", out state, out reason);
if (state == DEVICE_STATE_ACTIVATED)
break;
if (state == DEVICE_STATE_DISCONNECTED && reason != DEVICE_STATE_REASON_NONE)
if (state == DEVICE_STATE_DISCONNECTED &&
reason != DEVICE_STATE_REASON_NONE &&
reason != DEVICE_STATE_REASON_CARRIER) {
break;
}
yield;
}
cancel_source.destroy ();
device_proxy.disconnect (handler);
} catch (GLib.Error e) {
}
@@ -309,6 +342,7 @@ namespace Frida.Fruity {
private const uint32 DEVICE_STATE_ACTIVATED = 100;
private const uint32 DEVICE_STATE_REASON_NONE = 0;
private const uint32 DEVICE_STATE_REASON_CARRIER = 40;
}
namespace Networkd {
@@ -327,6 +361,10 @@ namespace Frida.Fruity {
wait_until_interface_ready.callback ();
});
var cancel_source = new CancellableSource (cancellable);
cancel_source.set_callback (wait_until_interface_ready.callback);
cancel_source.attach (MainContext.get_thread_default ());
while (!cancellable.is_cancelled ()) {
string operational_state;
link_proxy.get_cached_property ("OperationalState").get ("s", out operational_state);
@@ -335,6 +373,8 @@ namespace Frida.Fruity {
yield;
}
cancel_source.destroy ();
link_proxy.disconnect (handler);
} catch (GLib.Error e) {
}
+20
View File
@@ -129,6 +129,7 @@ namespace Frida.Fruity {
private ConnectionType _connection_type;
private string _udid;
private string _name;
private string _auth_state;
private Bytes? _remote_unlock_host_key;
private Promise<Tunnel>? tunnel_request;
@@ -155,6 +156,11 @@ namespace Frida.Fruity {
_name = reader.read_member ("name").get_string_value ();
reader.end_member ();
_auth_state = reader.read_member ("authState").read_member ("rawCase").get_string_value ();
reader
.end_member ()
.end_member ();
if (reader.has_member ("remoteUnlockHostKey")) {
_remote_unlock_host_key = new Bytes (reader.read_member ("remoteUnlockHostKey").get_data_value ());
reader.end_member ();
@@ -232,6 +238,8 @@ namespace Frida.Fruity {
tunnel_request = new Promise<Tunnel> ();
try {
yield ensure_paired (cancellable);
var tunnel = new MacOSTunnel (pairing_device, _remote_unlock_host_key);
yield tunnel.attach (cancellable);
@@ -245,6 +253,17 @@ namespace Frida.Fruity {
throw_api_error (e);
}
}
private async void ensure_paired (Cancellable? cancellable) throws Error, IOError {
if (_auth_state == "authenticated")
return;
var r = new PairingdRequest ("RemotePairing.InitiatePairingCommand");
r.body.set_bool ("requireNonInteractive", false);
var response = yield pairing_device.request (r.message, cancellable);
var reader = new XpcObjectReader (response);
reader.check_nserror (() => Error.PERMISSION_DENIED);
}
}
public sealed class MacOSTunnel : Object, Tunnel {
@@ -301,6 +320,7 @@ namespace Frida.Fruity {
_opened_at = get_monotonic_time ();
var reader = new XpcObjectReader (response);
reader.check_nserror (() => Error.NOT_SUPPORTED);
reader.read_member ("response");
_assertion_identifier = (Darwin.Xpc.Uuid) reader
+279 -87
View File
@@ -8,6 +8,8 @@ namespace Frida.Fruity {
private Gee.List<Backend> backends = new Gee.ArrayList<Backend> ();
private Gee.Map<string, Device> devices = new Gee.HashMap<string, Device> ();
private PairingStore pairing_store = new PairingStore ();
private enum State {
CREATED,
STARTING,
@@ -18,11 +20,11 @@ namespace Frida.Fruity {
private delegate void NotifyCompleteFunc ();
construct {
add_backend (new UsbmuxBackend ());
add_backend (new UsbmuxBackend (pairing_store));
#if MACOS
add_backend (new MacOSCoreDeviceBackend ());
#else
add_backend (new PortableCoreDeviceBackend ());
add_backend (new PortableCoreDeviceBackend (pairing_store));
#endif
}
@@ -184,10 +186,6 @@ namespace Frida.Fruity {
default = new Gee.TreeSet<Transport> (compare_transports);
}
private Gee.Queue<UsbmuxLockdownServiceRequest> usbmux_lockdown_service_requests =
new Gee.ArrayQueue<UsbmuxLockdownServiceRequest> ();
private LockdownClient? cached_usbmux_lockdown_client;
private const string[] LOCKDOWN_SERVICES_WITHOUT_ESCROW_BAG_SUPPORT = {
"com.apple.accessibility.axAuditDaemon.remoteserver",
"com.apple.afc",
@@ -205,26 +203,30 @@ namespace Frida.Fruity {
}
public UsbmuxDevice? find_usbmux_device () {
var transport = transports.first_match (t => t.usbmux_device != null && t.connection_type == USB);
if (transport == null)
transport = transports.first_match (t => t.usbmux_device != null);
return (transport != null) ? transport.usbmux_device : null;
var t = transports.first_match (t => t.usbmux_device != null);
return (t != null) ? t.usbmux_device : null;
}
public UsbmuxDevice get_usbmux_device () throws Error {
var d = find_usbmux_device ();
if (d == null)
private UsbmuxTransport get_usbmux_transport () throws Error {
var t = transports.first_match (t => t is UsbmuxTransport);
if (t == null)
throw new Error.NOT_SUPPORTED ("USB connection not available");
return d;
return (UsbmuxTransport) t;
}
public async Tunnel? find_tunnel (Cancellable? cancellable) throws Error, IOError {
var usbmux_device = find_usbmux_device ();
foreach (var transport in transports) {
var transports_to_try = new Gee.ArrayList<Transport> ();
transports_to_try.add_all_iterator (transports.filter (t => t.usbmux_device == null));
transports_to_try.add_all_iterator (transports.filter (t => t.usbmux_device != null));
foreach (var transport in transports_to_try) {
Tunnel? tunnel = yield transport.find_tunnel (usbmux_device, cancellable);
if (tunnel != null)
return tunnel;
}
return null;
}
@@ -283,19 +285,7 @@ namespace Frida.Fruity {
return stream;
}
if (service_name == "") {
var client = yield open_usbmux_lockdown_client (cancellable);
return client.service.stream;
}
var request = new UsbmuxLockdownServiceRequest (service_name, cancellable);
bool first_request = usbmux_lockdown_service_requests.is_empty;
usbmux_lockdown_service_requests.offer (request);
if (first_request)
process_usbmux_lockdown_service_requests.begin ();
return yield request.promise.future.wait_async (cancellable);
return yield get_usbmux_transport ().open_lockdown_service (service_name, cancellable);
}
// FIXME: Replace with `element in array`-check once Vala compiler bug has been fixed so generated C code is warning-free.
@@ -307,41 +297,6 @@ namespace Frida.Fruity {
return true;
}
private async void process_usbmux_lockdown_service_requests () {
UsbmuxLockdownServiceRequest? req;
bool already_invalidated = false;
while ((req = usbmux_lockdown_service_requests.peek ()) != null) {
try {
if (cached_usbmux_lockdown_client == null)
cached_usbmux_lockdown_client = yield open_usbmux_lockdown_client (req.cancellable);
var stream = yield cached_usbmux_lockdown_client.start_service (req.service_name, req.cancellable);
req.promise.resolve (stream);
} catch (GLib.Error e) {
if (e is LockdownError.CONNECTION_CLOSED && cached_usbmux_lockdown_client != null &&
!already_invalidated) {
cached_usbmux_lockdown_client = null;
already_invalidated = true;
continue;
}
req.promise.reject ((e is LockdownError.INVALID_SERVICE)
? (Error) new Error.NOT_SUPPORTED ("%s", e.message)
: (Error) new Error.TRANSPORT ("%s", e.message));
}
usbmux_lockdown_service_requests.poll ();
}
}
private async LockdownClient open_usbmux_lockdown_client (Cancellable? cancellable) throws Error, IOError {
try {
var client = yield LockdownClient.open (get_usbmux_device (), cancellable);
yield client.start_session (cancellable);
return client;
} catch (LockdownError e) {
throw new Error.NOT_SUPPORTED ("%s", e.message);
}
}
public async IOStream open_channel (string address, Cancellable? cancellable) throws Error, IOError {
string[] tokens = address.split (":", 2);
unowned string protocol = tokens[0];
@@ -452,17 +407,6 @@ namespace Frida.Fruity {
score++;
return score;
}
private class UsbmuxLockdownServiceRequest {
public string service_name;
public Cancellable? cancellable;
public Promise<IOStream> promise = new Promise<IOStream> ();
public UsbmuxLockdownServiceRequest (string service_name, Cancellable? cancellable) {
this.service_name = service_name;
this.cancellable = cancellable;
}
}
}
public class TcpChannel {
@@ -537,6 +481,11 @@ namespace Frida.Fruity {
}
private sealed class UsbmuxBackend : Object, Backend {
public PairingStore pairing_store {
get;
construct;
}
public bool available {
get {
return usbmux != null;
@@ -553,6 +502,10 @@ namespace Frida.Fruity {
private Cancellable io_cancellable = new Cancellable ();
public UsbmuxBackend (PairingStore pairing_store) {
Object (pairing_store: pairing_store);
}
public async void start (Cancellable? cancellable) throws IOError {
start_request = new Promise<bool> ();
start_cancellable = new Cancellable ();
@@ -669,7 +622,7 @@ namespace Frida.Fruity {
}
private async void add_transport (UsbmuxDevice device) {
var transport = new UsbmuxTransport (device);
var transport = new UsbmuxTransport (device, pairing_store);
transports[device] = transport;
string? name = null;
@@ -735,6 +688,11 @@ namespace Frida.Fruity {
construct;
}
public PairingStore pairing_store {
get;
construct;
}
public ConnectionType connection_type {
get {
return device.connection_type;
@@ -768,16 +726,218 @@ namespace Frida.Fruity {
internal string _name;
internal Variant? _icon;
public UsbmuxTransport (UsbmuxDevice device) {
Object (device: device);
private Promise<Tunnel?>? tunnel_request;
private Gee.Queue<UsbmuxLockdownServiceRequest> lockdown_service_requests =
new Gee.ArrayQueue<UsbmuxLockdownServiceRequest> ();
private LockdownClient? cached_lockdown_client;
public UsbmuxTransport (UsbmuxDevice device, PairingStore store) {
Object (device: device, pairing_store: store);
}
public async Tunnel? find_tunnel (UsbmuxDevice? device, Cancellable? cancellable) throws Error, IOError {
return null;
while (tunnel_request != null) {
try {
return yield tunnel_request.future.wait_async (cancellable);
} catch (Error e) {
throw e;
} catch (IOError e) {
cancellable.set_error_if_cancelled ();
}
}
tunnel_request = new Promise<Tunnel> ();
try {
IOStream? stream = null;
try {
stream = yield open_lockdown_service ("com.apple.internal.devicecompute.CoreDeviceProxy", cancellable);
} catch (Error e) {
if (!(e is Error.NOT_SUPPORTED))
throw e;
}
UsbmuxTunnel? tunnel = null;
if (stream != null) {
tunnel = new UsbmuxTunnel (stream, pairing_store);
tunnel.lost.connect (on_tunnel_lost);
try {
yield tunnel.open (cancellable);
} catch (Error e) {
if (e is Error.NOT_SUPPORTED)
tunnel = null;
else
throw e;
}
}
tunnel_request.resolve (tunnel);
return tunnel;
} catch (GLib.Error e) {
tunnel_request.reject (e);
tunnel_request = null;
throw_api_error (e);
}
}
private void on_tunnel_lost () {
tunnel_request = null;
}
public async IOStream open_lockdown_service (string service_name, Cancellable? cancellable) throws Error, IOError {
if (service_name == "") {
var client = yield open_usbmux_lockdown_client (cancellable);
return client.service.stream;
}
var request = new UsbmuxLockdownServiceRequest (service_name, cancellable);
bool first_request = lockdown_service_requests.is_empty;
lockdown_service_requests.offer (request);
if (first_request)
process_lockdown_service_requests.begin ();
return yield request.promise.future.wait_async (cancellable);
}
private async void process_lockdown_service_requests () {
UsbmuxLockdownServiceRequest? req;
bool already_invalidated = false;
while ((req = lockdown_service_requests.peek ()) != null) {
try {
if (cached_lockdown_client == null)
cached_lockdown_client = yield open_usbmux_lockdown_client (req.cancellable);
var stream = yield cached_lockdown_client.start_service (req.service_name, req.cancellable);
req.promise.resolve (stream);
} catch (GLib.Error e) {
if (e is LockdownError.CONNECTION_CLOSED && cached_lockdown_client != null &&
!already_invalidated) {
cached_lockdown_client = null;
already_invalidated = true;
continue;
}
req.promise.reject ((e is LockdownError.INVALID_SERVICE)
? (Error) new Error.NOT_SUPPORTED ("%s", e.message)
: (Error) new Error.TRANSPORT ("%s", e.message));
}
lockdown_service_requests.poll ();
}
}
private async LockdownClient open_usbmux_lockdown_client (Cancellable? cancellable) throws Error, IOError {
try {
var client = yield LockdownClient.open (device, cancellable);
yield client.start_session (cancellable);
return client;
} catch (LockdownError e) {
throw new Error.NOT_SUPPORTED ("%s", e.message);
}
}
private class UsbmuxLockdownServiceRequest {
public string service_name;
public Cancellable? cancellable;
public Promise<IOStream> promise = new Promise<IOStream> ();
public UsbmuxLockdownServiceRequest (string service_name, Cancellable? cancellable) {
this.service_name = service_name;
this.cancellable = cancellable;
}
}
}
private sealed class UsbmuxTunnel : Object, Tunnel {
public signal void lost ();
public IOStream stream {
get;
construct;
}
public PairingStore pairing_store {
get;
construct;
}
public DiscoveryService discovery {
get {
return _discovery_service;
}
}
public int64 opened_at {
get {
return _opened_at;
}
}
public Bytes? remote_unlock_host_key {
get {
return null;
}
}
private UsbNcmDriver? ncm;
private TcpTunnelConnection? tunnel_connection;
private DiscoveryService? _discovery_service;
private int64 _opened_at = -1;
public UsbmuxTunnel (IOStream stream, PairingStore store) {
Object (stream: stream, pairing_store: store);
}
public async void open (Cancellable? cancellable) throws Error, IOError {
var tc = yield TcpTunnelConnection.open_stream (stream, cancellable);
tunnel_connection = tc;
tunnel_connection.closed.connect (on_tunnel_connection_close);
_opened_at = get_monotonic_time ();
var rsd_endpoint = (InetSocketAddress) Object.new (typeof (InetSocketAddress),
address: tc.remote_address,
port: tc.remote_rsd_port,
scope_id: tc.tunnel_netstack.scope_id
);
var rsd_connection = yield tc.tunnel_netstack.open_tcp_connection (rsd_endpoint, cancellable);
var disco = yield DiscoveryService.open (rsd_connection, cancellable);
tunnel_connection = tc;
_discovery_service = disco;
}
public async void close (Cancellable? cancellable) throws IOError {
_discovery_service.close ();
yield tunnel_connection.close (cancellable);
if (ncm != null)
ncm.close ();
}
public async IOStream open_tcp_connection (uint16 port, Cancellable? cancellable) throws Error, IOError {
var netstack = tunnel_connection.tunnel_netstack;
var endpoint = (InetSocketAddress) Object.new (typeof (InetSocketAddress),
address: tunnel_connection.remote_address,
port: port,
scope_id: netstack.scope_id
);
return yield netstack.open_tcp_connection (endpoint, cancellable);
}
private void on_tunnel_connection_close () {
lost ();
}
}
private sealed class PortableCoreDeviceBackend : Object, Backend, UsbDeviceBackend {
public PairingStore pairing_store {
get;
construct;
}
public bool supports_modeswitch {
get {
return LibUSB.has_capability (HAS_HOTPLUG) != 0;
@@ -811,8 +971,6 @@ namespace Frida.Fruity {
private Gee.Map<string, PortableCoreDeviceNetworkTransport> network_transports =
new Gee.HashMap<string, PortableCoreDeviceNetworkTransport> ();
private PairingStore pairing_store = new PairingStore ();
private MainContext main_context;
private Cancellable io_cancellable = new Cancellable ();
@@ -832,6 +990,10 @@ namespace Frida.Fruity {
private delegate void NotifyCompleteFunc ();
public PortableCoreDeviceBackend (PairingStore pairing_store) {
Object (pairing_store: pairing_store);
}
construct {
main_context = MainContext.ref_thread_default ();
@@ -1403,7 +1565,8 @@ namespace Frida.Fruity {
supported_by_os = ios_major_version >= 17;
}
} catch (LockdownError e) {
throw new Error.PERMISSION_DENIED ("%s", e.message);
if (!(e is LockdownError.NOT_PAIRED))
throw new Error.PERMISSION_DENIED ("%s", e.message);
}
}
@@ -1564,36 +1727,65 @@ namespace Frida.Fruity {
public signal void response_received (Bytes response, InetSocketAddress sender);
public NetworkStack netstack;
public UdpSocket sock;
public DatagramBasedSource response_source;
private Cancellable? io_cancellable;
private UdpSocket sock;
private DatagramBased sock_datagram;
private Bytes remoted_mdns_request;
private InetSocketAddress mdns_address;
private TimeoutSource retransmit_source;
private DatagramBasedSource response_source;
public ActiveMulticastDnsProbe (InetSocketAddress ifaddr, MainContext main_context, Cancellable? cancellable)
throws Error, IOError {
var local_ip = ifaddr.get_address ();
netstack = new SystemNetworkStack (local_ip, ifaddr.scope_id);
io_cancellable = cancellable;
sock = netstack.create_udp_socket ();
sock.bind ((InetSocketAddress) Object.new (typeof (InetSocketAddress),
address: local_ip,
scope_id: netstack.scope_id
));
DatagramBased sock_datagram = sock.datagram_based;
sock_datagram = sock.datagram_based;
var remoted_mdns_request = make_remoted_mdns_request ();
var mdns_address = (InetSocketAddress) Object.new (typeof (InetSocketAddress),
remoted_mdns_request = make_remoted_mdns_request ();
mdns_address = (InetSocketAddress) Object.new (typeof (InetSocketAddress),
address: new InetAddress.from_string ("ff02::fb"),
port: 5353,
scope_id: netstack.scope_id
);
Udp.send_to (remoted_mdns_request.get_data (), mdns_address, sock_datagram, cancellable);
retransmit_source = new TimeoutSource (250);
retransmit_source.set_callback (on_retransmit_tick);
retransmit_source.attach (main_context);
response_source = sock_datagram.create_source (IN, cancellable);
response_source.set_callback (on_socket_readable);
response_source.attach (main_context);
transmit_request ();
}
public void cancel () {
response_source.destroy ();
retransmit_source.destroy ();
}
private void transmit_request () throws Error, IOError {
Udp.send_to (remoted_mdns_request.get_data (), mdns_address, sock_datagram, io_cancellable);
}
private bool on_retransmit_tick () {
try {
transmit_request ();
} catch (GLib.Error e) {
}
return Source.CONTINUE;
}
private bool on_socket_readable () {
+6 -3
View File
@@ -825,7 +825,9 @@ namespace Frida.Fruity.Injector {
yield restore_main_thread_state (cancellable);
uint64? libdyld_initialize = dyld_symbols["__ZN5dyld44APIs19_libdyld_initializeEPKNS_16LibSystemHelpersE"];
uint64? libdyld_initialize = dyld_symbols["__ZN5dyld44APIs19_libdyld_initializeEv"];
if (libdyld_initialize == null)
libdyld_initialize = dyld_symbols["__ZN5dyld44APIs19_libdyld_initializeEPKNS_16LibSystemHelpersE"];
if (libdyld_initialize != null)
yield ensure_libsystem_initialized_for_dyld_v4_and_above (libdyld_initialize, dyld_symbols, cancellable);
else
@@ -848,9 +850,10 @@ namespace Frida.Fruity.Injector {
uint64? notify_objc_init = dyld_symbols["__ZN5dyld412RuntimeState14notifyObjCInitEPKNS_6LoaderE"];
uint64 initializer = (notify_objc_init != null) ? notify_objc_init : libdyld_initialize;
GDB.Breakpoint init_breakpoint = yield lldb.add_breakpoint (SOFT, initializer, 4, cancellable);
GDB.Breakpoint? restart_breakpoint = null;
uint64? restart_with_dyld_in_cache = dyld_symbols["__ZN5dyld422restartWithDyldInCacheEPKNS_10KernelArgsEPKN5dyld39MachOFileEPK15DyldSharedCachePv"];
uint64? restart_with_dyld_in_cache = dyld_symbols["__ZN5dyld422restartWithDyldInCacheEPKNS_10KernelArgsEPKN6mach_o6HeaderEPK15DyldSharedCachePv"];
if (restart_with_dyld_in_cache == null)
restart_with_dyld_in_cache = dyld_symbols["__ZN5dyld422restartWithDyldInCacheEPKNS_10KernelArgsEPKN5dyld39MachOFileEPK15DyldSharedCachePv"];
if (restart_with_dyld_in_cache == null)
restart_with_dyld_in_cache = dyld_symbols["__ZN5dyld422restartWithDyldInCacheEPKNS_10KernelArgsEPKN5dyld39MachOFileEPv"];
if (restart_with_dyld_in_cache != null)
+3 -3
View File
@@ -584,7 +584,7 @@ namespace Frida.Fruity {
}
private bool pcb_is_writable () {
return pcb.query_send_buffer_space () > LWIP.Tcp.SEND_LOW_WATERMARK &&
return pcb.query_send_buffer_space () > 0 &&
pcb.query_send_queue_length () < LWIP.Tcp.SEND_QUEUE_LOW_WATERMARK;
}
@@ -677,7 +677,7 @@ namespace Frida.Fruity {
do {
flags = COPY;
size_t len = buffer.length;
size_t len = buffer.length - n;
if (len > uint16.MAX) {
len = uint16.MAX;
flags |= MORE;
@@ -687,7 +687,7 @@ namespace Frida.Fruity {
if (available_space < len) {
len = available_space;
if (len == 0)
return OK;
break;
}
write_err = pcb.write (buffer[n:n + len], flags);
+10 -1
View File
@@ -156,12 +156,21 @@ namespace Frida.Fruity {
switch (top) {
case 0:
switch (bottom) {
case 1:
return true;
case 2:
return false;
case 3:
if ((flags & ValueFlags.ALLOW_TERMINATOR) == 0)
throw new Error.PROTOCOL ("Unexpected OPACK terminator");
return null;
}
throw new Error.NOT_SUPPORTED ("Unsupported OPACK type 0x%02x", v);
if (bottom < 8)
throw new Error.NOT_SUPPORTED ("Unsupported OPACK type 0x%02x", v);
return (int64) (v - 8);
case 1:
case 2:
return (int64) (v - 8);
case 3:
switch (bottom) {
case 0: return (int64) reader.read_int8 ();
+51 -62
View File
@@ -1983,12 +1983,7 @@ namespace Frida.Fruity {
}
public sealed class TcpTunnelConnection : Object, TunnelConnection, AsyncInitable {
public InetSocketAddress address {
get;
construct;
}
public NetworkStack netstack {
public IOStream stream {
get;
construct;
}
@@ -1999,16 +1994,6 @@ namespace Frida.Fruity {
}
}
public TunnelKey local_keypair {
get;
construct;
}
public TunnelKey remote_pubkey {
get;
construct;
}
public InetAddress remote_address {
get {
return tunnel_params.server_address;
@@ -2026,7 +2011,6 @@ namespace Frida.Fruity {
private TunnelParameters tunnel_params;
private VirtualNetworkStack _tunnel_netstack;
private TlsClientConnection connection;
private BufferedInputStream input;
private OutputStream output;
@@ -2040,7 +2024,38 @@ namespace Frida.Fruity {
public static async TcpTunnelConnection open (InetSocketAddress address, NetworkStack netstack, TunnelKey local_keypair,
TunnelKey remote_pubkey, Cancellable? cancellable = null) throws Error, IOError {
var connection = new TcpTunnelConnection (address, netstack, local_keypair, remote_pubkey);
var stream = yield netstack.open_tcp_connection (address, cancellable);
TlsClientConnection tls_connection;
try {
tls_connection = TlsClientConnection.new (stream, null);
} catch (GLib.Error e) {
assert_not_reached ();
}
tls_connection.set_data ("tcp-tunnel-keypair", local_keypair);
tls_connection.set_database (null);
unowned SSL ssl = get_ssl_handle_from_connection (tls_connection);
ssl.set_cipher_list ("PSK-AES128-GCM-SHA256:PSK-AES256-GCM-SHA384:PSK-AES256-CBC-SHA384:PSK-AES128-CBC-SHA256");
ssl.set_psk_client_callback ((ssl, hint, identity, psk) => {
unowned TlsClientConnection conn = (TlsClientConnection) get_connection_from_ssl_handle (ssl);
unowned TunnelKey tk = conn.get_data ("tcp-tunnel-keypair");
Memory.copy (identity, PSK_IDENTITY.data, PSK_IDENTITY.data.length);
var key = get_raw_private_key (tk.handle).get_data ();
Memory.copy (psk, key, key.length);
return key.length;
});
try {
yield tls_connection.handshake_async (Priority.DEFAULT, cancellable);
} catch (GLib.Error e) {
throw new Error.PROTOCOL ("%s", e.message);
}
var connection = new TcpTunnelConnection (tls_connection);
try {
yield connection.init_async (Priority.DEFAULT, cancellable);
@@ -2051,46 +2066,29 @@ namespace Frida.Fruity {
return connection;
}
private TcpTunnelConnection (InetSocketAddress address, NetworkStack netstack, TunnelKey local_keypair,
TunnelKey remote_pubkey) {
Object (
address: address,
netstack: netstack,
local_keypair: local_keypair,
remote_pubkey: remote_pubkey
);
public static async TcpTunnelConnection open_stream (IOStream stream, Cancellable? cancellable = null)
throws Error, IOError {
var connection = new TcpTunnelConnection (stream);
try {
yield connection.init_async (Priority.DEFAULT, cancellable);
} catch (GLib.Error e) {
throw_api_error (e);
}
return connection;
}
private TcpTunnelConnection (IOStream stream) {
Object (stream: stream);
}
private async bool init_async (int io_priority, Cancellable? cancellable) throws Error, IOError {
var stream = yield netstack.open_tcp_connection (address, cancellable);
try {
connection = TlsClientConnection.new (stream, null);
} catch (GLib.Error e) {
assert_not_reached ();
}
connection.set_data_full ("tcp-tunnel-connection", this, null);
connection.set_database (null);
unowned SSL ssl = get_ssl_handle_from_connection (connection);
ssl.set_cipher_list ("PSK-AES128-GCM-SHA256:PSK-AES256-GCM-SHA384:PSK-AES256-CBC-SHA384:PSK-AES128-CBC-SHA256");
ssl.set_psk_client_callback ((ssl, hint, identity, psk) => {
unowned TlsClientConnection conn = (TlsClientConnection) get_connection_from_ssl_handle (ssl);
TcpTunnelConnection self = conn.get_data ("tcp-tunnel-connection");
return self.on_psk_request (ssl, hint, identity, psk);
});
try {
yield connection.handshake_async (Priority.DEFAULT, cancellable);
} catch (GLib.Error e) {
throw new Error.PROTOCOL ("%s", e.message);
}
input = (BufferedInputStream) Object.new (typeof (BufferedInputStream),
"base-stream", connection.get_input_stream (),
"base-stream", stream.get_input_stream (),
"close-base-stream", false,
"buffer-size", 128 * 1024);
output = connection.get_output_stream ();
output = stream.get_output_stream ();
post (make_handshake_request (PREFERRED_MTU));
@@ -2132,7 +2130,7 @@ namespace Frida.Fruity {
yield;
try {
yield connection.close_async ();
yield stream.close_async ();
} catch (GLib.Error e) {
}
@@ -2248,15 +2246,6 @@ namespace Frida.Fruity {
}
}
private uint on_psk_request (SSL ssl, string? hint, char[] identity, uint8[] psk) {
Memory.copy (identity, PSK_IDENTITY.data, PSK_IDENTITY.data.length);
var key = get_raw_private_key (local_keypair.handle).get_data ();
Memory.copy (psk, key, key.length);
return key.length;
}
[CCode (cname = "g_tls_connection_openssl_get_ssl")]
private extern static unowned SSL get_ssl_handle_from_connection (void * connection);
@@ -1,3 +1,5 @@
import Java from 'frida-java-bridge';
let ApplicationInfo, Base64OutputStream, Bitmap, ByteArrayOutputStream, Canvas, ComponentName, ContextWrapper, Intent, ResolveInfo,
RunningAppProcessInfo, RunningTaskInfo, UserHandle;
let ACTION_MAIN, ARGB_8888, CATEGORY_HOME, CATEGORY_LAUNCHER, GET_ACTIVITIES, FLAG_ACTIVITY_NEW_TASK, FLAG_DEBUGGABLE, NO_WRAP, PNG;
+18
View File
@@ -0,0 +1,18 @@
system_server_js = custom_target('system-server.js',
input: [
'package.json',
'package-lock.json',
'index.js',
],
output: [
'system-server.js',
],
command: [
python,
compile_js_agent,
'@OUTPUT@',
'@PRIVATE_DIR@',
npm,
'@INPUT@',
],
)
+553
View File
@@ -0,0 +1,553 @@
{
"name": "frida-system-server-agent",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "frida-system-server-agent",
"version": "1.0.0",
"dependencies": {
"frida-java-bridge": "^7.0.1"
},
"devDependencies": {
"@types/frida-gum": "^19.0.0",
"frida-compile": "^17.0.0"
}
},
"node_modules/@frida/assert": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@frida/assert/-/assert-3.0.2.tgz",
"integrity": "sha512-JXJq5SbXGrM5EkjrZKfRmB29zOoEOix02NC6A5TSJ+C1GE/X051EinJJsuOO2pEOx7KZwpvAHvS0WXW0+levKg==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/base64-js": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@frida/base64-js/-/base64-js-2.0.3.tgz",
"integrity": "sha512-2w0F+1TynOTCZ/v7du9LdHPWwq0lJhazjo2fF9upMyQmA1zHetT14fLuQ1v/6T0qPgyeEGkiSrybstU8EsgeUA==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
},
"node_modules/@frida/buffer": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/@frida/buffer/-/buffer-7.0.4.tgz",
"integrity": "sha512-RxQ1lZRRiCJj7nhcCiD8xeJx0NsLpGGnjqsmTg7jShGmbnVFMN5W7+J+3gqdPSQhc/IxNBIWc6zRXVp4+qnYHg==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT",
"dependencies": {
"base64-js": "^1.5.1",
"ieee754": "^1.2.1"
}
},
"node_modules/@frida/crosspath": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@frida/crosspath/-/crosspath-3.0.0.tgz",
"integrity": "sha512-bNdO1spIPD2P40XtK89N49oZpJhstdlnkJZcD4yJ17jrdkm9Ctu0sd9MIEX6Z8Tm8ydhVJBAOMEKl9/R27onAQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "^17.0.36"
},
"engines": {
"node": ">=14.9.0"
}
},
"node_modules/@frida/crypto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@frida/crypto/-/crypto-1.0.1.tgz",
"integrity": "sha512-WXTkVjESvX8TIVXIynJJv9BKSIdQP0Iis04StIXknkDi1ULdMlrypA9p5C4KW1H6GCkNsVnKbybpzsulYCTvag==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/diagnostics_channel": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@frida/diagnostics_channel/-/diagnostics_channel-1.0.0.tgz",
"integrity": "sha512-mYX1jp/5Bpk24tHArJNx65iCk7qSuV8YJkdU0gFNVtJUXxfV8BG5WuPa4mL+ynxsbWWpsg/cwKZbLAepYKTdQQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/events": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/@frida/events/-/events-4.0.4.tgz",
"integrity": "sha512-qJVQ6VWHf9sjUKuiJzoCAC00frbpcwxeYfvQ+PP9LU/d70j+QvjWgYe98Qa3ekLaBU6r/AvWm8ThKCDUCLWrQQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.8.x"
}
},
"node_modules/@frida/http": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/@frida/http/-/http-4.0.2.tgz",
"integrity": "sha512-cvkc7ex7GmVXVOWqtjXKBWUUbYEBgpNRKZbEEoMeI8KiIs8zejKwg+N7rx7296Ao+EP3+xcUr4wBVr3xLaUVfQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"http-parser-js": "^0.5.3"
}
},
"node_modules/@frida/http-parser-js": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@frida/http-parser-js/-/http-parser-js-1.0.0.tgz",
"integrity": "sha512-2nMrNXt/OeTlWbqnE8AH4Sfz4I2+BGoN206dzKEyC/g2svtn83Xu+zuv/V3TkwrA27s26Mcy84ZwsXeNlqNxUQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/https": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@frida/https/-/https-1.0.0.tgz",
"integrity": "sha512-OiqQ6qsALcWOktRLq07oJ0i6sH8eX6MXb/MdZS1qVKDRf6wchH4Pjn6fiLB+pt/OlYbggk+DOfpHwSdjTwuHMQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/ieee754": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@frida/ieee754/-/ieee754-2.0.2.tgz",
"integrity": "sha512-wlcUebnne4ENN7GDr5pTH598ZDLMVOsh0FjenxeVOe6u7ewZkz9gGRnLnZKJAm9kl5G6XhdxhI0cSXVQK/rQUw==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "BSD-3-Clause"
},
"node_modules/@frida/net": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/@frida/net/-/net-4.0.2.tgz",
"integrity": "sha512-qQRe7hQ+ZfCcG/SE3P1TRqQ9bmuK/T7wPCYaT4z56rBPWAxsaQbQHpX4fR6OrFaSDr7X0xJLsTbdIp9hGhhLZg==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/os": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@frida/os/-/os-1.0.2.tgz",
"integrity": "sha512-3ISAiGNiyIya3QN2EHBCz1wqP0enTdSxP99wUeroeh8+AQRmgoOr/5TRnrVry8pe378anay3fmV/tdUMMSkehQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/path": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@frida/path/-/path-2.0.3.tgz",
"integrity": "sha512-2RQy36QatoC846fzBhBhV8sXMsSOBGoYvwTHeaE1zUdz7F4RNScP4QEekTTooBYWYX/XjiF36KQpYAzc9OYFtg==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/process": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@frida/process/-/process-1.2.1.tgz",
"integrity": "sha512-nvCu22DstFW2ttGFtOKekHM7vnjbZm+XgtvavOt427GNT6uV7k0JYK9tnMbcLMRWv57DG6udAmuJlWs8Paq1ag==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/punycode": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@frida/punycode/-/punycode-3.0.0.tgz",
"integrity": "sha512-XVSDY2KamDs1D5/fTVgHcOSNxdU4kTboxzqJMBbTjcQC7XScIT9c0EfbwKCq7Kci6gWQdsHSCr7lU+9Oc4KAdg==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/querystring": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@frida/querystring/-/querystring-1.0.0.tgz",
"integrity": "sha512-15m1fOZPmoO/vWlgPJrG/J9/BJDz6a2/JpVGpS8ynNzo+fBhTznaStX5nHxUs24mVTqh/OqLo0EiYJM5WWHXxg==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/readable-stream": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/@frida/readable-stream/-/readable-stream-4.1.3.tgz",
"integrity": "sha512-ntGUFmi+CryRGRJIK13a/VST2Ad19uivbln8Xd92vKPAARq+6vMIASDyZIqyl5BLRccfiyCHdYgrgQ6RI5rUig==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/reserved-words": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@frida/reserved-words/-/reserved-words-1.0.0.tgz",
"integrity": "sha512-2yG/XxJlsGlk/mm6eZTb4OAaQEhkTI2qaFfZFtAsrA/XuCpuMWkS4y/guyBlsRu4hAuhK2HPmNM8+OLLK1zM9Q==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/stream": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@frida/stream/-/stream-1.0.2.tgz",
"integrity": "sha512-4OuaC1ztmEKgTq3WeBhsy8Oq+AwW9n9cYnvLklcC9jwD93AEwgbWpecLlxJCVuALvTMdhKPg0nQVfyGYP/i9Bw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@frida/readable-stream": "^4.1.3"
}
},
"node_modules/@frida/string_decoder": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@frida/string_decoder/-/string_decoder-2.0.0.tgz",
"integrity": "sha512-in371tYZMHQiW9HF5MS3JDw6Ao6tyBoq34UWy2rzOswYyMG1rpizh85ofi/yVkxDiaqybEZefxzkVittpPGT6g==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/terser": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@frida/terser/-/terser-1.0.0.tgz",
"integrity": "sha512-59h9WuNzD1Rx/zwoWqQ/FW/4Y/Q3R91Eng2hEwdHapqiTDvtKbZ08F6CynCR7ZVinrh4tLYsF46AtVPTz1ys9g==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"@jridgewell/source-map": "^0.3.2",
"acorn": "^8.5.0",
"commander": "^2.20.0",
"source-map-support": "~0.5.20"
},
"bin": {
"terser": "bin/terser"
},
"engines": {
"node": ">=10"
}
},
"node_modules/@frida/terser/node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/timers": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@frida/timers/-/timers-3.0.0.tgz",
"integrity": "sha512-3b+0igv10aT8TMxefrTAd06rActqbxJLY2Xkkq9vYcPBffB/yHszl0NYIp/5ko8WC3ecDYPU6bQiY6fjs72zTA==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/tty": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@frida/tty/-/tty-1.0.0.tgz",
"integrity": "sha512-p/kjLnKYxEAB1MdYP8+5rKv9CsHzyA+0jg9BcGETzjQVKHHcroHDULRxDYUh+DC7qs6cpX8QdDQh9E+a6ydgsQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/url": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@frida/url/-/url-1.0.2.tgz",
"integrity": "sha512-ZKunbKJHMr8w2Eb/5K1avy0MzK1B998S17wYXNv3RmzBGxMm8S5T0F3qEpRxkU7/72P8m4izyQU87fWl+FjQsQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@frida/punycode": "^3.0.0",
"@frida/querystring": "^1.0.0"
}
},
"node_modules/@frida/util": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@frida/util/-/util-1.0.3.tgz",
"integrity": "sha512-htcG3uDiRXv89ERVNNYhfase39kJ2X75ZARfrYcYEtJLFEsSk0nemM1YnEIR4CjrHvdvkWHrwgKkS+acOyoNEg==",
"dev": true,
"license": "MIT"
},
"node_modules/@frida/vm": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@frida/vm/-/vm-2.0.0.tgz",
"integrity": "sha512-7fsjLWscZT5odNIBtg6qbLNI+vAk1xmii6H5W2kaYkMYt0vRohQEcDSUWacA+eaWlu5SvMjZI82Yibj/3G9pJw==",
"dev": true,
"license": "MIT"
},
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.8",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
"integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/set-array": "^1.2.1",
"@jridgewell/sourcemap-codec": "^1.4.10",
"@jridgewell/trace-mapping": "^0.3.24"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/set-array": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
"integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/source-map": {
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
"integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.25",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
"integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@types/frida-gum": {
"version": "19.0.0",
"resolved": "https://registry.npmjs.org/@types/frida-gum/-/frida-gum-19.0.0.tgz",
"integrity": "sha512-qViK1KwvPEAkajwSUv0wpZvZLiX8xO4JFFCh8dfYZfzSyOEfoE0KliCP/nJSKIKG6N3hXnPowrvPufjs5fLKAA==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/node": {
"version": "17.0.45",
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz",
"integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==",
"dev": true,
"license": "MIT"
},
"node_modules/acorn": {
"version": "8.14.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
"integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
"dev": true,
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
},
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true,
"license": "MIT"
},
"node_modules/commander": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
"integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=16"
}
},
"node_modules/frida-compile": {
"version": "17.0.0",
"resolved": "https://registry.npmjs.org/frida-compile/-/frida-compile-17.0.0.tgz",
"integrity": "sha512-ixJRj14qLH/Z0ckFWd5fKeDMm0W2+2WDpSGnLRgpn0nuCQAbDHRCqVCWtPnV8uzPJmA6XOX0pujsMpYe9q9RRw==",
"dev": true,
"dependencies": {
"@frida/assert": "^3.0.1",
"@frida/base64-js": "^2.0.3",
"@frida/buffer": "^7.0.4",
"@frida/crosspath": "^3.0.0",
"@frida/crypto": "^1.0.1",
"@frida/diagnostics_channel": "^1.0.0",
"@frida/events": "^4.0.4",
"@frida/http": "^4.0.2",
"@frida/http-parser-js": "^1.0.0",
"@frida/https": "^1.0.0",
"@frida/ieee754": "^2.0.2",
"@frida/net": "^4.0.1",
"@frida/os": "^1.0.0",
"@frida/path": "^2.0.3",
"@frida/process": "^1.2.1",
"@frida/punycode": "^3.0.0",
"@frida/querystring": "^1.0.0",
"@frida/readable-stream": "^4.1.3",
"@frida/reserved-words": "^1.0.0",
"@frida/stream": "^1.0.2",
"@frida/string_decoder": "^2.0.0",
"@frida/terser": "^1.0.0",
"@frida/timers": "^3.0.0",
"@frida/tty": "^1.0.0",
"@frida/url": "^1.0.2",
"@frida/util": "^1.0.3",
"@frida/vm": "^2.0.0",
"commander": "^11.1.0",
"frida-fs": "^6.0.0",
"typed-emitter": "^2.1.0"
},
"bin": {
"frida-compile": "dist/cli.js"
}
},
"node_modules/frida-fs": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/frida-fs/-/frida-fs-6.0.0.tgz",
"integrity": "sha512-I0fnKupZh7fU2ixwCIjJnEqNdhfm/SC1ZYBMy58EmeqOWSbjw1Dpy99mJ7BJdbk2KNXJeaBZGxDYLtn0J9S+UA==",
"dev": true,
"license": "MIT"
},
"node_modules/frida-java-bridge": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/frida-java-bridge/-/frida-java-bridge-7.0.1.tgz",
"integrity": "sha512-pyNv12Y+erFgqdbFMsECh1OfqS77E62GeKHtxaBOZUPSpqcEkL0T2/6q/XD2161S4eGYBn6V7zumH2gbxtXK/Q==",
"license": "LGPL-2.0 WITH WxWindows-exception-3.1"
},
"node_modules/http-parser-js": {
"version": "0.5.10",
"resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz",
"integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==",
"dev": true,
"license": "MIT"
},
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "BSD-3-Clause"
},
"node_modules/rxjs": {
"version": "7.8.2",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
"integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
"dev": true,
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/source-map-support": {
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
"dev": true,
"license": "MIT",
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"dev": true,
"license": "0BSD",
"optional": true
},
"node_modules/typed-emitter": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz",
"integrity": "sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==",
"dev": true,
"license": "MIT",
"optionalDependencies": {
"rxjs": "*"
}
}
}
}
@@ -0,0 +1,16 @@
{
"name": "frida-system-server-agent",
"version": "1.0.0",
"description": "Agent used by Frida's Linux backend on Android",
"scripts": {
"prepare": "npm run build",
"build": "frida-compile index.js -o system-server.js -S -c"
},
"devDependencies": {
"@types/frida-gum": "^19.0.0",
"frida-compile": "^17.0.0"
},
"dependencies": {
"frida-java-bridge": "^7.0.1"
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+8 -3
View File
@@ -125,6 +125,9 @@ if have_local_backend
endif
if host_os_family == 'darwin'
subdir('darwin' / 'agent' / 'reportcrash')
subdir('darwin' / 'agent' / 'osanalytics')
backend_sources += [
'darwin' / 'darwin-host-session.vala',
'darwin' / 'darwin-host-session-glue.m',
@@ -137,8 +140,8 @@ if have_local_backend
'darwin' / 'frida-darwin.resources',
'darwin' / 'agent' / 'launchd.js',
'darwin' / 'agent' / 'xpcproxy.js',
'darwin' / 'agent' / 'reportcrash.js',
'darwin' / 'agent' / 'osanalytics.js',
reportcrash_js,
osanalytics_js,
],
output: [
'frida-data-darwin.vapi',
@@ -283,6 +286,8 @@ if have_local_backend
]
if host_os == 'android'
subdir('linux' / 'agent' / 'system-server')
backend_vala_args_private += frida_selinux_vala_args
backend_libs += frida_selinux
backend_deps += frida_selinux_dep
@@ -290,7 +295,7 @@ if have_local_backend
android_data = custom_target('frida-data-android',
input: [
'linux' / 'frida-android.resources',
'linux' / 'agent' / 'system-server.js',
system_server_js,
],
output: [
'frida-data-android.vapi',
+1 -1
View File
@@ -1,6 +1,6 @@
[wrap-git]
url = https://github.com/frida/frida-gum.git
revision = 16.7.10
revision = 17.0.2
depth = 1
[provide]
+1 -1
View File
@@ -1,6 +1,6 @@
[wrap-git]
url = https://github.com/frida/openssl.git
revision = ca4781aaf7910b623d3ae21c6a017e7e9ca6936c
revision = 7b86cb6a0c5cb9d79dca012c98a0a30a58eef5b5
depth = 1
[provide]
+50 -47
View File
@@ -1,54 +1,27 @@
CC := gcc
CFLAGS := -Wall -pipe -Os -fPIC -fdata-sections -ffunction-sections
LDFLAGS := -Wl,--gc-sections
ARCHS := \
linux-x86 \
linux-x86_64 \
linux-arm \
linux-armbe8 \
linux-armhf \
linux-arm64 \
linux-arm64be \
linux-arm64beilp32 \
linux-mips \
linux-mipsel \
linux-mips64 \
linux-mips64el
all: \
sleeper-linux-x86 \
sleeper-linux-x86_64 \
sleeper-linux-arm \
sleeper-linux-armhf \
sleeper-linux-arm64 \
sleeper-linux-mips \
sleeper-linux-mipsel \
sleeper-linux-mips64 \
sleeper-linux-mips64el \
forker-linux-x86 \
forker-linux-x86_64 \
forker-linux-arm \
forker-linux-armhf \
forker-linux-arm64 \
forker-linux-mips \
forker-linux-mipsel \
forker-linux-mips64 \
forker-linux-mips64el \
spawner-linux-x86 \
spawner-linux-x86_64 \
spawner-linux-arm \
spawner-linux-armhf \
spawner-linux-arm64 \
spawner-linux-mips \
spawner-linux-mipsel \
spawner-linux-mips64 \
spawner-linux-mips64el \
simple-agent-linux-x86.so \
simple-agent-linux-x86_64.so \
simple-agent-linux-arm.so \
simple-agent-linux-armhf.so \
simple-agent-linux-arm64.so \
simple-agent-linux-mips.so \
simple-agent-linux-mipsel.so \
simple-agent-linux-mips64.so \
simple-agent-linux-mips64el.so \
resident-agent-linux-x86.so \
resident-agent-linux-x86_64.so \
resident-agent-linux-arm.so \
resident-agent-linux-armhf.so \
resident-agent-linux-arm64.so \
resident-agent-linux-mips.so \
resident-agent-linux-mipsel.so \
resident-agent-linux-mips64.so \
resident-agent-linux-mips64el.so \
$(NULL)
all: $(ARCHS) $(NULL)
define declare-arch
$1: resident-agent-$1.so simple-agent-$1.so sleeper-$1 forker-$1 spawner-$1
endef
$(foreach arch,$(ARCHS),$(eval $(call declare-arch,$(arch))))
define declare-executable
$1-linux-x86: $2
@@ -66,6 +39,11 @@ $1-linux-arm: $2
arm-linux-gnueabi-strip --strip-all $$@.tmp
mv $$@.tmp $$@
$1-linux-armbe8: $2
armeb-linux-gnueabi-gcc $$(CFLAGS) $$(LDFLAGS) $$< -o $$@.tmp $3
armeb-linux-gnueabi-strip --strip-all $$@.tmp
mv $$@.tmp $$@
$1-linux-armhf: $2
arm-linux-gnueabihf-gcc $$(CFLAGS) $$(LDFLAGS) $$< -o $$@.tmp $3
arm-linux-gnueabihf-strip --strip-all $$@.tmp
@@ -76,6 +54,16 @@ $1-linux-arm64: $2
aarch64-linux-gnu-strip --strip-all $$@.tmp
mv $$@.tmp $$@
$1-linux-arm64be: $2
aarch64_be-linux-gnu-gcc $$(CFLAGS) $$(LDFLAGS) $$< -o $$@.tmp $3
aarch64_be-linux-gnu-strip --strip-all $$@.tmp
mv $$@.tmp $$@
$1-linux-arm64beilp32: $2
aarch64_be-linux-gnu_ilp32-gcc $$(CFLAGS) $$(LDFLAGS) $$< -o $$@.tmp $3
aarch64_be-linux-gnu_ilp32-strip --strip-all $$@.tmp
mv $$@.tmp $$@
$1-linux-mips: $2
mips-linux-gnu-gcc $$(CFLAGS) $$(LDFLAGS) $$< -o $$@.tmp $3
mips-linux-gnu-strip --strip-all $$@.tmp
@@ -118,6 +106,11 @@ $(eval $(call declare-executable,spawner,spawner-unix.c,-ldl))
arm-linux-gnueabi-strip --strip-all $@.tmp
mv $@.tmp $@
%-agent-linux-armbe8.so: %-agent.c
armeb-linux-gnueabi-gcc $(CFLAGS) $(LDFLAGS) -shared $< -o $@.tmp
armeb-linux-gnueabi-strip --strip-all $@.tmp
mv $@.tmp $@
%-agent-linux-armhf.so: %-agent.c
arm-linux-gnueabihf-gcc $(CFLAGS) $(LDFLAGS) -shared $< -o $@.tmp
arm-linux-gnueabihf-strip --strip-all $@.tmp
@@ -128,6 +121,16 @@ $(eval $(call declare-executable,spawner,spawner-unix.c,-ldl))
aarch64-linux-gnu-strip --strip-all $@.tmp
mv $@.tmp $@
%-agent-linux-arm64be.so: %-agent.c
aarch64_be-linux-gnu-gcc $(CFLAGS) $(LDFLAGS) -shared $< -o $@.tmp
aarch64_be-linux-gnu-strip --strip-all $@.tmp
mv $@.tmp $@
%-agent-linux-arm64beilp32.so: %-agent.c
aarch64_be-linux-gnu_ilp32-gcc $(CFLAGS) $(LDFLAGS) -shared $< -o $@.tmp
aarch64_be-linux-gnu_ilp32-strip --strip-all $@.tmp
mv $@.tmp $@
%-agent-linux-mips.so: %-agent.c
mips-linux-gnu-gcc $(CFLAGS) $(LDFLAGS) -shared $< -o $@.tmp
mips-linux-gnu-strip --strip-all $@.tmp
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+106
View File
@@ -0,0 +1,106 @@
#!/bin/bash
# This script is responsible for building Frida helpers for various Linux
# architectures. It can build helpers for a single specified architecture on the
# local machine, or for supported architectures in a container. The script uses
# Docker containers to ensure consistent build environments for each
# architecture.
#
# Note that the expectation is that when running the build for a specific
# architecture that it be run from inside the relevant container. This script is
# used by CI.
set -euo pipefail
CURRENT_FILE="${BASH_SOURCE[0]}"
HELPERS_DIR="$(cd "$(dirname "$CURRENT_FILE")" && pwd)"
FRIDA_CORE_DIR="$(cd "$HELPERS_DIR/../.." && pwd)"
RELENG_DIR="$FRIDA_CORE_DIR/releng"
BUILD_DIR="$FRIDA_CORE_DIR/build"
RELATIVE_TO_FRIDA_CORE_DIR=$(realpath --relative-to="$FRIDA_CORE_DIR" "$CURRENT_FILE")
TMP_MESON_DIR=$(mktemp -d)
trap 'rm -rf "$TMP_MESON_DIR"' EXIT
CONTAINER_REGISTRY="${CONTAINER_REGISTRY:-ghcr.io/frida}"
main () {
if [ "$#" -eq 0 ]; then
build_arches_in_container
return
fi
if [ "$#" -gt 1 ]; then
echo >&2 "Error: Too many arguments"
usage
fi
build_arch "$1"
}
usage () {
echo >&2 "Usage: $0 [<arch>]"
echo >&2 "If no arch is specified, then all helpers will be built in the container."
exit 1
}
ARCHS=(
x86
x86_64
arm
armbe8
arm64
arm64be
arm64beilp32
mips
mipsel
mips64
mips64el
)
build_arch () {
ARCH=$1
if [ -z "$ARCH" ]; then
usage
fi
if ! printf '%s\n' "${ARCHS[@]}" | grep -qx "$ARCH"; then
echo >&2 "Error: Invalid architecture '$ARCH'"
echo >&2 "Supported architectures: ${ARCHS[*]}"
exit 1
fi
export FRIDA_HOST=linux-$ARCH
EXTRA_FLAGS=()
if [ "$FRIDA_HOST" == "linux-x86" ]; then
EXTRA_FLAGS+=("--build=linux-x86")
export CC="gcc -m32" CXX="g++ -m32" STRIP="strip"
fi
case "$ARCH" in
armbe8 | arm64be | arm64beilp32)
EXTRA_FLAGS+=("--without-prebuilds=sdk:host")
;;
esac
cd "$FRIDA_CORE_DIR"
rm -rf "$BUILD_DIR"
# Note that $XTOOLS_HOST is set by the container.
./configure --host="$XTOOLS_HOST" "${EXTRA_FLAGS[@]}"
make -C tests/labrats -f Makefile.linux.mk -B "$FRIDA_HOST"
}
build_arches_in_container () {
for ARCH in "${ARCHS[@]}"; do
docker run \
-w /frida-core \
-i -t \
--rm \
-v "$FRIDA_CORE_DIR:/frida-core" \
"$CONTAINER_REGISTRY/core-linux-helpers-$ARCH:latest" \
"/frida-core/$RELATIVE_TO_FRIDA_CORE_DIR" "$ARCH"
done
}
main "$@"
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loaded 100 of 114 files, more files were not shown because too many files have changed in this diff. Show more