2023-05-23 17:21:14 +03:00
pub mod injector ;
2023-06-03 01:52:10 +03:00
#[ cfg(feature = " frida " ) ]
pub mod frida_handler ;
2024-04-13 04:41:03 +03:00
2024-02-27 03:01:29 +02:00
pub use injector ::attach_self ;
2023-05-23 17:21:14 +03:00
2024-04-14 00:29:53 +03:00
// During testing we compile a debug binary without `test`.
// Enabling `ctor` during testing would hook the test runner and break it.
#[ cfg(all(unix, not(test))) ]
2024-04-14 00:57:58 +03:00
pub mod loader_unix ;
2023-06-03 01:52:10 +03:00
2024-04-14 00:29:53 +03:00
#[ cfg(all(windows, not(test))) ]
2024-04-14 00:57:58 +03:00
pub mod loader_windows ;
2024-04-14 00:29:53 +03:00
#[ cfg(all(windows, not(test))) ]
2024-04-14 00:57:58 +03:00
pub use loader_windows ::DllMain ;
2023-06-03 18:02:46 +03:00
#[ cfg(test) ]
mod tests {
use pretty_assertions ::assert_eq ;
use std ::process ::Command ;
2024-04-14 00:57:58 +03:00
#[ allow(dead_code) ]
2024-04-14 00:29:53 +03:00
fn get_lib_name ( name : & str ) -> String {
#[ cfg(target_os = " windows " ) ]
return format! ( " {} .dll " , name ) ;
#[ cfg(target_os = " linux " ) ]
return format! ( " lib {} .so " , name ) ;
#[ cfg(target_os = " darwin " ) ]
return format! ( " lib {} .dylib " , name ) ;
}
2023-06-03 18:02:46 +03:00
#[ test ]
fn test_frida_on_load ( ) {
let lib_status = Command ::new ( " cargo " )
. arg ( " build " )
. arg ( " --lib " )
. arg ( " --target-dir " )
. arg ( " target/test_frida_on_load " )
. env ( " FRIDA_CODE " , r #"
2024-04-14 15:16:40 +03:00
const foo = Module . getExportByName ( null , " mylib_foo " ) ;
Interceptor . replace ( foo , new NativeCallback ( function ( ) {
console . log ( " replaced foo() called " ) ;
return 40 ;
} , " uint8 " , [ ] ) ) ;
2023-06-03 18:02:46 +03:00
" #)
. status ( )
2024-04-13 04:41:03 +03:00
. unwrap ( ) ;
2023-06-03 18:02:46 +03:00
assert! ( lib_status . success ( ) , " Failed to build dynamic library " ) ;
let bin_status = Command ::new ( " cargo " )
. arg ( " run " )
. arg ( " --manifest-path " )
. arg ( " tests/mybin/Cargo.toml " )
. arg ( " --target-dir " )
. arg ( " target/test_frida_on_load " )
. env ( " RUSTFLAGS " , " -C link-arg=-Wl,--no-as-needed -C link-arg=-lfrida_deepfreeze_rs " )
. status ( )
2024-04-14 00:29:53 +03:00
. unwrap ( ) ;
2023-06-03 18:02:46 +03:00
assert_eq! ( bin_status . code ( ) . unwrap ( ) , 40 , " Failed to replace foo() " ) ;
2023-06-03 18:13:37 +03:00
}
2024-04-14 00:29:53 +03:00
#[ test ]
2024-04-14 00:57:58 +03:00
#[ cfg(windows) ]
2024-04-14 00:29:53 +03:00
fn test_frida_dll_proxy ( ) {
2024-04-14 00:57:58 +03:00
use std ::fs ;
2024-04-14 00:29:53 +03:00
let mylib_name = get_lib_name ( " mylib " ) ;
fs ::remove_file ( format! ( " target/test_frida_dll_proxy/debug/deps/ {} " , mylib_name ) ) . unwrap_or_else ( | _ | ( ) ) ;
let mylib_status = Command ::new ( " cargo " )
. arg ( " build " )
. arg ( " --lib " )
. arg ( " --manifest-path " )
. arg ( " tests/mylib/Cargo.toml " )
. arg ( " --target-dir " )
. arg ( " target/test_frida_dll_proxy " )
. status ( )
. unwrap ( ) ;
assert! ( mylib_status . success ( ) , " Failed to build mylib " ) ;
let lib_status = Command ::new ( " cargo " )
. arg ( " build " )
. arg ( " --lib " )
. arg ( " --target-dir " )
. arg ( " target/test_frida_dll_proxy " )
. env ( " DLL_PROXY " , format! ( " target/test_frida_dll_proxy/debug/deps/ {} " , mylib_name ) )
. env ( " RUSTFLAGS " , " -C link-arg=-Wl,--no-as-needed -C link-arg=-lmylib " )
. env ( " FRIDA_CODE " , r #"
const foo = Module . getExportByName ( null , " mylib_foo " ) ;
Interceptor . replace ( foo , new NativeCallback ( function ( ) {
console . log ( " replaced foo() called " ) ;
return 40 ;
} , " uint8 " , [ ] ) ) ;
" #)
. status ( )
. unwrap ( ) ;
assert! ( lib_status . success ( ) , " Failed to build dynamic library " ) ;
let target_dir = " target/test_frida_dll_proxy/debug/deps/ " ;
fs ::rename ( format! ( " {} {} " , target_dir , get_lib_name ( " mylib " ) ) , format! ( " {} {} " , target_dir , get_lib_name ( " mylib-orig " ) ) ) . expect ( " Failed to rename original DLL " ) ;
fs ::rename ( format! ( " {} {} " , target_dir , get_lib_name ( " frida_deepfreeze_rs " ) ) , format! ( " {} {} " , target_dir , get_lib_name ( " mylib " ) ) ) . expect ( " Failed to rename deepfreeze DLL " ) ;
let bin_status = Command ::new ( " cargo " )
. arg ( " run " )
. arg ( " --manifest-path " )
. arg ( " tests/mybin/Cargo.toml " )
. arg ( " --target-dir " )
. arg ( " target/test_frida_dll_proxy " )
. status ( )
. unwrap ( ) ;
assert_eq! ( bin_status . code ( ) . unwrap ( ) , 40 , " Failed to replace foo() " ) ;
}
2023-06-03 18:02:46 +03:00
}