mirror of
https://github.com/denoland/deno.git
synced 2025-02-08 07:16:56 -05:00
POC: fix(win,nap): load node.exe symbols from current executable
This commit is contained in:
parent
e3b2ee183b
commit
955cf3441d
3 changed files with 66 additions and 1 deletions
14
Cargo.lock
generated
14
Cargo.lock
generated
|
@ -1637,6 +1637,9 @@ dependencies = [
|
||||||
"deno_core",
|
"deno_core",
|
||||||
"deno_permissions",
|
"deno_permissions",
|
||||||
"libloading 0.7.4",
|
"libloading 0.7.4",
|
||||||
|
"minhook",
|
||||||
|
"widestring",
|
||||||
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -4075,6 +4078,16 @@ version = "0.3.17"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "minhook"
|
||||||
|
version = "0.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a48ae87876aaa4622bad562f6565cc1961ab8a3394e45247211f20f110286b5e"
|
||||||
|
dependencies = [
|
||||||
|
"cc",
|
||||||
|
"tracing",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "minimal-lexical"
|
name = "minimal-lexical"
|
||||||
version = "0.2.1"
|
version = "0.2.1"
|
||||||
|
@ -6999,6 +7012,7 @@ version = "0.1.40"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
|
checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"log",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"tracing-attributes",
|
"tracing-attributes",
|
||||||
"tracing-core",
|
"tracing-core",
|
||||||
|
|
|
@ -17,3 +17,8 @@ path = "lib.rs"
|
||||||
deno_core.workspace = true
|
deno_core.workspace = true
|
||||||
deno_permissions.workspace = true
|
deno_permissions.workspace = true
|
||||||
libloading = { version = "0.7" }
|
libloading = { version = "0.7" }
|
||||||
|
|
||||||
|
[target.'cfg(windows)'.dependencies]
|
||||||
|
minhook = "0.5.0"
|
||||||
|
widestring = "1.1.0"
|
||||||
|
winapi.workspace = true
|
||||||
|
|
|
@ -532,7 +532,10 @@ where
|
||||||
|
|
||||||
// SAFETY: opening a DLL calls dlopen
|
// SAFETY: opening a DLL calls dlopen
|
||||||
#[cfg(not(unix))]
|
#[cfg(not(unix))]
|
||||||
let library = match unsafe { Library::load_with_flags(&path, flags) } {
|
let library = match unsafe {
|
||||||
|
install_load_library_hook();
|
||||||
|
Library::load_with_flags(&path, flags)
|
||||||
|
} {
|
||||||
Ok(lib) => lib,
|
Ok(lib) => lib,
|
||||||
Err(e) => return Err(type_error(e.to_string())),
|
Err(e) => return Err(type_error(e.to_string())),
|
||||||
};
|
};
|
||||||
|
@ -569,3 +572,46 @@ where
|
||||||
|
|
||||||
Ok(exports)
|
Ok(exports)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
use minhook::MinHook;
|
||||||
|
use widestring::U16CStr;
|
||||||
|
use winapi::shared::minwindef::{DWORD, HMODULE, LPVOID};
|
||||||
|
use winapi::shared::ntdef::HANDLE;
|
||||||
|
use winapi::um::libloaderapi::GetModuleHandleW;
|
||||||
|
use winapi::um::winnt::LPCWSTR;
|
||||||
|
|
||||||
|
type LoadLibraryExWType =
|
||||||
|
unsafe extern "system" fn(LPCWSTR, HANDLE, DWORD) -> HMODULE;
|
||||||
|
static ORIGINAL_LOAD_LIBRARY_EX_W: std::sync::OnceLock<LoadLibraryExWType> =
|
||||||
|
std::sync::OnceLock::new();
|
||||||
|
|
||||||
|
fn install_load_library_hook() {
|
||||||
|
ORIGINAL_LOAD_LIBRARY_EX_W.get_or_init(|| unsafe {
|
||||||
|
let original = MinHook::create_hook_api(
|
||||||
|
"KernelBase.dll",
|
||||||
|
"LoadLibraryExW",
|
||||||
|
load_library_ex_w_hook as LPVOID,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
MinHook::enable_all_hooks().expect("Failed to enable hooks");
|
||||||
|
std::mem::transmute(original)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe extern "system" fn load_library_ex_w_hook(
|
||||||
|
lib_file_name: LPCWSTR,
|
||||||
|
file: HANDLE,
|
||||||
|
flags: DWORD,
|
||||||
|
) -> HMODULE {
|
||||||
|
if U16CStr::from_ptr_str(lib_file_name)
|
||||||
|
.to_string_lossy()
|
||||||
|
.to_lowercase()
|
||||||
|
== "node.exe"
|
||||||
|
{
|
||||||
|
// Return HMODULE of current process
|
||||||
|
return GetModuleHandleW(std::ptr::null());
|
||||||
|
}
|
||||||
|
|
||||||
|
let original_load_library_ex_w = ORIGINAL_LOAD_LIBRARY_EX_W.get().unwrap();
|
||||||
|
original_load_library_ex_w(lib_file_name, file, flags)
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue