Frida integration plugin for Rizin and Cutter.
The Rizin plugin provides the backend and command interface. The Cutter plugin provides a native frontend over the Rizin backend.
The plugin provides:
- Rizin core plugin build support
- Cutter native plugin build support
frida://URI validation- session ownership, timeout, and cancellation primitives
- structured status and error replies
- structured device, process, and application enumeration across local, USB, and remote devices when
frida-coreis enabled - session control across local, USB, and remote devices when
frida-coreis enabled - script execution inside the target through an injected agent when
frida-coreis enabled - target memory r/w through the agent when
frida-coreis enabled - target memory range and thread listing through the agent when
frida-coreis enabled - target module, export, import, and sym listing through the agent when
frida-coreis enabled - native breakpoints with thread-targeted continue, stop identity, and register r/w at a stop through the agent when
frida-coreis enabled - hardware watchpoints on every thread, reporting the access with its register context, through the agent when
frida-coreis enabled
- Rizin with its development headers, either built from source or installed
(the plugin's meson build needs
rz_corevia pkg-config, or-Drizin_build_dirpointing at a rizin source build) - Cutter for the Cutter plugin, either built from source or an extracted AppImage (see the Cutter plugin build section)
- Qt 5.15+ or Qt 6 with the Widgets and Concurrent modules for the Cutter plugin
- frida-core devkit (headers plus the static library) to build with Frida
support. Without it the plugin builds with a self-contained backend that
answers every device and session command with a
frida_unavailableerror - Node.js and npm only for agent development, to rebuild the injected
agent bundle with
frida-compileand to bundlefrida-java-bridgeinto it at build time (the bundle is committed, so a plain build does not need node) - a target to instrument, typically an Android device running
frida-server(rooted or with an embedded frida-gadget) or a remote frida-server on the host
First, find the target process using Frida:
frida-ps # local host processes
frida-ps -U # processes on a USB device
frida-ps -H 127.0.0.1:27042 # processes on a remote frida-server
Then open a rizin session and use the plugin commands:
rizin malloc://512 # open rizin with a small binary
Froj attach/local//<pid> # attach to the local target
FrRj # dump memory ranges
Frtj # list threads
Frej Process.arch # evaluate JS in the target
Frcj # close the session
The Fr command group is available inside rizin after the plugin loads. The
attach/local transport targets the host, attach/usb a USB device, and
attach/remote a remote frida-server (see Targets and transports below).
Extract a Cutter AppImage, build the plugin against it, and run Cutter:
./Cutter-v2.5.0-Linux-x86_64.AppImage --appimage-extract # extract the AppImage
cmake -S plugin/cutter -B build-cutter -DCMAKE_PREFIX_PATH=./squashfs-root/usr # configure
cmake --build build-cutter # build the plugin
cmake --install build-cutter # install the .so
./squashfs-root/usr/bin/cutter # run Cutter
The Frida dock appears at the top of the window. Enter the target pid in the Session tab and click Connect.
The plugin has two halves that share one session model.
The Rizin plugin opens a session on a target device (Froj) and talks
to it over a request/response channel. Local attach injects the JS agent on
first agent command, USB/remote spawn injects during Froj. The …j
commands use a JSON envelope (ok, result or error). Frs and
Fru also print plain text. Open respects the session timeout and can be
cancelled.
The Cutter plugin is a dock widget frontend. It calls the rizin plugin's
C API directly through FridaApiBridge, and runs the blocking calls on a
background worker through FridaTaskRunner, so the UI ideally shouldn't freeze.
All agent replies are parsed through the same envelope validation.
meson setup build # configure
ninja -C build # compile
meson test -C build # run tests
When building against a rizin source tree instead of an installed one, point the build at its generated headers and at the bundled sdb headers:
meson setup build \
-Drizin_build_dir=/path/to/rizin/build \
-Drizin_sdb_include_dir=/path/to/rizin/librz/util/sdb/src # sdb headers in the source tree
ninja -C build # compile
The Frida library and compiler toolchain must be ABI-compatible. Configuration fails
early when frida-core is found but cannot be linked by the active compiler.
meson setup build \
-Dfrida_core=enabled \
-Dfrida_include_dir=/path/to/frida-core-devkit \
-Dfrida_library=/path/to/frida-core-library # frida-core static library
ninja -C build # compile
meson test -C build # run tests
When the manual paths are omitted, meson tries pkg-config frida-core-1.0
first. Fetch runs only if that is missing and -Dfrida_core=enabled. The
fetched version is frida_version in meson_options.txt (default
17.17.0). The build verifies the archive against the sha256 published by
the frida release. The cache is $XDG_CACHE_HOME/rz-frida or ~/.cache/rz-frida
on Linux, ~/Library/Caches/rz-frida on macOS, and
%LOCALAPPDATA%\rz-frida on Windows. Hosts that frida publishes no
devkit for (the BSDs, riscv64, s390x, ppc64le, ...) build the plugin
without frida support and print a config warn.
rz-pm install rz-frida and the build it runs are experimental.
rz-pm install rz-frida
rizin dev files (pkg-config or cmake) and meson must be present, and on Windows the command must run inside a Visual Studio developer prompt.
All commands are subcommands of the Fr group, run Fr? in Rizin for the
built-in help with summary of each. The list below is a quick reference,
and the sections that follow explain them.
Frs # plugin/session status, plain text
Frsj # plugin/session status, JSON
Fru frida://attach/local//1234 # validate attach URI
Fruj frida://attach/local//1234 # validate attach URI, JSON
Frdj # list connected Frida devices
Frpj # list local processes
Frpj frida://list/usb/device-1/ # list processes on a USB device
Fraj # list local applications
Fraj frida://apps/usb/device-1/ # list applications on a USB device
Froj frida://attach/local//1234 # attach to a local pid
Froj frida://spawn/local///bin/ls # spawn a local process suspended
Froj frida://attach/usb//com.example.app # attach to a USB target by name
Froj frida://spawn/usb//com.example.app # spawn a USB package (resumed, rn true when the hook armed)
Froj frida://attach/remote/127.0.0.1:27042/1234 # attach over a remote frida-server
Frrj # resume a spawned target
Frcj # close the open session
Frij # ping the agent
Frej Process.arch # evaluate JS in the target
Frlj hook.js # load and evaluate a script file
Frmj # drain agent message buffer
Frxj 0x1000 64 # read 64 bytes of target memory
Frwj 0x1000 deadbeef # write bytes to target memory
FrRj # list target memory ranges
Frtj # list target threads
FrMj # list loaded modules
FrEj libc.so # list module exports
FrIj libc.so # list module imports
FrSj libc.so # list module symbols
Frbj 0x1000 # set a breakpoint
Frbj # list breakpoints
Frb-j 0x1000 # remove a breakpoint
Frb-j * # remove all breakpoints
Frgj # continue last parked thread
Frgj 4242 # continue a specific thread
FrBj 4242 # stop identity of a parked thread
FrBj 4242 pc 0x401000 # write a register of a parked thread
FrWj 0x1000 8 w # set a hardware watchpoint (write, 8 bytes)
FrWj # list watchpoints
FrW-j 0x1000 # remove a watchpoint
FrW-j * # remove all watchpoints
FrJj # check Java VM availability
FrLj # list classloaders
FrCj # list loaded classes
FrCj re.frida.minapp # list loaded classes by prefix
FrXj # compare runtime vs static classes
FrXj re.frida.minapp # compare by prefix
FrNj # list newly loaded classes since start
FrNj start # snapshot currently loaded classes
FrNj stop # disarm class load monitor
FrRNj # list RegisterNatives hook captures
FrRNj on # arm RegisterNatives hook
FrRNj off # disarm RegisterNatives hook
FrRNj import # import captured natives into analysis
Frfj # import runtime modules as rizin flags
Frdj, Frpj, Fraj, and Froj return a structured frida_unavailable
error when the plugin is built without frida-core. Frpj and Fraj list the
local device by default, or take a frida:// URI to select a USB or remote device.
Froj opens a session on the device named by the URI (attach, spawn, or
launch on local, USB, or remote). USB/remote spawn resumes before Froj
returns (rn true when RegisterNatives armed, else rn false). A local
spawn stays suspended until Frrj. Frrj resumes a still-suspended
spawn (safe if the target is already running), and Frcj closes the
session. Closing kills a target that was spawned but never resumed and
leaves an attached or launched target running. Open respects the session
timeout and can be cancelled.
The device field of a frida:// URI selects where the session runs. An empty device
on the local transport uses the host system. On the usb transport a device id picks
that device, and an empty device id picks the single connected device. On the remote
transport the device is the host:port of a frida-server.
attach accepts a numeric pid or a process name. A name is matched against the running
processes and resolved to a pid, and an unknown name returns an invalid_target error.
spawn and launch accept an executable path on local and remote targets or a package
identifier on USB targets. Local spawn stays suspended for Frrj. USB/remote
spawn resumes before Froj returns (rn true when the hook armed). launch
resumes immediately.
Start frida-server on the device, then enumerate and open over USB:
Frdj # list USB devices
Fraj frida://apps/usb// # list apps on the USB device
Frpj frida://list/usb// # list processes on the USB device
Froj frida://spawn/usb//com.example.app # spawn USB/remote (resumed, rn true when the hook armed)
Frrj # resume if still suspended (safe if already running)
Frcj # close the session
A device that is not reachable, because frida-server is not running or the cable is
unplugged, surfaces as a timeout or internal_error carrying the message from
frida-core. An unknown package or process name surfaces as an invalid_target error.
The example package re.frida.minapp is a small test application at
https://t.me/rzfrida/25. A gadget-embedded APK of the same app, for
non-rooted devices, is at https://t.me/rzfrida/27.
Start frida-server -l 0.0.0.0:27042 on the host, then dial it from the listing or
session commands:
Frpj frida://list/remote/127.0.0.1:27042/ # list processes on the remote host
Froj frida://attach/remote/127.0.0.1:27042/1234 # attach to pid 1234 remotely
The remote transport connects to a plain frida-server. TLS and token authenticated portals are not wired up.
Once a session is open, the plugin talks to the target over a request/response
channel. Local attach injects the agent on the first agent command, USB/remote
spawn already injected during Froj. Script commands do not need a separate
load step.
Frij # ping the agent, get platform/arch/ptrsize
Frej Process.arch # evaluate JS in the target, return value and type
Frlj /path/to/hook.js # load and eval a script file from disk
Frmj # drain the agent message buffer, return JSON array
Frij pings the agent and returns its ver and the target platform, arch, and
ptr size, a quick check that the host-agent channel is alive. Frej evals a
JS expression inside the target and returns its val and type. Frlj reads a
script from a file and evals it same way, for instrumentation too large for the
cmd line. Each request respects the session timeout and can be interrupted with Ctrl-C.
Not every msg from the agent is a reply. Console o/p, uncaught script errors, and
unsolicited send() notifs are buffered per session in a bounded queue that drops the
oldest entry when full and counts how many it dropped. Frmj drains that buffer as a JSON
array and clears it. Binary data attached to a send() is carried through as base64 with its
byte length.
Frxj reads a block of target memory and returns the bytes as a hex string. Frwj
writes a hex byte string into target memory and returns the number of bytes written. Both
load the agent on first use, take an addr that rizin evals (so expressions and symbols
work), and are bounded by the frida.mem.max config.
Frxj 0x1000 64 # read 64 bytes at 0x1000
Frwj 0x1000 deadbeef # write 4 bytes (de ad be ef) at 0x1000
The first reads 64 bytes at 0x1000, the second writes the four bytes de ad be ef at
0x1000. The agent validates the address against the mapped ranges first, so a r/w
of unmapped mem comes back as an internal_error, and both cmds report invalid_target
when no session is open.
FrRj lists the target memory ranges, each with its base, size, protection, and backing
file when mapped. Frtj lists target threads, each with its id, state, register
context, and entrypoint. FrMj lists loaded modules with their name, base, size, and
path. FrEj <module>, FrIj <module>, and FrSj <module> list a module's exports,
imports, and symbols. All load the agent on first use.
FrRj # list memory ranges
Frtj # list threads
FrMj # list loaded modules
FrEj libc.so # list exports of a module
FrIj libc.so # list imports of a module
FrSj libc.so # list symbols of a module
The agent caches the range and module lists and re-enumerates after code runs in the target
(Frej or Frlj), so listing stays current w/o re-scanning on every call. The reply's
cached flag says whether it came from the cache, and passing any arg to FrRj or
FrMj forces a fresh enumeration.
Once a session is open, the plugin sets native breakpoints in the target through the agent and parks the thread that hits one until you continue it.
Frbj 0x1000 # set a breakpoint at 0x1000
Frbj # list breakpoints
Frb-j 0x1000 # remove breakpoint at 0x1000
Frb-j * # remove all breakpoints
Frgj # continue most recently parked thread
Frgj 4242 # continue thread 4242
FrBj 4242 # stop identity of parked thread 4242
FrBj 4242 pc 0x401000 # write pc register of parked thread 4242
FrWj 0x1000 8 w # set write watchpoint on 8 bytes at 0x1000
FrWj # list watchpoints
FrW-j 0x1000 # remove watchpoint at 0x1000
FrW-j * # remove all watchpoints
Frbj <addr> sets a breakpoint, Frbj with no arg lists the ones that are set, and
Frb-j removes one addr or * for all. A breakpoint is an Interceptor.attach, so it
fires on whichever thread reaches the addr and there is no plugin-side slot cap.
The plugin does not patch the target, Frida may rewrite the prologue.
A hit isn't a reply, it arrives asynchronously and Frmj drains it as a frida.bp
msg carrying the breakpoint id (under bp) and the thread id. The event context
is empty. The thread that hit stays parked until you continue it. Frgj <tid> continues
that exact thread, Frgj with no arg continues the most recently parked one, and it
reports whether a thread was released. Other agent cmds keep working while a thread is parked,
so you can read mem or list threads at the stop, and one continue releases one parked thread.
FrBj <tid> reports the stop identity (threadId, bp, address) of the
parked thread. It does not return register values. FrBj <tid> <reg> <value> sets one register. A write goes on the live context and takes effect when the
thread is continued, so set pc, an arg reg, or a return value at the stop and
then Frgj to resume with it.
FrWj <addr> [size] [r|w|rw] sets a hardware watchpoint, FrWj with no arg lists the
ones that are set, and FrW-j removes one addr or * for all. The watchpoint is there on
every target thread (the hardware debug registers are per-thread, so covering all of them
catches the access wherever it comes from), size defaults to the ptr size, and the
conditions default to rw. An access arrives through Frmj as a frida.wp msg with
the faulting thread, the program counter, the access operation and addr, and the full
register context. A watchpoint disarms itself on the hit so the faulting
instruction does not re-trap, re-arm it to catch the next access. The slot count is bounded by
frida.hw.watchpoints (default 4) and by the CPU, so a set fails when they're full.
Execution breakpoints (Frb) use Interceptor, which fires on every thread with no
plugin-side slot limit (Frida may rewrite the prologue), and data watchpoints (FrW)
use the hardware debug registers, so the two cover different needs without slot conflicts. Instruction
single stepping isn't exposed as a cmd, Frida offers it only through Stalker tracing,
which Frej can drive directly when needed. Parking a thread that's there for UI could
make app unresponsive, so continue promptly, and closing the session releases any thread
still parked.
On an Android target the plugin can inspect the Java VM through the injected agent.
The Java bridge is bundled at build time when node_modules is present, and the agent
degrades on non-Android targets.
FrJj # check Java VM availability
FrLj # list classloaders with int ids
FrCj # list all loaded classes
FrCj re.frida.minapp # list loaded classes filtered by prefix
FrDj java.lang.String # describe a class via reflection
FrDj sg.vantagepoint.uncrackable1.MainActivity 3 # describe with loader id
FrImj sg.vantagepoint.uncrackable1.MainActivity # describe + import into rizin analysis
FrJj checks whether the Java VM is reachable. FrLj enumerates the classloaders
with stable session-scoped int ids, each reporting its runtime type and toString
representation. FrCj lists loaded classes. Pass a prefix to match a
canonical name start or the simple name after the last dot, otherwise the
full list is returned. The frida.java.max config (default 512)
caps the batch and a truncated flag in the reply says whether more classes exist beyond
the cap.
FrDj <class> [loader] describes one Java class through the reflection API and returns
its name, superclass, interfaces, declared fields (name, type, modifiers), declared methods
(name, returnType, parameterTypes, flags, isNative), declared ctors, modifier flag
arrays from the Java.ACC_* bitmask, and optional kotlin.Metadata when the class
was compiled with the Kotlin compiler. An optional loader id selects a specific classloader
from a prior FrLj listing.
FrImj <class> [loader] describes and imports the class into rizin's analysis class
database. It creates the class node, sets the superclass relation (skipping
java.lang.Object), and registers each method and ctor. The imported class is then
visible with ac (list classes) and acl <name> (show details). Methods carry the
UT64_MAX sentinel address (runtime addresses are unknown without native method resolution).
Both FrDj and FrImj support Tab-completion for class names. Pressing Tab reads
the partially typed prefix from the line buffer, queries the agent for matching loaded
classes, and shows suggestions. frida.ac.min (default 2) sets the minimum characters
before autocomplete fires, and frida.ac.max (default 12) caps the number of suggestions.
FrXj [prefix] compares the runtime class list against the statically-loaded binary
classes (when a binary is open in rizin) and returns counts: only_static, only_runtime,
and both. An optional prefix filters both sides. The frida.dex.max config (default 0,
unlimited) caps how many runtime classes are fetched during comparison.
FrNj start snapshots currently loaded classes into a seen set. Calling
start again while already enabled does not re-snapshot. FrNj with no
arg lists classes that appeared since that snapshot (a polling diff, not a
classload interceptor). FrNj stop disables the monitor and does not
clear the seen set. A later listing can still report new names with
monitor: false.
FrRNj on hooks the live JNI RegisterNatives slot on the ART runtime (JNI
function table index 215) to intercept native method registrations. USB/remote
spawn already arms that hook and resumes inside Froj. On a still-suspended
spawn, FrRNj on also resumes the process. FrRNj off disarms the hook
and clears the buffer. FrRNj lists captured invocations with class name,
method names, signatures, and native function addresses. FrRNj import
imports the captured native method entries into rizin's analysis class database.
Frfj imports the target's loaded runtime modules as rizin flags in the frida.libs
flag space so they're visible with commands like f (list flags) and s <name> (seek
to a module's base).
Seven e config variables tune the runtime behaviour:
e frida.mem.max=0x100000 # max bytes per Frxj/Frwj transfer, 0 for no limit
e frida.timeout=5000 # session and agent request timeout in milliseconds
e frida.hw.watchpoints=4 # max hardware watchpoint slots FrW may use, capped by the CPU
e frida.java.max=512 # max loaded classes FrC returns per request, 0 for unlimited
e frida.dex.max=0 # max runtime classes FrX compares, 0 for unlimited
e frida.ac.min=2 # min chars before class autocomplete triggers
e frida.ac.max=12 # max class autocomplete suggestions shown
frida.timeout is applied when a session is opened with Froj. It also applies to
the backend_probe_remote TCP pre-flight that tests reachability before frida-core's
own connect, so unreachable remote hosts fail in bounded time instead of waiting for OS
TCP retries. frida.hw.watchpoints defaults to 4 (the common arm64 and x86_64 count),
raise it on a CPU with more slots. frida.java.max defaults to 512 to avoid
dumping tens of thousands of classes at once, set it to 0 on a fast device when you need
the complete list. frida.dex.max caps the runtime class list during FrXj comparison,
defaulting to 0 (unlimited). frida.ac.min and frida.ac.max control class-name
Tab-completion for FrDj and FrImj. frida.mem.max guards mem r/w
transfers against large allocs.
ninja -C build install # install to the configured prefix
or on a custom prefix:
meson setup build --prefix=/usr # configure with a custom install path
ninja -C build # compile
ninja -C build install # install
meson setup build-asan -Dbuildtype=debugoptimized -Db_sanitize=address,undefined # configure
ninja -C build-asan # compile
A native dock widget frontend over the rz-frida rizin plugin. All agent
roundtrips go through the rizin plugin's C API (FridaApiBridge).
Requires the Cutter CMake config and headers from a Cutter installation or extracted AppImage, and Qt 5.15+ or Qt 6.
cmake -S plugin/cutter -B build-cutter -DCMAKE_PREFIX_PATH=/path/to/cutter/install # configure
cmake --build build-cutter # build
cmake --install build-cutter # install
Just for example, the Cutter v2.5.0 AppImage:
./Cutter-v2.5.0-Linux-x86_64.AppImage --appimage-extract # extract the AppImage
cmake -S plugin/cutter -B build-cutter -DCMAKE_PREFIX_PATH=./squashfs-root/usr # configure
cmake --build build-cutter # build
cmake --install build-cutter # install
The plugin .so lands in <prefix>/share/rizin/cutter/plugins/native/.
The dock widget provides 9 tabs, behind a Frida session (disabled when not connected, enabled on connect):
- Session — inline transport/device/target/action controls with device and process listing, plus a direct Connect button that opens the session without the modal dialog
- Runtime — subtabbed memory ranges, modules, and threads tables populated
via
FrRj/FrMj/Frtjin parallel, memory read viaFrxj, memory write viaFrwj, and module detail panel showing exports (FrEj), imports (FrIj), and symbols (FrSj) for the selected module - Java — classloader enumeration (
FrLj), class load monitor (FrNjstart/stop/refresh-newly-loaded), prefix-filtered class list (FrCj), describe (FrDj) with JSON detail, and import-to-analysis (FrImj) - Script — file loading (
Frlj) and inline JS eval (Frej) - Messages — agent message buffer drain (
Frmj) with dropped-message count - DEX Diff — runtime-vs-static class comparison (
FrXj) with counts for only-in-static, only-in-runtime, and both - RegNat — RegisterNatives hook enable/disable/refresh/import (
FrRNj) - Flags — runtime module import into
frida.libsflag space (Frfj) - Debug — native breakpoints (
Frbjset/list,Frb-jremove/all), breakpoint continue (Frgjwith optional TID), hardware watchpoints (FrWjset/list with address/size/conditions,FrW-jremove/all), register r/w for stopped threads (FrBj), and a break/watchpoint notif log
All agent roundtrips go through FridaApiBridge, which calls the rz-frida
rizin plugin's C API directly (the rz_frida_backend_* functions) and parses
every reply through parseEnvelope(), validating the ok/error/result
structure. Errors surface as thrown QStrings, and session calls are serialized
with a mutex.
The blocking calls run on a background worker through FridaTaskRunner, a
serial single-worker queue (QThread plus QQueue and QWaitCondition). The
rz-frida backend assumes one in-flight request per session, so tasks never run
concurrently. Results and errors are delivered on the Qt main thread through
queued QMetaObject::invokeMethod callbacks, guarded by a QPointer so a
destroyed widget never receives a callback. The caller disables the triggering
button during flight and re-enables it on completion.
waitForAll() drains the queue during teardown so no task can outlive the
bridge it calls into.
Quick session-state checks (connect/disconnect, hasSession()) call the C API
synchronously on the main thread.
A modal dialog for transport/device/target/action selection. Transport choices
(local/USB/remote) toggle the host:port field and device combo. After any
successful open the dock calls resumeSession(), so a local spawn from the
GUI is resumed, CLI local spawn is not. Refresh buttons populate the device
and process/package table via the C API. Last-used settings persist in
QSettings across restarts.
The plugin's user-facing strings are translatable with same worklow as Cutter.
All widget strings go through tr() and all bridge error strings through
QCoreApplication::translate, so a translator only needs to fill a .ts file.
lupdate -recursive plugin/cutter/src -ts plugin/cutter/translations/frida_<locale>.ts # extract translatable strings
# fill the .ts in Qt Linguist
lrelease plugin/cutter/translations/frida_<locale>.ts # compile the .qm
The plugin loads frida_<locale>.qm at startup, same as Cutter's configured
language, from Cutter's translation directories. To add a language, drop
plugin/cutter/translations/frida_<locale>.ts into the source tree and list it
in FRIDA_TS_FILES in plugin/cutter/CMakeLists.txt. The build compiles it
with lrelease and installs the .qm next to Cutter's own translation files.
| Symptom | Cause and fix |
|---|---|
Unable to find process with pid <pid> |
The attach target does not exist. List processes with Frpj and use a live pid or a process name. |
Device not found |
frida-server is not running on the device or the USB link is gone. Check with frida-ps -U and restart frida-server. |
Timeout was reached |
The target is unreachable, the transport is wrong, or the operation exceeded frida.timeout. Check the host:port on the remote transport and the USB connection. |
No active Frida session |
A session is required first. Open one with Froj. |
A session is already open |
Only one session at a time. Close it with Frcj first. |
frida_unavailable |
The plugin was built without frida-core. Rebuild with -Dfrida_core=enabled and the devkit paths. |
| Cutter dock does not appear | The plugin .so may be shadowed by a stale copy in another rizin plugin directory. Remove old copies and keep the freshly built one. |
- r2frida, Frida integration plugin for radare2.





