Simplify the code (use ctor for all targets) and add a readme

This commit is contained in:
Dimitris Zervas 2023-05-23 19:41:28 +03:00
parent 11ec2f401b
commit a5880b5bed
No known key found for this signature in database
GPG Key ID: 5C27D7C9D1901A30
4 changed files with 57 additions and 37 deletions

View File

@ -6,13 +6,11 @@ edition = "2021"
[lib]
crate-type = ["cdylib"]
[[bin]]
name = "standalone"
[dependencies]
frida = { version = "0.4.0", features = ["auto-download"] }
frida-sys = { version = "0.4.0", features = ["auto-download", "frida-build"] }
lazy_static = "1.4.0"
# [target.'cfg(unix)'.dependencies]
ctor = "0.2.0"
# [target.'cfg(windows)'.dependencies]
# winapi = "0.3.9"

51
README.md Normal file
View File

@ -0,0 +1,51 @@
# frida-deepfreeze-rs
Have you ever written a frida script this good, that you wanted to make it permanent?
Well, now you can!
frida-deepfreeze-rs is a tool that allows you to convert your frida scripts into
either a standalone executable that when called with a PID injects itself and runs
the script or a shared library that can be somehow injected to a process and runs
the script.
All desktop platforms are supported (Windows, Linux, macOS).
## Usage
You're gonna have to compile the tool yourself as the frida script gets embedded
at compile time.
You only need a working cargo installation to compile it, it's quite simple.
You can feed your script either as a string using the `FRIDA_CODE` environment
variable or as a file using the `FRIDA_CODE_FILE` environment variable.
### Standalone executable
```bash
git clone https://github.com/dzervas/frida-deepfreeze-rs
FRIDA_CODE='console.log("Hello world from frida-deepfreeze-rs!")' cargo run --bin standalone -- 1234
```
The binary is located at `target/debug/standalone` (`.exe` for windows).
### Shared library
```bash
git clone https://github.com/dzervas/frida-deepfreeze-rs
FRIDA_CODE='console.log("Hello world from frida-deepfreeze-rs!")' cargo build --lib
LD_PRELOAD=target/debug/libfrida_deepfreeze_rs.so cat
# rundll32.exe target/debug/frida_deepfreeze_rs.dll,inject_self 1234 (windows equivalent)
```
The resulting library is located at `target/debug/libfrida_deepfreeze_rs.so`
(`.dll` for windows). You can inject it using your favorite injector.
There are two exported functions:
```c
void inject(uint32_t pid); // Run the frida script in the process with the given pid
void inject_self(); // Run the frida script in the process that called the function
```
By default, on load the library will call `inject_self()`.

View File

@ -6,11 +6,11 @@ fn main() {
if let Ok(code_file) = env::var("FRIDA_CODE_FILE") {
env::set_var("FRIDA_CODE", &std::fs::read_to_string(&code_file).unwrap());
eprintln!("Using code from file: {}", &code_file);
println!("cargo:warning=Using code from file: {}", &code_file);
} else if env::var("FRIDA_CODE").is_ok() {
eprintln!("Using code from environment variable: FRIDA_CODE");
println!("cargo:warning=Using code from environment variable: FRIDA_CODE");
} else {
eprintln!("Please set FRIDA_CODE or FRIDA_CODE_FILE environment variable");
println!("cargo:error=Please set FRIDA_CODE or FRIDA_CODE_FILE environment variable");
std::process::exit(1);
}
}

View File

@ -2,39 +2,10 @@ pub mod injector;
pub use injector::{inject, inject_self};
// #[cfg(unix)]
use ctor::ctor;
// #[cfg(unix)]
#[ctor]
fn _start() {
println!("[+] frida-deepfreeze-rs SO injected");
inject_self();
}
/*
#[cfg(windows)]
use std::ptr;
#[cfg(windows)]
use std::ffi::c_void;
#[cfg(windows)]
use winapi::um::libloaderapi::{DllMain, DLL_PROCESS_ATTACH, DLL_PROCESS_DETACH, DLL_THREAD_ATTACH, DLL_THREAD_DETACH};
#[allow(non_snake_case)]
#[cfg(windows)]
#[no_mangle]
pub extern "system" fn DllMain(hinstDLL: *mut c_void, fdwReason: u32, _: *mut c_void) -> i32 {
match fdwReason {
DLL_PROCESS_ATTACH => {
println!("[+] frida-deepfreeze-rs DLL injected");
inject_self();
}
// DLL_PROCESS_DETACH => {}
// DLL_THREAD_ATTACH => {}
// DLL_THREAD_DETACH => {}
_ => {}
}
1
}
*/