Support different names for the libc++ shared object when hooking (#370)

This commit is contained in:
s1341 2021-11-08 08:50:20 +02:00 committed by GitHub
parent 8ec8be1ce5
commit eecfdbbbe0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -30,7 +30,7 @@ use capstone::{
use dynasmrt::{dynasm, DynasmApi, DynasmLabelApi}; use dynasmrt::{dynasm, DynasmApi, DynasmLabelApi};
use frida_gum::interceptor::Interceptor; use frida_gum::interceptor::Interceptor;
use frida_gum::{Gum, ModuleMap}; use frida_gum::{Gum, Module, ModuleMap};
#[cfg(unix)] #[cfg(unix)]
use libc::RLIMIT_STACK; use libc::RLIMIT_STACK;
use libc::{c_char, wchar_t}; use libc::{c_char, wchar_t};
@ -1521,96 +1521,144 @@ impl AsanRuntime {
); );
#[cfg(not(target_vendor = "apple"))] #[cfg(not(target_vendor = "apple"))]
hook_func!(None, malloc_usable_size, (ptr: *mut c_void), usize); hook_func!(None, malloc_usable_size, (ptr: *mut c_void), usize);
hook_func!(None, _Znam, (size: usize), *mut c_void);
hook_func!( for libname in ["libc++.so", "libc++.so.1", "libc++_shared.so"] {
None, for export in Module::enumerate_exports(libname) {
_ZnamRKSt9nothrow_t, match &export.name[..] {
(size: usize, _nothrow: *const c_void), "_Znam" => {
*mut c_void hook_func!(Some(libname), _Znam, (size: usize), *mut c_void);
); }
hook_func!( "_ZnamRKSt9nothrow_t" => {
None, hook_func!(
_ZnamSt11align_val_t, Some(libname),
(size: usize, alignment: usize), _ZnamRKSt9nothrow_t,
*mut c_void (size: usize, _nothrow: *const c_void),
); *mut c_void
hook_func!( );
None, }
_ZnamSt11align_val_tRKSt9nothrow_t, "_ZnamSt11align_val_t" => {
(size: usize, alignment: usize, _nothrow: *const c_void), hook_func!(
*mut c_void Some(libname),
); _ZnamSt11align_val_t,
hook_func!(None, _Znwm, (size: usize), *mut c_void); (size: usize, alignment: usize),
hook_func!( *mut c_void
None, );
_ZnwmRKSt9nothrow_t, }
(size: usize, _nothrow: *const c_void), "_ZnamSt11align_val_tRKSt9nothrow_t" => {
*mut c_void hook_func!(
); Some(libname),
hook_func!( _ZnamSt11align_val_tRKSt9nothrow_t,
None, (size: usize, alignment: usize, _nothrow: *const c_void),
_ZnwmSt11align_val_t, *mut c_void
(size: usize, alignment: usize), );
*mut c_void }
); "_Znwm" => {
hook_func!( hook_func!(Some(libname), _Znwm, (size: usize), *mut c_void);
None, }
_ZnwmSt11align_val_tRKSt9nothrow_t, "_ZnwmRKSt9nothrow_t" => {
(size: usize, alignment: usize, _nothrow: *const c_void), hook_func!(
*mut c_void Some(libname),
); _ZnwmRKSt9nothrow_t,
hook_func!(None, _ZdaPv, (ptr: *mut c_void), ()); (size: usize, _nothrow: *const c_void),
hook_func!(None, _ZdaPvm, (ptr: *mut c_void, _ulong: u64), ()); *mut c_void
hook_func!( );
None, }
_ZdaPvmSt11align_val_t, "_ZnwmSt11align_val_t" => {
(ptr: *mut c_void, _ulong: u64, _alignment: usize), hook_func!(
() Some(libname),
); _ZnwmSt11align_val_t,
hook_func!( (size: usize, alignment: usize),
None, *mut c_void
_ZdaPvRKSt9nothrow_t, );
(ptr: *mut c_void, _nothrow: *const c_void), }
() "_ZnwmSt11align_val_tRKSt9nothrow_t" => {
); hook_func!(
hook_func!( Some(libname),
None, _ZnwmSt11align_val_tRKSt9nothrow_t,
_ZdaPvSt11align_val_t, (size: usize, alignment: usize, _nothrow: *const c_void),
(ptr: *mut c_void, _alignment: usize), *mut c_void
() );
); }
hook_func!( "_ZdaPv" => {
None, hook_func!(Some(libname), _ZdaPv, (ptr: *mut c_void), ());
_ZdaPvSt11align_val_tRKSt9nothrow_t, }
(ptr: *mut c_void, _alignment: usize, _nothrow: *const c_void), "_ZdaPvm" => {
() hook_func!(Some(libname), _ZdaPvm, (ptr: *mut c_void, _ulong: u64), ());
); }
hook_func!(None, _ZdlPv, (ptr: *mut c_void), ()); "_ZdaPvmSt11align_val_t" => {
hook_func!(None, _ZdlPvm, (ptr: *mut c_void, _ulong: u64), ()); hook_func!(
hook_func!( Some(libname),
None, _ZdaPvmSt11align_val_t,
_ZdlPvmSt11align_val_t, (ptr: *mut c_void, _ulong: u64, _alignment: usize),
(ptr: *mut c_void, _ulong: u64, _alignment: usize), ()
() );
); }
hook_func!( "_ZdaPvRKSt9nothrow_t" => {
None, hook_func!(
_ZdlPvRKSt9nothrow_t, Some(libname),
(ptr: *mut c_void, _nothrow: *const c_void), _ZdaPvRKSt9nothrow_t,
() (ptr: *mut c_void, _nothrow: *const c_void),
); ()
hook_func!( );
None, }
_ZdlPvSt11align_val_t, "_ZdaPvSt11align_val_t" => {
(ptr: *mut c_void, _alignment: usize), hook_func!(
() Some(libname),
); _ZdaPvSt11align_val_t,
hook_func!( (ptr: *mut c_void, _alignment: usize),
None, ()
_ZdlPvSt11align_val_tRKSt9nothrow_t, );
(ptr: *mut c_void, _alignment: usize, _nothrow: *const c_void), }
() "_ZdaPvSt11align_val_tRKSt9nothrow_t" => {
); hook_func!(
Some(libname),
_ZdaPvSt11align_val_tRKSt9nothrow_t,
(ptr: *mut c_void, _alignment: usize, _nothrow: *const c_void),
()
);
}
"_ZdlPv" => {
hook_func!(Some(libname), _ZdlPv, (ptr: *mut c_void), ());
}
"_ZdlPvm" => {
hook_func!(Some(libname), _ZdlPvm, (ptr: *mut c_void, _ulong: u64), ());
}
"_ZdlPvmSt11align_val_t" => {
hook_func!(
Some(libname),
_ZdlPvmSt11align_val_t,
(ptr: *mut c_void, _ulong: u64, _alignment: usize),
()
);
}
"_ZdlPvRKSt9nothrow_t" => {
hook_func!(
Some(libname),
_ZdlPvRKSt9nothrow_t,
(ptr: *mut c_void, _nothrow: *const c_void),
()
);
}
"_ZdlPvSt11align_val_t" => {
hook_func!(
Some(libname),
_ZdlPvSt11align_val_t,
(ptr: *mut c_void, _alignment: usize),
()
);
}
"_ZdlPvSt11align_val_tRKSt9nothrow_t" => {
hook_func!(
Some(libname),
_ZdlPvSt11align_val_tRKSt9nothrow_t,
(ptr: *mut c_void, _alignment: usize, _nothrow: *const c_void),
()
);
}
_ => {}
}
}
}
hook_func!( hook_func!(
None, None,