Merge remote-tracking branch 'origin/GP-1681_d-millar_Frida_library_reconfig--SQUASHED'

This commit is contained in:
Ryan Kurtz 2022-03-19 01:41:44 -04:00
commit ce48e25d46
11 changed files with 361 additions and 148 deletions

View file

@ -1,15 +1,16 @@
Random Notes on the Implementation of Debugger-agent-frida
- Building libfrida-core.so:
You can download libfrida-core.a for Frida by grabbing the latest frida-core-devkit for your OS from https://github.com/frida/frida/releases or by downloading the Frida source and running:
You can download libfrida-core.a for Frida by grabbing the latest frida-core-devkit for your OS from
https://github.com/frida/frida/releases
or by downloading the Frida source and running:
python3 devkit.py frida-core linux-x86_64 DEVKIT
from the "releng" directory.
python3 devkit.py frida-core linux-x86_64 DEVKIT
Ghidra needs a dynamically-loadable version of libfrida-core.a which you can generate by something like:
from the "releng" directory. Ghidra needs a dynamically-loadable version of this which you can generate by something like:
ar -x libfrida-core.a
rm meson-generated_.._.._.._gum_gumenumtypes.c.o
g++ -shared -o libfrida-core.so *.o -ldl -lm -latomic -lrt -lpthread -lresolv -pthread -fuse-ld=gold -Wl,--export-dynamic,--icf=all,--gc-sections,-z,noexecstack -static-libgcc -ffunction-sections -fPIC -fdata-sections -m64 -Os -pipe -g3 -lstdc++
cp ghidra_wrapper.c into the directory with libfrida-core.a and frida-core.h (distro or DEVKIT)
g++ -shared ghidra_wrapper.c ./libfrida-core.a -o libfrida-core.so
Libfrida-core.so should then be added to the jna.library.path or put someplace like /usr/lib/x86_64-linux-gnu, where it will get picked up by Native.load().

View file

@ -0,0 +1,208 @@
/* ###
* IP: GHIDRA
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "frida-core.h"
#include <stdio.h>
#include <stdarg.h>
extern "C" {
void GH_frida_init (void) {
frida_init ();
}
FridaDeviceManager * GH_frida_device_manager_new (void) {
return frida_device_manager_new();
}
void GH_frida_device_manager_close_sync (FridaDeviceManager * self, GCancellable * cancellable, GError ** error) {
frida_device_manager_close_sync(self, cancellable, error);
}
FridaDevice * GH_frida_device_manager_find_device_by_type_sync (FridaDeviceManager * self, FridaDeviceType type, gint timeout, GCancellable * cancellable, GError ** error) {
return frida_device_manager_find_device_by_type_sync(self, type, timeout, cancellable, error);
}
FridaDeviceList * GH_frida_device_manager_enumerate_devices_sync (FridaDeviceManager * self, GCancellable * cancellable, GError ** error) {
return frida_device_manager_enumerate_devices_sync(self, cancellable, error);
}
gint GH_frida_device_list_size (FridaDeviceList * self) {
return frida_device_list_size (self);
}
FridaDevice * GH_frida_device_list_get (FridaDeviceList * self, gint index) {
return frida_device_list_get(self, index);
}
const gchar * GH_frida_device_get_name (FridaDevice * self) {
return frida_device_get_name(self);
}
FridaProcessList * GH_frida_device_enumerate_processes_sync (FridaDevice * self, FridaProcessQueryOptions * options, GCancellable * cancellable, GError ** error) {
return frida_device_enumerate_processes_sync(self, options, cancellable, error);
}
/* ProcessList */
gint GH_frida_process_list_size (FridaProcessList * self) {
return frida_process_list_size(self);
}
FridaProcess * GH_frida_process_list_get (FridaProcessList * self, gint index) {
return frida_process_list_get(self, index);
}
/* Process */
guint GH_frida_process_get_pid (FridaProcess * self) {
return frida_process_get_pid(self);
}
const gchar * GH_frida_process_get_name (FridaProcess * self) {
return frida_process_get_name(self);
}
GHashTable * GH_frida_process_get_parameters (FridaProcess * self) {
return frida_process_get_parameters(self);
}
FridaApplicationList * GH_frida_device_enumerate_applications_sync (FridaDevice * self, FridaApplicationQueryOptions * options, GCancellable * cancellable, GError ** error) {
return frida_device_enumerate_applications_sync(self, options, cancellable, error);
}
/* ApplicationList */
gint GH_frida_application_list_size (FridaApplicationList * self) {
return frida_application_list_size(self);
}
FridaApplication * GH_frida_application_list_get (FridaApplicationList * self, gint index) {
return frida_application_list_get(self, index);
}
/* Application */
const gchar * GH_frida_application_get_identifier (FridaApplication * self) {
return frida_application_get_identifier(self);
}
const gchar * GH_frida_application_get_name (FridaApplication * self) {
return frida_application_get_name(self);
}
guint GH_frida_application_get_pid (FridaApplication * self) {
return frida_application_get_pid(self);
}
GHashTable * GH_frida_application_get_parameters (FridaApplication * self) {
return frida_application_get_parameters(self);
}
FridaSession * GH_frida_device_attach_sync (FridaDevice * self, guint pid, FridaSessionOptions * options, GCancellable * cancellable, GError ** error) {
return frida_device_attach_sync(self, pid, options, cancellable, error);
}
guint GH_frida_device_spawn_sync (FridaDevice * self, const gchar * program, FridaSpawnOptions * options, GCancellable * cancellable, GError ** error) {
return frida_device_spawn_sync(self, program, options, cancellable, error);
}
/* Session */
guint GH_frida_session_get_pid (FridaSession * self) {
return frida_session_get_pid(self);
}
FridaProcess * GH_frida_device_get_process_by_pid_sync (FridaDevice * self, guint pid, FridaProcessMatchOptions * options, GCancellable * cancellable, GError ** error) {
return frida_device_get_process_by_pid_sync(self, pid, options, cancellable, error);
}
void GH_frida_device_resume_sync (FridaDevice * self, guint pid, GCancellable * cancellable, GError ** error) {
frida_device_resume_sync(self, pid, cancellable, error);
}
void GH_frida_device_kill_sync (FridaDevice * self, guint pid, GCancellable * cancellable, GError ** error) {
frida_device_kill_sync(self, pid, cancellable, error);
}
gboolean GH_frida_session_is_detached (FridaSession * self) {
return frida_session_is_detached(self);
}
void GH_frida_session_detach_sync (FridaSession * self, GCancellable * cancellable, GError ** error) {
frida_session_detach_sync(self, cancellable, error);
}
void GH_frida_session_resume_sync (FridaSession * self, GCancellable * cancellable, GError ** error) {
frida_session_resume_sync(self, cancellable, error);
}
/* ScriptOptions */
FridaScriptOptions * GH_frida_script_options_new (void) {
return frida_script_options_new();
}
void GH_frida_script_options_set_name (FridaScriptOptions * self, const gchar * value) {
frida_script_options_set_name(self, value);
}
void GH_frida_script_options_set_runtime (FridaScriptOptions * self, FridaScriptRuntime value) {
frida_script_options_set_runtime(self, value);
}
FridaScript * GH_frida_session_create_script_sync (FridaSession * self, const gchar * source, FridaScriptOptions * options, GCancellable * cancellable, GError ** error) {
return frida_session_create_script_sync(self, source, options, cancellable, error);
}
/* Object lifetime */
void GH_frida_unref (gpointer obj) {
frida_unref(obj);
}
/* Script */
void GH_frida_script_load_sync (FridaScript * self, GCancellable * cancellable, GError ** error) {
frida_script_load_sync(self, cancellable, error);
}
void GH_frida_script_unload_sync (FridaScript * self, GCancellable * cancellable, GError ** error) {
frida_script_unload_sync(self, cancellable, error);
}
void GH_frida_session_enable_debugger_sync (FridaSession * self, guint16 port, GCancellable * cancellable, GError ** error) {
frida_session_enable_debugger_sync(self, port, cancellable, error);
}
gulong GH_g_signal_connect_data (gpointer instance, const gchar *detailed_signal, GCallback c_handler, gpointer data, GClosureNotify destroy_data, GConnectFlags connect_flags) {
return g_signal_connect_data(instance, detailed_signal, c_handler, data, destroy_data, connect_flags);
}
void GH_g_signal_handler_disconnect (gpointer instance, gulong handler_id) {
g_signal_handler_disconnect(instance, handler_id);
}
void GH_g_signal_emit_by_name (FridaHostSession *session, const gchar *signal_name, const gchar *message) {
g_signal_emit_by_name(session, signal_name, message);
}
guint GH_g_signal_new (const gchar *signal_name, GType itype, GSignalFlags signal_flags, guint class_offset, GSignalAccumulator accumulator, gpointer accu_data, GSignalCMarshaller c_marshaller, GType return_type, guint n_params, ...) {
va_list args;
va_start(args, n_params);
return g_signal_new(signal_name, itype, signal_flags, class_offset, accumulator, accu_data, c_marshaller, return_type, n_params, args);
}
}

View file

@ -318,6 +318,9 @@ public interface FridaClient extends FridaClientReentrant {
}
public static TargetExecutionState convertState(FridaState state) {
if (state == null) {
return TargetExecutionState.STOPPED;
}
switch (state) {
case FRIDA_THREAD_RUNNING:
return TargetExecutionState.RUNNING;

View file

@ -78,14 +78,14 @@ public class FridaEng {
* @return a pointer to the device manager
*/
public static FridaDebugger init() {
FridaNative.INSTANCE.frida_init();
return new FridaDebugger(FridaNative.INSTANCE.frida_device_manager_new());
FridaNative.INSTANCE.GH_frida_init();
return new FridaDebugger(FridaNative.INSTANCE.GH_frida_device_manager_new());
}
public static FridaTarget createTarget(FridaDebugger d) {
Pointer deviceManager = d.getPointer();
FridaError err = new FridaError();
Pointer localDevice = FridaNative.INSTANCE.frida_device_manager_find_device_by_type_sync(deviceManager, new NativeLong(0), new NativeLong(10), null, err.error);
Pointer localDevice = FridaNative.INSTANCE.GH_frida_device_manager_find_device_by_type_sync(deviceManager, new NativeLong(0), new NativeLong(10), null, err.error);
if (localDevice == null) {
Msg.error(d, err);
return null;
@ -96,16 +96,16 @@ public class FridaEng {
public static List<FridaTarget> enumerateDevices(FridaDebugger d) {
Pointer deviceManager = d.getPointer();
FridaError err = new FridaError();
Pointer deviceList = FridaNative.INSTANCE.frida_device_manager_enumerate_devices_sync(deviceManager, null, err.error);
Pointer deviceList = FridaNative.INSTANCE.GH_frida_device_manager_enumerate_devices_sync(deviceManager, null, err.error);
if (deviceList == null) {
Msg.error(d, err);
return null;
}
Integer numDevices = FridaNative.INSTANCE.frida_device_list_size(deviceList);
Integer numDevices = FridaNative.INSTANCE.GH_frida_device_list_size(deviceList);
List<FridaTarget> targetList = new ArrayList<>(numDevices);
for (int i = 0; i != numDevices; i++) {
Pointer device = FridaNative.INSTANCE.frida_device_list_get(deviceList, i);
String name = FridaNative.INSTANCE.frida_device_get_name(device);
Pointer device = FridaNative.INSTANCE.GH_frida_device_list_get(deviceList, i);
String name = FridaNative.INSTANCE.GH_frida_device_get_name(device);
FridaTarget t = new FridaTarget(device);
t.setName(name);
targetList.add(t);
@ -116,17 +116,17 @@ public class FridaEng {
public static List<FridaProcess> enumerateProcesses(FridaTarget t) {
Pointer device = t.getPointer();
FridaError err = new FridaError();
Pointer list = FridaNative.INSTANCE.frida_device_enumerate_processes_sync(device, null, null, err.error);
Pointer list = FridaNative.INSTANCE.GH_frida_device_enumerate_processes_sync(device, null, null, err.error);
if (list == null) {
Msg.error(t, err);
return null;
}
Integer numProcesses = FridaNative.INSTANCE.frida_process_list_size(list);
Integer numProcesses = FridaNative.INSTANCE.GH_frida_process_list_size(list);
List<FridaProcess> processList = new ArrayList<>(numProcesses);
for (int i = 0; i != numProcesses; i++) {
Pointer process = FridaNative.INSTANCE.frida_process_list_get(list, i);
NativeLong pid = FridaNative.INSTANCE.frida_process_get_pid(process);
String name = FridaNative.INSTANCE.frida_process_get_name(process);
Pointer process = FridaNative.INSTANCE.GH_frida_process_list_get(list, i);
NativeLong pid = FridaNative.INSTANCE.GH_frida_process_get_pid(process);
String name = FridaNative.INSTANCE.GH_frida_process_get_name(process);
FridaProcess p = new FridaProcess(process, pid);
p.setName(name);
processList.add(p);
@ -137,18 +137,18 @@ public class FridaEng {
public static List<FridaProcess> enumerateApplications(FridaTarget t) {
Pointer device = t.getPointer();
FridaError err = new FridaError();
Pointer list = FridaNative.INSTANCE.frida_device_enumerate_applications_sync(device, null, null, err.error);
Pointer list = FridaNative.INSTANCE.GH_frida_device_enumerate_applications_sync(device, null, null, err.error);
if (list == null) {
Msg.error(t, err);
return null;
}
Integer numApplications = FridaNative.INSTANCE.frida_process_list_size(list);
Integer numApplications = FridaNative.INSTANCE.GH_frida_process_list_size(list);
List<FridaProcess> processList = new ArrayList<>(numApplications);
for (int i = 0; i != numApplications; i++) {
Pointer application = FridaNative.INSTANCE.frida_application_list_get(list, i);
NativeLong pid = FridaNative.INSTANCE.frida_application_get_pid(application);
String name = FridaNative.INSTANCE.frida_application_get_name(application);
String identifier = FridaNative.INSTANCE.frida_application_get_identifier(application);
Pointer application = FridaNative.INSTANCE.GH_frida_application_list_get(list, i);
NativeLong pid = FridaNative.INSTANCE.GH_frida_application_get_pid(application);
String name = FridaNative.INSTANCE.GH_frida_application_get_name(application);
String identifier = FridaNative.INSTANCE.GH_frida_application_get_identifier(application);
FridaProcess p = new FridaProcess(application, pid);
p.setName(name);
p.setIdentifier(identifier);
@ -160,12 +160,12 @@ public class FridaEng {
public static FridaSession attach(FridaTarget t, NativeLong pid, FridaError err) {
Pointer localDevice = t.getPointer();
FridaNative.GError.ByReference ref = new FridaNative.GError.ByReference();
Pointer session = FridaNative.INSTANCE.frida_device_attach_sync(localDevice, pid, FridaEng.FRIDA_REALM_NATIVE, null, ref);
Pointer session = FridaNative.INSTANCE.GH_frida_device_attach_sync(localDevice, pid, FridaEng.FRIDA_REALM_NATIVE, null, ref);
if (session == null) {
Msg.error(t, ref);
return null;
}
Pointer process = FridaNative.INSTANCE.frida_device_get_process_by_pid_sync(localDevice, pid, null, null, err.error);
Pointer process = FridaNative.INSTANCE.GH_frida_device_get_process_by_pid_sync(localDevice, pid, null, null, err.error);
if (process == null) {
Msg.error(t, err);
return null;
@ -180,7 +180,7 @@ public class FridaEng {
public static FridaSession spawn(FridaTarget t, String fileName, FridaError err) {
Pointer localDevice = t.getPointer();
NativeLong pid = FridaNative.INSTANCE.frida_device_spawn_sync(localDevice, fileName, FridaEng.FRIDA_REALM_NATIVE, null, err.error);
NativeLong pid = FridaNative.INSTANCE.GH_frida_device_spawn_sync(localDevice, fileName, FridaEng.FRIDA_REALM_NATIVE, null, err.error);
if (!err.success()) {
Msg.error(t, err);
return null;
@ -190,7 +190,7 @@ public class FridaEng {
public static void resume(FridaTarget t, NativeLong pid, FridaError err) {
Pointer localDevice = t.getPointer();
FridaNative.INSTANCE.frida_device_resume_sync(localDevice, pid, null, err.error);
FridaNative.INSTANCE.GH_frida_device_resume_sync(localDevice, pid, null, err.error);
if (!err.success()) {
Msg.error(t, err);
}
@ -198,7 +198,7 @@ public class FridaEng {
public static void kill(FridaTarget t, NativeLong pid, FridaError err) {
Pointer localDevice = t.getPointer();
FridaNative.INSTANCE.frida_device_kill_sync(localDevice, pid, null, err.error);
FridaNative.INSTANCE.GH_frida_device_kill_sync(localDevice, pid, null, err.error);
if (!err.success()) {
Msg.error(t, err);
}
@ -206,7 +206,7 @@ public class FridaEng {
public static void detach(FridaSession s, FridaError err) {
Pointer session = s.getPointer();
FridaNative.INSTANCE.frida_session_detach_sync(session, null, err.error);
FridaNative.INSTANCE.GH_frida_session_detach_sync(session, null, err.error);
if (!err.success()) {
Msg.error(s, err);
}
@ -214,7 +214,7 @@ public class FridaEng {
public static void resume(FridaSession s, FridaError err) {
Pointer session = s.getPointer();
FridaNative.INSTANCE.frida_session_resume_sync(session, null, err.error);
FridaNative.INSTANCE.GH_frida_session_resume_sync(session, null, err.error);
if (!err.success()) {
Msg.error(s, err);
}
@ -223,33 +223,18 @@ public class FridaEng {
public static NativeLong connectSignal(FridaScript s, String signal, FridaNative.MessageCallback cb, Pointer userData) {
Pointer script = s.getPointer();
try {
return FridaNative.INSTANCE._frida_g_signal_connect_data(script, signal, cb, userData, null, new NativeLong(0));
} catch (UnsatisfiedLinkError e) {
/* IGNORE */
}
try {
return FridaNative.INSTANCE.g_signal_connect_data(script, signal, cb, userData, null, new NativeLong(0));
} catch (UnsatisfiedLinkError e) { /* IGNORE */ }
return new NativeLong(-1);
return FridaNative.INSTANCE.GH_g_signal_connect_data(script, signal, cb, userData, null, new NativeLong(0));
}
public static void disconnectSignal(FridaScript s, NativeLong signal) {
Pointer script = s.getPointer();
try {
FridaNative.INSTANCE._frida_g_signal_handler_disconnect(script, signal);
return;
} catch (UnsatisfiedLinkError e) { /* IGNORE */ }
try {
FridaNative.INSTANCE.g_signal_handler_disconnect(script, signal);
return;
} catch (UnsatisfiedLinkError e) { /* IGNORE */ }
FridaNative.INSTANCE.GH_g_signal_handler_disconnect(script, signal);
}
public static NativeLong createSignal(String signal) {
return FridaNative.INSTANCE.g_signal_new(
return FridaNative.INSTANCE.GH_g_signal_new(
signal,
FridaNative.INSTANCE.frida_bus_session_get_type(), // type_from_class
FridaNative.INSTANCE.GH_frida_bus_session_get_type(), // type_from_class
new NativeLong(2), // G_SIGNAL_RUN_LAST
new NativeLong(0), // class_ofset
null, // accumulator
@ -263,11 +248,11 @@ public class FridaEng {
public static void emitSignal(FridaSession s, String signal) {
Pointer script = s.getPointer();
FridaNative.INSTANCE.g_signal_emit_by_name(script, signal);
FridaNative.INSTANCE.GH_g_signal_emit_by_name(script, signal);
}
public static NativeLong getBusType() {
return FridaNative.INSTANCE.frida_bus_session_get_type();
return FridaNative.INSTANCE.GH_frida_bus_session_get_type();
}
@ -279,7 +264,7 @@ public class FridaEng {
}
Pointer session = s.getPointer();
FridaError err = new FridaError();
Pointer script = FridaNative.INSTANCE.frida_session_create_script_sync(session, commands, options, null, err.error);
Pointer script = FridaNative.INSTANCE.GH_frida_session_create_script_sync(session, commands, options, null, err.error);
if (script == null) {
Msg.error(s, "Unable to create script: " + commands);
return null;
@ -289,14 +274,14 @@ public class FridaEng {
public static void unref(FridaScript s) {
Pointer script = s.getPointer();
FridaNative.INSTANCE.frida_unref(script);
FridaNative.INSTANCE.GH_frida_unref(script);
}
public static void loadScript(FridaScript s) {
Pointer script = s.getPointer();
FridaError err = new FridaError();
FridaNative.INSTANCE.frida_script_load_sync(script, null, err.error);
FridaNative.INSTANCE.GH_frida_script_load_sync(script, null, err.error);
if (!err.success()) {
Msg.error(s, err);
}
@ -305,23 +290,23 @@ public class FridaEng {
public static void unloadScript(FridaScript s) {
Pointer script = s.getPointer();
FridaError err = new FridaError();
FridaNative.INSTANCE.frida_script_unload_sync(script, null, err.error);
FridaNative.INSTANCE.GH_frida_script_unload_sync(script, null, err.error);
if (!err.success()) {
Msg.error(s, err);
}
}
public static Pointer createOptions(String name) {
Pointer options = FridaNative.INSTANCE.frida_script_options_new();
FridaNative.INSTANCE.frida_script_options_set_name(options, name);
FridaNative.INSTANCE.frida_script_options_set_runtime(options, new NativeLong(0L));
Pointer options = FridaNative.INSTANCE.GH_frida_script_options_new();
FridaNative.INSTANCE.GH_frida_script_options_set_name(options, name);
FridaNative.INSTANCE.GH_frida_script_options_set_runtime(options, new NativeLong(0L));
return options;
}
public static void enableDebugger(FridaSession s, NativeLong port) {
Pointer session = s.getPointer();
FridaError err = new FridaError();
FridaNative.INSTANCE.frida_session_enable_debugger_sync(session, port, null, err.error);
FridaNative.INSTANCE.GH_frida_session_enable_debugger_sync(session, port, null, err.error);
if (!err.success()) {
Msg.error(s, err);
}

View file

@ -221,64 +221,64 @@ public interface FridaNative extends LibC {
void invoke(Pointer script, String message, Pointer data, Pointer userData);
}
void frida_init();
void GH_frida_init();
Pointer frida_device_manager_new();
void frida_device_manager_close_sync(Pointer manager, Pointer cancellable, GError.ByReference error);
Pointer GH_frida_device_manager_new();
void GH_frida_device_manager_close_sync(Pointer manager, Pointer cancellable, GError.ByReference error);
Pointer frida_device_manager_find_device_by_type_sync(Pointer manager, NativeLong type, NativeLong timeout, Pointer cancellable, GError.ByReference error);
Pointer frida_device_manager_enumerate_devices_sync(Pointer manager, Pointer cancellable, GError.ByReference error);
Integer frida_device_list_size(Pointer deviceList);
Pointer frida_device_list_get(Pointer deviceList, int i);
String frida_device_get_name(Pointer device);
Pointer GH_frida_device_manager_find_device_by_type_sync(Pointer manager, NativeLong type, NativeLong timeout, Pointer cancellable, GError.ByReference error);
Pointer GH_frida_device_manager_enumerate_devices_sync(Pointer manager, Pointer cancellable, GError.ByReference error);
Integer GH_frida_device_list_size(Pointer deviceList);
Pointer GH_frida_device_list_get(Pointer deviceList, int i);
String GH_frida_device_get_name(Pointer device);
Pointer frida_device_enumerate_processes_sync(Pointer device, NativeLong options, Pointer cancellable, GError.ByReference error);
Integer frida_process_list_size(Pointer processList);
Pointer frida_process_list_get(Pointer processList, int i);
NativeLong frida_process_get_pid(Pointer process);
String frida_process_get_name(Pointer process);
Pointer frida_process_get_parameters(Pointer process);
Pointer GH_frida_device_enumerate_processes_sync(Pointer device, NativeLong options, Pointer cancellable, GError.ByReference error);
Integer GH_frida_process_list_size(Pointer processList);
Pointer GH_frida_process_list_get(Pointer processList, int i);
NativeLong GH_frida_process_get_pid(Pointer process);
String GH_frida_process_get_name(Pointer process);
Pointer GH_frida_process_get_parameters(Pointer process);
Pointer frida_device_enumerate_applications_sync(Pointer device, NativeLong options, Pointer cancellable, GError.ByReference error);
Integer frida_application_list_size(Pointer processList);
Pointer frida_application_list_get(Pointer processList, int i);
NativeLong frida_application_get_pid(Pointer process);
String frida_application_get_name(Pointer process);
String frida_application_get_identifier(Pointer process);
Pointer frida_application_get_parameters(Pointer process);
Pointer GH_frida_device_enumerate_applications_sync(Pointer device, NativeLong options, Pointer cancellable, GError.ByReference error);
Integer GH_frida_application_list_size(Pointer processList);
Pointer GH_frida_application_list_get(Pointer processList, int i);
NativeLong GH_frida_application_get_pid(Pointer process);
String GH_frida_application_get_name(Pointer process);
String GH_frida_application_get_identifier(Pointer process);
Pointer GH_frida_application_get_parameters(Pointer process);
Pointer frida_device_attach_sync(Pointer localDevice, NativeLong pid, NativeLong options, Pointer cancellable, GError.ByReference error);
NativeLong frida_device_spawn_sync(Pointer localDevice, String fileName, NativeLong options, Pointer cancellable, GError.ByReference error);
NativeLong frida_session_get_pid(Pointer session);
Pointer frida_device_get_process_by_pid_sync(Pointer localDevice, NativeLong pid, Pointer options, Pointer cancellable, GError.ByReference error);
Pointer frida_device_resume_sync(Pointer localDevice, NativeLong pid, Pointer cancellable, GError.ByReference error);
Pointer frida_device_kill_sync(Pointer localDevice, NativeLong pid, Pointer cancellable, GError.ByReference error);
Pointer GH_frida_device_attach_sync(Pointer localDevice, NativeLong pid, NativeLong options, Pointer cancellable, GError.ByReference error);
NativeLong GH_frida_device_spawn_sync(Pointer localDevice, String fileName, NativeLong options, Pointer cancellable, GError.ByReference error);
NativeLong GH_frida_session_get_pid(Pointer session);
Pointer GH_frida_device_get_process_by_pid_sync(Pointer localDevice, NativeLong pid, Pointer options, Pointer cancellable, GError.ByReference error);
Pointer GH_frida_device_resume_sync(Pointer localDevice, NativeLong pid, Pointer cancellable, GError.ByReference error);
Pointer GH_frida_device_kill_sync(Pointer localDevice, NativeLong pid, Pointer cancellable, GError.ByReference error);
boolean frida_session_is_detached(Pointer session);
void frida_session_detach_sync(Pointer session, Pointer cancellable, GError.ByReference error);
void frida_session_resume_sync(Pointer session, Pointer cancellable, GError.ByReference error);
boolean GH_frida_session_is_detached(Pointer session);
void GH_frida_session_detach_sync(Pointer session, Pointer cancellable, GError.ByReference error);
void GH_frida_session_resume_sync(Pointer session, Pointer cancellable, GError.ByReference error);
Pointer frida_script_options_new();
void frida_script_options_set_name(Pointer options, String name);
void frida_script_options_set_runtime (Pointer options, NativeLong runtime);
Pointer frida_session_create_script_sync(Pointer session, String commands, Pointer options, Pointer cancellable, GError.ByReference error);
void frida_unref(Pointer script);
void frida_script_load_sync(Pointer script, Pointer cancellable, GError.ByReference error);
void frida_script_unload_sync(Pointer script, Pointer cancellable, GError.ByReference error);
Pointer GH_frida_script_options_new();
void GH_frida_script_options_set_name(Pointer options, String name);
void GH_frida_script_options_set_runtime (Pointer options, NativeLong runtime);
Pointer GH_frida_session_create_script_sync(Pointer session, String commands, Pointer options, Pointer cancellable, GError.ByReference error);
void GH_frida_unref(Pointer script);
void GH_frida_script_load_sync(Pointer script, Pointer cancellable, GError.ByReference error);
void GH_frida_script_unload_sync(Pointer script, Pointer cancellable, GError.ByReference error);
void frida_session_enable_debugger_sync(Pointer session, NativeLong port, Pointer cancellable, GError.ByReference error);
NativeLong frida_bus_session_get_type();
void GH_frida_session_enable_debugger_sync(Pointer session, NativeLong port, Pointer cancellable, GError.ByReference error);
NativeLong GH_frida_bus_session_get_type();
// These are equivalent but version-dependent
NativeLong _frida_g_signal_connect_data(Pointer script, String signal, MessageCallback closure, Pointer data, Pointer notify, NativeLong after);
NativeLong g_signal_connect_data(Pointer script, String signal, MessageCallback closure, Pointer data, Pointer notify, NativeLong after);
NativeLong GH__frida_g_signal_connect_data(Pointer script, String signal, MessageCallback closure, Pointer data, Pointer notify, NativeLong after);
NativeLong GH_g_signal_connect_data(Pointer script, String signal, MessageCallback closure, Pointer data, Pointer notify, NativeLong after);
// These are equivalent but version-dependent
void _frida_g_signal_handler_disconnect(Pointer script, NativeLong signalHandle);
void g_signal_handler_disconnect(Pointer script, NativeLong signalHandle);
void GH__frida_g_signal_handler_disconnect(Pointer script, NativeLong signalHandle);
void GH_g_signal_handler_disconnect(Pointer script, NativeLong signalHandle);
void g_signal_emit_by_name(Pointer instance, String detailed_signal);
NativeLong g_signal_new(String signal_name, NativeLong itype, NativeLong signal_flags,
void GH_g_signal_emit_by_name(Pointer instance, String detailed_signal);
NativeLong GH_g_signal_new(String signal_name, NativeLong itype, NativeLong signal_flags,
NativeLong class_offset, Pointer accumulator, Pointer accu_data,
Pointer c_marshaller, NativeLong return_type, NativeLong n_params, NativeLong ptype);

View file

@ -60,7 +60,7 @@ public class FridaModelTargetRegisterImpl
}
public String getDescription(int level) {
return getValue();
return getName() + " : " + getValue();
}
@Override

View file

@ -15,43 +15,25 @@
*/
package agent.frida.model;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
import static org.junit.Assert.*;
import static org.junit.Assume.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.Map.Entry;
import java.util.NavigableMap;
import java.util.TreeMap;
import org.junit.Ignore;
import org.junit.Test;
import agent.frida.manager.FridaEventsListenerAdapter;
import agent.frida.model.iface2.FridaModelTargetProcess;
import agent.frida.model.iface2.FridaModelTargetSymbol;
import agent.frida.model.impl.FridaModelTargetMemoryContainerImpl;
import agent.frida.model.impl.FridaModelTargetThreadContainerImpl;
import agent.frida.model.impl.FridaModelTargetThreadImpl;
import agent.frida.model.methods.FridaModelTargetFunctionInterceptorImpl;
import agent.frida.model.methods.FridaModelTargetMemoryScanImpl;
import agent.frida.model.methods.FridaModelTargetMemoryWatchImpl;
import agent.frida.model.methods.FridaModelTargetThreadStalkImpl;
import agent.frida.model.impl.*;
import agent.frida.model.methods.*;
import generic.jar.ResourceFile;
import ghidra.dbg.DebugModelConventions;
import ghidra.dbg.DebugModelConventions.AsyncState;
import ghidra.dbg.target.TargetExecutionStateful;
import ghidra.dbg.target.*;
import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState;
import ghidra.dbg.target.TargetKillable;
import ghidra.dbg.target.TargetLauncher;
import ghidra.dbg.target.TargetModule;
import ghidra.dbg.target.TargetModuleContainer;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.TargetProcess;
import ghidra.dbg.target.TargetResumable;
import ghidra.dbg.target.TargetSymbol;
import ghidra.dbg.target.TargetSymbolNamespace;
import ghidra.dbg.test.AbstractDebuggerModelTest;
import ghidra.dbg.test.RequiresLaunchSpecimen;
import ghidra.dbg.util.PathUtils;
@ -167,6 +149,7 @@ public abstract class AbstractModelForFridaMethodsTest extends AbstractDebuggerM
runTestKill(specimen);
}
@Ignore
@Test
public void testWatch() throws Throwable {
assumeTrue(m.hasKillableProcesses());
@ -187,8 +170,8 @@ public abstract class AbstractModelForFridaMethodsTest extends AbstractDebuggerM
Address address = symbolsByKey.get("overwrite").getValue();
map.put("Address", address.toString());
map.put("Size", 1L);
ResourceFile installationDirectory = Application.getInstallationDirectory();
map.put("OnAccess", installationDirectory + "/ghidra/Ghidra/Debug/Debugger-agent-frida/data/scripts/onAccess.js");
ResourceFile script = Application.getModuleDataFile("/scripts/onAccess.js");
map.put("OnAccess", script.getAbsolutePath());
watch.invoke(map);
runTestResume(specimen);
@ -217,8 +200,8 @@ public abstract class AbstractModelForFridaMethodsTest extends AbstractDebuggerM
FridaModelTargetSymbol symbol = (FridaModelTargetSymbol) symbolsByKey.get("break_here");
FridaModelTargetFunctionInterceptorImpl intercept =
(FridaModelTargetFunctionInterceptorImpl) symbol.getCachedAttribute("intercept");
ResourceFile installationDirectory = Application.getInstallationDirectory();
map.put("OnEnter", installationDirectory + "/ghidra/Ghidra/Debug/Debugger-agent-frida/data/scripts/onEnter.js");
ResourceFile script = Application.getModuleDataFile("/scripts/onEnter.js");
map.put("OnEnter", script.getAbsolutePath());
map.put("OnLeave", "");
intercept.invoke(map);
runTestResume(specimen);
@ -240,17 +223,18 @@ public abstract class AbstractModelForFridaMethodsTest extends AbstractDebuggerM
TargetProcess process = runTestLaunch(specimen, launcher);
FridaModelTargetProcess fproc = (FridaModelTargetProcess) process;
waitOn(fproc.resume());
ConsoleEventListener listener = new ConsoleEventListener(":1");
fproc.getManager().addEventsListener(listener);
FridaModelTargetThreadContainerImpl threads = (FridaModelTargetThreadContainerImpl) fproc.getCachedAttribute("Threads");
Map<String, TargetObject> elements = threads.getCachedElements();
Map<String, TargetObject> elements = (Map<String, TargetObject>) waitOn(threads.fetchElements());
FridaModelTargetThreadImpl thread = (FridaModelTargetThreadImpl) elements.values().iterator().next();
Map<String, Object> map = new HashMap<>();
FridaModelTargetThreadStalkImpl stalk =
(FridaModelTargetThreadStalkImpl) thread.getCachedAttribute("stalk");
ResourceFile installationDirectory = Application.getInstallationDirectory();
map.put("OnCallSummary", installationDirectory + "/ghidra/Ghidra/Debug/Debugger-agent-frida/data/scripts/onCallSummary.js");
ResourceFile script = Application.getModuleDataFile("/scripts/onCallSummary.js");
map.put("OnCallSummary", script.getAbsolutePath());
map.put("EventCall", true);
map.put("EventRet", false);
map.put("EventExec", false);
@ -258,8 +242,7 @@ public abstract class AbstractModelForFridaMethodsTest extends AbstractDebuggerM
map.put("EventCompile", false);
map.put("OnReceive", "");
stalk.invoke(map);
runTestResume(specimen);
Thread.sleep(1000);
//runTestResume(specimen);
waitForCondition(() -> {
return listener.foundMatch();

View file

@ -88,6 +88,11 @@ public abstract class AbstractModelForFridaRootAttacherTest
public void testAttachByPidThenResumeInterrupt() throws Throwable {
}
@Ignore
@Test
public void testAttachByPidThenKill() throws Throwable {
}
@Override
protected void runTestKill(DebuggerTestSpecimen specimen)
throws Throwable {

View file

@ -21,6 +21,13 @@ import static org.junit.Assert.assertTrue;
import java.util.List;
import java.util.Map.Entry;
import org.junit.Ignore;
import org.junit.Test;
import agent.frida.model.iface2.FridaModelTargetProcess;
import agent.frida.model.impl.FridaModelTargetThreadContainerImpl;
import java.util.NavigableMap;
import java.util.TreeMap;
@ -51,9 +58,12 @@ public abstract class AbstractModelForFridaScenarioStackTest
@Override
protected FridaLinuxSpecimen getSpecimen() {
return FridaLinuxSpecimen.STACK;
return FridaLinuxSpecimen.SPIN_STRIPPED;
}
@Override
//@Ignore // Fails for distributed version
@Test
public void testScenario() throws Throwable {
DebuggerTestSpecimen specimen = getSpecimen();
m.build();
@ -71,6 +81,11 @@ public abstract class AbstractModelForFridaScenarioStackTest
assertTrue(state.get().isAlive());
FridaModelTargetProcess fproc = (FridaModelTargetProcess) process;
waitOn(fproc.resume());
FridaModelTargetThreadContainerImpl threads = (FridaModelTargetThreadContainerImpl) fproc.getCachedAttribute("Threads");
waitOn(threads.fetchElements());
TargetStack stack = findStack(process.getPath());
PathMatcher matcher = stack.getSchema().searchFor(TargetStackFrame.class, true);
PathPattern pattern = matcher.getSingletonPattern();

View file

@ -29,10 +29,11 @@ import java.util.Map.Entry;
import org.junit.Ignore;
import org.junit.Test;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.TargetRegister;
import ghidra.dbg.target.TargetRegisterBank;
import ghidra.dbg.target.TargetRegisterContainer;
import agent.frida.model.iface2.FridaModelTargetProcess;
import agent.frida.model.iface2.FridaModelTargetThreadContainer;
import agent.frida.model.impl.FridaModelTargetThreadContainerImpl;
import ghidra.dbg.agent.DefaultTargetModelRoot;
import ghidra.dbg.target.*;
import ghidra.dbg.test.AbstractDebuggerModelRegistersTest;
import ghidra.dbg.test.AbstractDebuggerModelTest;
import ghidra.dbg.test.ProvidesTargetViaLaunchSpecimen;
@ -67,9 +68,20 @@ public abstract class AbstractModelForFridaX64RegistersTest
@Override
public DebuggerTestSpecimen getLaunchSpecimen() {
return FridaLinuxSpecimen.PRINT;
return FridaLinuxSpecimen.SPIN_STRIPPED;
}
@Override
protected TargetObject maybeSubstituteThread(TargetObject target) throws Throwable {
FridaModelTargetProcess fproc = (FridaModelTargetProcess) target;
waitOn(fproc.resume());
FridaModelTargetThreadContainerImpl threads = (FridaModelTargetThreadContainerImpl) fproc.getCachedAttribute("Threads");
waitOn(threads.fetchElements());
TargetThread thread = findAnyThread(target.getPath());
return thread == null ? target : thread;
}
@Override
@Test
public void testRegistersHaveExpectedSizes() throws Throwable {
@ -166,4 +178,5 @@ public abstract class AbstractModelForFridaX64RegistersTest
assertEquals("Not all registers were read, or extras were read", write.keySet(),
read.keySet());
}
}

View file

@ -110,7 +110,7 @@ public enum FridaLinuxSpecimen implements DebuggerTestSpecimen, DebuggerModelTes
String expected = getCommandLine();
TargetObject session = process.getParent().getParent();
Collection<TargetModule> modules =
test.m.findAll(TargetModule.class, session.getPath(), true).values();
test.m.findAll(TargetModule.class, session.getPath(), false).values();
return modules.stream()
.anyMatch(m -> expected.contains(m.getShortDisplay()));
}