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);
for libname in ["libc++.so", "libc++.so.1", "libc++_shared.so"] {
for export in Module::enumerate_exports(libname) {
match &export.name[..] {
"_Znam" => {
hook_func!(Some(libname), _Znam, (size: usize), *mut c_void);
}
"_ZnamRKSt9nothrow_t" => {
hook_func!( hook_func!(
None, Some(libname),
_ZnamRKSt9nothrow_t, _ZnamRKSt9nothrow_t,
(size: usize, _nothrow: *const c_void), (size: usize, _nothrow: *const c_void),
*mut c_void *mut c_void
); );
}
"_ZnamSt11align_val_t" => {
hook_func!( hook_func!(
None, Some(libname),
_ZnamSt11align_val_t, _ZnamSt11align_val_t,
(size: usize, alignment: usize), (size: usize, alignment: usize),
*mut c_void *mut c_void
); );
}
"_ZnamSt11align_val_tRKSt9nothrow_t" => {
hook_func!( hook_func!(
None, Some(libname),
_ZnamSt11align_val_tRKSt9nothrow_t, _ZnamSt11align_val_tRKSt9nothrow_t,
(size: usize, alignment: usize, _nothrow: *const c_void), (size: usize, alignment: usize, _nothrow: *const c_void),
*mut c_void *mut c_void
); );
hook_func!(None, _Znwm, (size: usize), *mut c_void); }
"_Znwm" => {
hook_func!(Some(libname), _Znwm, (size: usize), *mut c_void);
}
"_ZnwmRKSt9nothrow_t" => {
hook_func!( hook_func!(
None, Some(libname),
_ZnwmRKSt9nothrow_t, _ZnwmRKSt9nothrow_t,
(size: usize, _nothrow: *const c_void), (size: usize, _nothrow: *const c_void),
*mut c_void *mut c_void
); );
}
"_ZnwmSt11align_val_t" => {
hook_func!( hook_func!(
None, Some(libname),
_ZnwmSt11align_val_t, _ZnwmSt11align_val_t,
(size: usize, alignment: usize), (size: usize, alignment: usize),
*mut c_void *mut c_void
); );
}
"_ZnwmSt11align_val_tRKSt9nothrow_t" => {
hook_func!( hook_func!(
None, Some(libname),
_ZnwmSt11align_val_tRKSt9nothrow_t, _ZnwmSt11align_val_tRKSt9nothrow_t,
(size: usize, alignment: usize, _nothrow: *const c_void), (size: usize, alignment: usize, _nothrow: *const c_void),
*mut c_void *mut c_void
); );
hook_func!(None, _ZdaPv, (ptr: *mut c_void), ()); }
hook_func!(None, _ZdaPvm, (ptr: *mut c_void, _ulong: u64), ()); "_ZdaPv" => {
hook_func!(Some(libname), _ZdaPv, (ptr: *mut c_void), ());
}
"_ZdaPvm" => {
hook_func!(Some(libname), _ZdaPvm, (ptr: *mut c_void, _ulong: u64), ());
}
"_ZdaPvmSt11align_val_t" => {
hook_func!( hook_func!(
None, Some(libname),
_ZdaPvmSt11align_val_t, _ZdaPvmSt11align_val_t,
(ptr: *mut c_void, _ulong: u64, _alignment: usize), (ptr: *mut c_void, _ulong: u64, _alignment: usize),
() ()
); );
}
"_ZdaPvRKSt9nothrow_t" => {
hook_func!( hook_func!(
None, Some(libname),
_ZdaPvRKSt9nothrow_t, _ZdaPvRKSt9nothrow_t,
(ptr: *mut c_void, _nothrow: *const c_void), (ptr: *mut c_void, _nothrow: *const c_void),
() ()
); );
}
"_ZdaPvSt11align_val_t" => {
hook_func!( hook_func!(
None, Some(libname),
_ZdaPvSt11align_val_t, _ZdaPvSt11align_val_t,
(ptr: *mut c_void, _alignment: usize), (ptr: *mut c_void, _alignment: usize),
() ()
); );
}
"_ZdaPvSt11align_val_tRKSt9nothrow_t" => {
hook_func!( hook_func!(
None, Some(libname),
_ZdaPvSt11align_val_tRKSt9nothrow_t, _ZdaPvSt11align_val_tRKSt9nothrow_t,
(ptr: *mut c_void, _alignment: usize, _nothrow: *const c_void), (ptr: *mut c_void, _alignment: usize, _nothrow: *const c_void),
() ()
); );
hook_func!(None, _ZdlPv, (ptr: *mut c_void), ()); }
hook_func!(None, _ZdlPvm, (ptr: *mut c_void, _ulong: u64), ()); "_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!( hook_func!(
None, Some(libname),
_ZdlPvmSt11align_val_t, _ZdlPvmSt11align_val_t,
(ptr: *mut c_void, _ulong: u64, _alignment: usize), (ptr: *mut c_void, _ulong: u64, _alignment: usize),
() ()
); );
}
"_ZdlPvRKSt9nothrow_t" => {
hook_func!( hook_func!(
None, Some(libname),
_ZdlPvRKSt9nothrow_t, _ZdlPvRKSt9nothrow_t,
(ptr: *mut c_void, _nothrow: *const c_void), (ptr: *mut c_void, _nothrow: *const c_void),
() ()
); );
}
"_ZdlPvSt11align_val_t" => {
hook_func!( hook_func!(
None, Some(libname),
_ZdlPvSt11align_val_t, _ZdlPvSt11align_val_t,
(ptr: *mut c_void, _alignment: usize), (ptr: *mut c_void, _alignment: usize),
() ()
); );
}
"_ZdlPvSt11align_val_tRKSt9nothrow_t" => {
hook_func!( hook_func!(
None, Some(libname),
_ZdlPvSt11align_val_tRKSt9nothrow_t, _ZdlPvSt11align_val_tRKSt9nothrow_t,
(ptr: *mut c_void, _alignment: usize, _nothrow: *const c_void), (ptr: *mut c_void, _alignment: usize, _nothrow: *const c_void),
() ()
); );
}
_ => {}
}
}
}
hook_func!( hook_func!(
None, None,