#[cfg(all(not(feature = "std"), feature = "alloc"))]
use alloc::vec::Vec;
#[cfg(feature = "std")]
use std::vec::Vec;
mod detector;
#[cfg(feature = "std")]
mod integrity;
#[cfg(feature = "std")]
mod tracker;
mod unhook;
pub use detector::{is_hooked, HookDetector, HookInfo, HookType};
#[cfg(feature = "std")]
pub use integrity::IntegrityChecker;
#[cfg(feature = "std")]
pub use tracker::HookTracker;
pub use unhook::{UnhookResult, Unhooker};
use crate::error::Result;
use crate::navigation::ModuleQuery;
use crate::structures::Peb;
pub fn scan_for_hooks() -> Result<Vec<HookInfo>> {
let peb = Peb::current()?;
let query = ModuleQuery::new(&peb);
let mut all_hooks = Vec::new();
if let Ok(ntdll) = query.find_by_name("ntdll.dll") {
let detector = HookDetector::new(&ntdll)?;
if let Ok(hooks) = detector.scan_exports() {
all_hooks.extend(hooks);
}
}
if let Ok(kernel32) = query.find_by_name("kernel32.dll") {
let detector = HookDetector::new(&kernel32)?;
if let Ok(hooks) = detector.scan_exports() {
all_hooks.extend(hooks);
}
}
if let Ok(kernelbase) = query.find_by_name("kernelbase.dll") {
let detector = HookDetector::new(&kernelbase)?;
if let Ok(hooks) = detector.scan_exports() {
all_hooks.extend(hooks);
}
}
Ok(all_hooks)
}
pub fn unhook_ntdll() -> Result<UnhookResult> {
let peb = Peb::current()?;
let query = ModuleQuery::new(&peb);
let ntdll = query.find_by_name("ntdll.dll")?;
let unhooker = Unhooker::new(&ntdll)?;
unhooker.unhook_all()
}
pub fn scan_module(module_name: &str) -> Result<Vec<HookInfo>> {
let peb = Peb::current()?;
let query = ModuleQuery::new(&peb);
let module = query.find_by_name(module_name)?;
let detector = HookDetector::new(&module)?;
detector.scan_exports()
}
pub fn unhook_module(module_name: &str) -> Result<UnhookResult> {
let peb = Peb::current()?;
let query = ModuleQuery::new(&peb);
let module = query.find_by_name(module_name)?;
let unhooker = Unhooker::new(&module)?;
unhooker.unhook_all()
}