19 KiB
iOS Frida Configuration
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the ЁЯТм Discord group or the telegram group or follow us on Twitter ЁЯРж @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Deepen your expertise in Mobile Security with 8kSec Academy. Master iOS and Android security through our self-paced courses and get certified:
{% embed url="https://academy.8ksec.io/" %}
Installing Frida
Jailbroken рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ Frida рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЪрд░рдг:
- Cydia/Sileo рдРрдк рдЦреЛрд▓реЗрдВред
- Manage -> Sources -> Edit -> Add рдкрд░ рдЬрд╛рдПрдВред
- URL рдХреЗ рд░реВрдк рдореЗрдВ "https://build.frida.re" рджрд░реНрдЬ рдХрд░реЗрдВред
- рдирдП рдЬреЛрдбрд╝реЗ рдЧрдП Frida рд╕реНрд░реЛрдд рдкрд░ рдЬрд╛рдПрдВред
- Frida рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
рдпрджрд┐ рдЖрдк Corellium рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ https://github.com/frida/frida/releases рд╕реЗ Frida рд░рд┐рд▓реАрдЬрд╝ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА (frida-gadget-[yourversion]-ios-universal.dylib.gz
) рдФрд░ рдЗрд╕реЗ рдЕрдирдкреИрдХ рдХрд░рдХреЗ Frida рджреНрд╡рд╛рд░рд╛ рдорд╛рдВрдЧреЗ рдЧрдП dylib рд╕реНрдерд╛рди рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ, рдЬреИрд╕реЗ: /Users/[youruser]/.cache/frida/gadget-ios.dylib
рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЕрдкрдиреЗ PC рдкрд░ frida-ls-devices
рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдбрд┐рд╡рд╛рдЗрд╕ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИ (рдЖрдкрдХреЗ PC рдХреЛ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ frida-ps -Uia
рдЪрд▓рд╛рдПрдВ рддрд╛рдХрд┐ рдлреЛрди рдХреА рдЪрд▓ рд░рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛ рд╕рдХреЗред
рдмрд┐рдирд╛ Jailbroken рдбрд┐рд╡рд╛рдЗрд╕ рдФрд░ рдмрд┐рдирд╛ рдРрдк рдХреЛ рдкреИрдЪ рдХрд┐рдП Frida
рдмрд┐рдирд╛ рдкреИрдЪ рдХрд┐рдП рдЧреИрд░-рдЬреЗрд▓рдмреНрд░реЛрдХрди рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ Frida рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЛ рджреЗрдЦреЗрдВ: https://mrbypass.medium.com/unlocking-potential-exploring-frida-objection-on-non-jailbroken-devices-without-application-ed0367a84f07
Frida Client Installation
frida tools рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
pip install frida-tools
pip install frida
Frida рд╕рд░реНрд╡рд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдиреЗ рдФрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдЪрд╛рд▓реВ рдФрд░ рдХрдиреЗрдХреНрдЯреЗрдб рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде, рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ:
frida-ls-devices # List devices
frida-ps -Uia # Get running processes
рдлреНрд░рд┐рдбрд╛ рдЯреНрд░реЗрд╕
# Functions
## Trace all functions with the word "log" in their name
frida-trace -U <program> -i "*log*"
frida-trace -U <program> -i "*log*" | swift demangle # Demangle names
# Objective-C
## Trace all methods of all classes
frida-trace -U <program> -m "*[* *]"
## Trace all methods with the word "authentication" from classes that start with "NE"
frida-trace -U <program> -m "*[NE* *authentication*]"
# Plug-In
## To hook a plugin that is momentarely executed prepare Frida indicating the ID of the Plugin binary
frida-trace -U -W <if-plugin-bin> -m '*[* *]'
рд╕рднреА рдХреНрд▓рд╛рд╕ рдФрд░ рдореЗрдердб рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
- рдСрдЯреЛ рдкреВрд░реНрдг: рдмрд╕
frida -U <program>
рдЪрд▓рд╛рдПрдБ
- рд╕рднреА рдЙрдкрд▓рдмреНрдз рдХреНрд▓рд╛рд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░реЗрдВ)
{% code title="/tmp/script.js" %}
// frida -U <program> -l /tmp/script.js
var filterClass = "filterstring";
if (ObjC.available) {
for (var className in ObjC.classes) {
if (ObjC.classes.hasOwnProperty(className)) {
if (!filterClass || className.includes(filterClass)) {
console.log(className);
}
}
}
} else {
console.log("Objective-C runtime is not available.");
}
{% endcode %}
- рдХрд┐рд╕реА рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рднреА рдореЗрдердбреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░реЗрдВ)
{% code title="/tmp/script.js" %}
// frida -U <program> -l /tmp/script.js
var specificClass = "YourClassName";
var filterMethod = "filtermethod";
if (ObjC.available) {
if (ObjC.classes.hasOwnProperty(specificClass)) {
var methods = ObjC.classes[specificClass].$ownMethods;
for (var i = 0; i < methods.length; i++) {
if (!filterMethod || methods[i].includes(filterClass)) {
console.log(specificClass + ': ' + methods[i]);
}
}
} else {
console.log("Class not found.");
}
} else {
console.log("Objective-C runtime is not available.");
}
{% endcode %}
- рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░реЗрдВ
// Find the address of the function to call
const func_addr = Module.findExportByName("<Prog Name>", "<Func Name>");
// Declare the function to call
const func = new NativeFunction(
func_addr,
"void", ["pointer", "pointer", "pointer"], {
});
var arg0 = null;
// In this case to call this function we need to intercept a call to it to copy arg0
Interceptor.attach(wg_log_addr, {
onEnter: function(args) {
arg0 = new NativePointer(args[0]);
}
});
// Wait untill a call to the func occurs
while (! arg0) {
Thread.sleep(1);
console.log("waiting for ptr");
}
var arg1 = Memory.allocUtf8String('arg1');
var txt = Memory.allocUtf8String('Some text for arg2');
wg_log(arg0, arg1, txt);
console.log("loaded");
Frida Fuzzing
Frida Stalker
From the docs: Stalker Frida рдХрд╛ рдХреЛрдб рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдЗрдВрдЬрди рд╣реИред рдпрд╣ рдереНрд░реЗрдбреНрд╕ рдХреЛ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╣рд░ рдлрд╝рдВрдХреНрд╢рди, рд╣рд░ рдмреНрд▓реЙрдХ, рдпрд╣рд╛рдВ рддрдХ рдХрд┐ рд╣рд░ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред
рдЖрдкрдХреЗ рдкрд╛рд╕ Frida Stalker рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ https://github.com/poxyran/misc/blob/master/frida-stalker-example.py
рдпрд╣ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╣рд░ рдмрд╛рд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣реЛрдиреЗ рдкрд░ Frida Stalker рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд┐рдпрд╛ рдЬрд╛рдП:
console.log("loading");
const wg_log_addr = Module.findExportByName("<Program>", "<function_name>");
const wg_log = new NativeFunction(
wg_log_addr,
"void", ["pointer", "pointer", "pointer"], {
});
Interceptor.attach(wg_log_addr, {
onEnter: function(args) {
console.log(`logging the following message: ${args[2].readCString()}`);
Stalker.follow({
events: {
// only collect coverage for newly encountered blocks
compile: true,
},
onReceive: function (events) {
const bbs = Stalker.parse(events, {
stringify: false,
annotate: false
});
console.log("Stalker trace of write_msg_to_log: \n" + bbs.flat().map(DebugSymbol.fromAddress).join('\n'));
}
});
},
onLeave: function(retval) {
Stalker.unfollow();
Stalker.flush(); // this is important to get all events
}
});
{% hint style="danger" %}
рдпрд╣ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рд▓реЗрдХрд┐рди рдлрдЬрд╝рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рд▓рдЧрд╛рддрд╛рд░ .follow()
рдФрд░ .unfollow()
рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдкреНрд░рднрд╛рд╡реА рд╣реИред
{% endhint %}
Fpicker
fpicker рдПрдХ Frida-рдЖрдзрд╛рд░рд┐рдд рдлрдЬрд╝рд┐рдВрдЧ рд╕реВрдЯ рд╣реИ рдЬреЛ рдЗрди-рдкреНрд░реЛрд╕реЗрд╕ рдлрдЬрд╝рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдлрдЬрд╝рд┐рдВрдЧ рдореЛрдб рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ AFL++ рдореЛрдб рдпрд╛ рдПрдХ рдкреИрд╕рд┐рд╡ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдореЛрдбред рдЗрд╕реЗ рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ Frida рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред
- fpicker рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ radamsa
# Get fpicker
git clone https://github.com/ttdennis/fpicker
cd fpicker
# Get Frida core devkit and prepare fpicker
wget https://github.com/frida/frida/releases/download/16.1.4/frida-core-devkit-16.1.4-[yourOS]-[yourarchitecture].tar.xz
# e.g. https://github.com/frida/frida/releases/download/16.1.4/frida-core-devkit-16.1.4-macos-arm64.tar.xz
tar -xf ./*tar.xz
cp libfrida-core.a libfrida-core-[yourOS].a #libfrida-core-macos.a
# Install fpicker
make fpicker-[yourOS] # fpicker-macos
# This generates ./fpicker
# Install radamsa (fuzzer generator)
brew install radamsa
- FS рддреИрдпрд╛рд░ рдХрд░реЗрдВ:
# From inside fpicker clone
mkdir -p examples/wg-log # Where the fuzzing script will be
mkdir -p examples/wg-log/out # For code coverage and crashes
mkdir -p examples/wg-log/in # For starting inputs
# Create at least 1 input for the fuzzer
echo Hello World > examples/wg-log/in/0
- Fuzzer рд╕реНрдХреНрд░рд┐рдкреНрдЯ (
examples/wg-log/myfuzzer.js
):
{% code title="examples/wg-log/myfuzzer.js" %}
// Import the fuzzer base class
import { Fuzzer } from "../../harness/fuzzer.js";
class WGLogFuzzer extends Fuzzer {
constructor() {
console.log("WGLogFuzzer constructor called")
// Get and declare the function we are going to fuzz
var wg_log_addr = Module.findExportByName("<Program name>", "<func name to fuzz>");
var wg_log_func = new NativeFunction(
wg_log_addr,
"void", ["pointer", "pointer", "pointer"], {
});
// Initialize the object
super("<Program nane>", wg_log_addr, wg_log_func);
this.wg_log_addr = wg_log_addr; // We cannot use "this" before calling "super"
console.log("WGLogFuzzer in the middle");
// Prepare the second argument to pass to the fuzz function
this.tag = Memory.allocUtf8String("arg2");
// Get the first argument we need to pass from a call to the functino we want to fuzz
var wg_log_global_ptr = null;
console.log(this.wg_log_addr);
Interceptor.attach(this.wg_log_addr, {
onEnter: function(args) {
console.log("Entering in the function to get the first argument");
wg_log_global_ptr = new NativePointer(args[0]);
}
});
while (! wg_log_global_ptr) {
Thread.sleep(1)
}
this.wg_log_global_ptr = wg_log_global_ptr;
console.log("WGLogFuzzer prepare ended")
}
// This function is called by the fuzzer with the first argument being a pointer into memory
// where the payload is stored and the second the length of the input.
fuzz(payload, len) {
// Get a pointer to payload being a valid C string (with a null byte at the end)
var payload_cstring = payload.readCString(len);
this.payload = Memory.allocUtf8String(payload_cstring);
// Debug and fuzz
this.debug_log(this.payload, len);
// Pass the 2 first arguments we know the function needs and finally the payload to fuzz
this.target_function(this.wg_log_global_ptr, this.tag, this.payload);
}
}
const f = new WGLogFuzzer();
rpc.exports.fuzzer = f;
{% endcode %}
- рдлрдЬрд╝реНрдЬрд╝рд░ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ:
# From inside fpicker clone
## Compile from "myfuzzer.js" to "harness.js"
frida-compile examples/wg-log/myfuzzer.js -o harness.js
- рдХреЙрд▓ рдлрдЬрд╝реНрдЬрд╝рд░
fpicker
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПradamsa
:
{% code overflow="wrap" %}
# Indicate fpicker to fuzz a program with the harness.js script and which folders to use
fpicker -v --fuzzer-mode active -e attach -p <Program to fuzz> -D usb -o examples/wg-log/out/ -i examples/wg-log/in/ -f harness.js --standalone-mutator cmd --mutator-command "radamsa"
# You can find code coverage and crashes in examples/wg-log/out/
{% endcode %}
{% hint style="danger" %} рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рд╣рд░ payload рдХреЗ рдмрд╛рдж рдРрдк рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдпрд╛ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ Frida рдПрдХ crash рдкрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕рдХреЗ рдмрд╛рдж рдХреЗ inputs рднреА рдРрдк рдХреЛ crash рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдХреНрдпреЛрдВрдХрд┐ рдРрдк рдПрдХ рдЕрд╕реНрдерд┐рд░ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ) рднрд▓реЗ рд╣реА input рдХреЛ рдРрдк рдХреЛ crash рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, Frida iOS рдХреЗ рдЕрдкрд╡рд╛рдж рд╕рдВрдХреЗрддреЛрдВ рдореЗрдВ рд╣реБрдХ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЬрдм Frida рдПрдХ crash рдкрд╛рддрд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж iOS crash рд░рд┐рдкреЛрд░реНрдЯ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрдЧреАред
рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рд╣рд░ Frida crash рдХреЗ рдмрд╛рдж рдРрдк рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред {% endhint %}
Logs & Crashes
рдЖрдк macOS рдХрдВрд╕реЛрд▓ рдпрд╛ log
cli рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ macOS рд▓реЙрдЧ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдЖрдк idevicesyslog
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ iOS рд╕реЗ рднреА рд▓реЙрдЧ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХреБрдЫ рд▓реЙрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ <private>
рдЬреЛрдбрд╝рдХрд░ред рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ https://developer.apple.com/bug-reporting/profiles-and-logs/ рд╕реЗ рдХреБрдЫ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреА рд╣реЛрдЧреА рддрд╛рдХрд┐ рд╡рд╣ рдирд┐рдЬреА рдЬрд╛рдирдХрд╛рд░реА рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХреЗред
рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ:
vim /Library/Preferences/Logging/com.apple.system.logging.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Enable-Private-Data</key>
<true/>
</dict>
</plist>
killall -9 logd
рдЖрдк рдХреНрд░реИрд╢ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- iOS
- рд╕реЗрдЯрд┐рдВрдЧреНрд╕ тЖТ рдЧреЛрдкрдиреАрдпрддрд╛ тЖТ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рд╕реБрдзрд╛рд░ тЖТ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдбреЗрдЯрд╛
/private/var/mobile/Library/Logs/CrashReporter/
- macOS:
/Library/Logs/DiagnosticReports/
~/Library/Logs/DiagnosticReports
{% hint style="warning" %} iOS рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдРрдк рдХреЗ 25 рдХреНрд░реИрд╢ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рд╛рдл рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ iOS рдХреНрд░реИрд╢ рдмрдирд╛рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛ред {% endhint %}
Frida Android Tutorials
{% content-ref url="../android-app-pentesting/frida-tutorial/" %} frida-tutorial {% endcontent-ref %}
References
рдореЛрдмрд╛рдЗрд▓ рд╕реБрд░рдХреНрд╖рд╛ рдореЗрдВ рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ 8kSec рдЕрдХрд╛рджрдореА рдХреЗ рд╕рд╛рде рдЧрд╣рд░рд╛ рдХрд░реЗрдВред рд╣рдорд╛рд░реЗ рдЖрддреНрдо-рдЧрддрд┐ рдкрд╛рдареНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ iOS рдФрд░ Android рд╕реБрд░рдХреНрд╖рд╛ рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░реЗрдВ рдФрд░ рдкреНрд░рдорд╛рдгрд┐рдд рд╣реЛрдВ:
{% embed url="https://academy.8ksec.io/" %}
{% hint style="success" %}
AWS рд╣реИрдХрд┐рдВрдЧ рд╕реАрдЦреЗрдВ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ:HackTricks Training AWS Red Team Expert (ARTE)
GCP рд╣реИрдХрд┐рдВрдЧ рд╕реАрдЦреЗрдВ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ
- рд╕рджрд╕реНрдпрддрд╛ рдпреЛрдЬрдирд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ!
- рд╣рдорд╛рд░реЗ ЁЯТм Discord рд╕рдореВрд╣ рдпрд╛ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рд╕рдореВрд╣ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ рдпрд╛ рд╣рдореЗрдВ Twitter ЁЯРж @hacktricks_live** рдкрд░ рдлреЙрд▓реЛ рдХрд░реЗрдВред**
- рд╣реИрдХрд┐рдВрдЧ рдЯреНрд░рд┐рдХреНрд╕ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ рдФрд░ HackTricks рдФрд░ HackTricks Cloud рдЧрд┐рдЯрд╣рдм рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдореЗрдВ PR рд╕рдмрдорд┐рдЯ рдХрд░реЗрдВред