当前位置: 首页 > article >正文

Rust实战:通过DLL注入与IAT Hook技术拦截Windows API调用

1. 为什么需要Hook Windows API在Windows系统开发中Hook技术就像给系统功能安装了一个监听器。想象一下当你点击某个按钮时原本应该弹出标准对话框但通过Hook技术我们可以在这个动作发生前拦截它修改它的行为甚至完全替换成我们自己的逻辑。这种技术在软件调试、安全防护、功能增强等领域都有广泛应用。我曾在开发一个自动化测试工具时需要监控特定应用程序的弹窗行为。通过Hook MessageBoxW这个API成功实现了对弹窗内容的实时分析和记录。这种技术最大的优势在于它不需要修改目标程序的源代码就能实现功能扩展。2. Rust开发环境准备2.1 安装Rust工具链首先确保安装了正确的Rust工具链。对于32位目标程序需要添加i686-pc-windows-msvc目标rustup target add i686-pc-windows-msvc如果是64位目标则使用x86_64-pc-windows-msvc。这里有个坑我踩过如果目标程序是32位的但用64位工具链编译注入时会直接失败。建议在Cargo.toml中明确指定目标平台[target.cfg(target_arch x86)] rustflags [-C, target-featurecrt-static] [target.cfg(target_arch x86_64)] rustflags [-C, target-featurecrt-static]2.2 配置Cargo.tomlDLL项目需要在Cargo.toml中明确声明库类型[lib] name hook_dll crate-type [dylib] path src/lib.rs这里有个细节要注意Rust默认会进行名称修饰(name mangling)但我们需要导出的函数名保持原样所以必须使用#[no_mangle]属性。我曾经因为忘记这个属性导致注入后完全找不到导出函数。3. DLL注入技术详解3.1 创建远程线程注入最常用的注入方式是CreateRemoteThread。基本流程是打开目标进程获取句柄在目标进程中分配内存将DLL路径写入目标进程内存创建远程线程调用LoadLibrary用Rust实现的关键代码如下unsafe fn inject_dll(pid: u32, dll_path: str) - Result(), String { use winapi::um::{ handleapi::CloseHandle, libloaderapi::GetProcAddress, memoryapi::{VirtualAllocEx, WriteProcessMemory}, processthreadsapi::{CreateRemoteThread, OpenProcess}, synchapi::WaitForSingleObject, winbase::GetModuleHandleA, }; let process OpenProcess(PROCESS_ALL_ACCESS, 0, pid); if process.is_null() { return Err(无法打开进程.into()); } let dll_path CString::new(dll_path).unwrap(); let size dll_path.as_bytes().len() 1; let remote_mem VirtualAllocEx( process, null_mut(), size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE, ); WriteProcessMemory( process, remote_mem, dll_path.as_ptr() as _, size, null_mut(), ); let thread CreateRemoteThread( process, null_mut(), 0, Some(mem::transmute(GetProcAddress( GetModuleHandleA(bkernel32.dll\0.as_ptr() as _), bLoadLibraryA\0.as_ptr() as _, ))), remote_mem, 0, null_mut(), ); WaitForSingleObject(thread, INFINITE); CloseHandle(thread); CloseHandle(process); Ok(()) }3.2 其他注入方式对比除了远程线程注入还有几种常见方式注册表注入修改AppInit_DLLs注册表项适用于全局HookAPC注入利用异步过程调用适合特定线程Hook消息钩子注入通过SetWindowsHookEx实现实测下来远程线程注入的成功率最高但需要注意权限问题。在Windows 10/11上如果目标进程是系统进程或以管理员权限运行我们的注入程序也需要相应权限。4. IAT Hook原理与实现4.1 PE文件结构解析理解IAT Hook需要先了解PE文件格式。可以把PE文件想象成一本书DOS头书的封面包含基本信息NT头目录页指出各章节位置节区实际内容章节导入表引用其他书的清单当程序调用外部API时实际上是通过IAT导入地址表跳转到目标函数。我们的Hook就是修改这个跳转地址。4.2 实战IAT Hook MessageBoxW以下是完整的Hook实现代码use winapi::{ shared::{ minwindef::{LPVOID, TRUE}, ntdef::LPCWSTR, windef::HWND, }, um::{ libloaderapi::GetModuleHandleA, memoryapi::VirtualProtect, winnt::{PAGE_EXECUTE_READWRITE, PIMAGE_DOS_HEADER, PIMAGE_IMPORT_DESCRIPTOR, PIMAGE_NT_HEADERS}, }, }; type MessageBoxWType unsafe extern system fn(HWND, LPCWSTR, LPCWSTR, u32) - i32; static mut ORIGINAL_MESSAGE_BOX_W: OptionMessageBoxWType None; unsafe extern system fn hooked_message_box_w( h_wnd: HWND, lp_text: LPCWSTR, lp_caption: LPCWSTR, u_type: u32, ) - i32 { println!(MessageBoxW被Hook了); // 可以修改参数或直接调用原函数 if let Some(original) ORIGINAL_MESSAGE_BOX_W { original( h_wnd, 已被Hook修改\0.encode_utf16().collect::Vec_().as_ptr(), lp_caption, u_type, ) } else { 0 } } unsafe fn hook_import(module_name: str, target_func: str, hook_func: usize) - bool { let module GetModuleHandleA(null()); let dos_header module as PIMAGE_DOS_HEADER; let nt_headers (module as usize (*dos_header).e_lfanew as usize) as PIMAGE_NT_HEADERS; let import_dir (*nt_headers).OptionalHeader.DataDirectory[1]; let mut import_desc (module as usize import_dir.VirtualAddress as usize) as PIMAGE_IMPORT_DESCRIPTOR; while !(*import_desc).Name.is_null() { let name module as usize (*import_desc).Name as usize; let name_str CStr::from_ptr(name as *const i8); if name_str.to_str().unwrap() module_name { let mut thunk module as usize (*import_desc).OriginalFirstThunk as usize; let mut iat module as usize (*import_desc).FirstThunk as usize; while *(thunk as *const usize) ! 0 { let func_name module as usize *(thunk as *const usize) as usize 2; let func_name_str CStr::from_ptr(func_name as *const i8); if func_name_str.to_str().unwrap() target_func { let mut old_protect 0; VirtualProtect( iat as *mut _, std::mem::size_of::usize(), PAGE_EXECUTE_READWRITE, mut old_protect, ); ORIGINAL_MESSAGE_BOX_W Some(std::mem::transmute(*(iat as *const usize))); *(iat as *mut usize) hook_func; VirtualProtect( iat as *mut _, std::mem::size_of::usize(), old_protect, mut old_protect, ); return true; } thunk std::mem::size_of::usize(); iat std::mem::size_of::usize(); } } import_desc import_desc.offset(1); } false } #[no_mangle] pub extern system fn DllMain( _hinst: usize, reason: u32, _reserved: usize, ) - u32 { match reason { 1 { // DLL_PROCESS_ATTACH unsafe { hook_import( user32.dll, MessageBoxW, hooked_message_box_w as usize, ); } } _ {} } TRUE }这段代码有几个关键点通过PEB结构找到导入表遍历导入表找到目标API修改IAT条目指向我们的函数保存原函数指针以便后续调用5. 常见问题与调试技巧5.1 注入失败排查遇到注入失败时可以按以下步骤排查检查位数匹配用Process Explorer确认目标进程位数验证DLL路径路径中的斜杠方向和中文字符常导致问题查看错误码通过GetLastError获取详细错误信息权限检查管理员权限的程序只能被管理员权限的程序注入5.2 调试Hook代码调试DLL注入有几个实用技巧使用OutputDebugString输出调试信息到调试器日志文件在临时目录写入日志文件DebugView捕获系统调试输出双进程调试同时调试注入器和目标进程我曾经遇到一个棘手的问题Hook后的程序随机崩溃。最后发现是因为没有正确处理字符串的null终止符。Rust的字符串不以null结尾而Windows API大多需要这点要特别注意。6. 安全与稳定性考量Hook技术虽然强大但使用不当会导致系统不稳定。在实际项目中我总结了几个最佳实践最小化Hook范围只Hook必要的API减少系统影响错误处理所有unsafe操作都要有健全的错误处理线程安全考虑多线程环境下的竞态条件恢复机制提供方法卸载Hook恢复原状特别是在商业项目中一定要加入完善的日志系统记录Hook的操作和状态变化这对后期排查问题至关重要。

相关文章:

Rust实战:通过DLL注入与IAT Hook技术拦截Windows API调用

1. 为什么需要Hook Windows API? 在Windows系统开发中,Hook技术就像给系统功能安装了一个"监听器"。想象一下,当你点击某个按钮时,原本应该弹出标准对话框,但通过Hook技术,我们可以在这个动作发生…...

超越节点分类:Graph Transformer在脑网络分析中还能做什么?从疾病识别到生物标记发现

超越节点分类:Graph Transformer如何解锁脑网络分析的临床价值 当大多数关于图神经网络(GNN)在医疗领域应用的讨论还停留在疾病分类准确率时,前沿研究已经开始探索更深层次的问题:这些模型能否帮助我们理解疾病背后的生…...

GPEN技术白皮书精读:生成先验如何解决人脸超分病态逆问题

GPEN技术白皮书精读:生成先验如何解决人脸超分病态逆问题 1. 引言:从模糊到高清的AI魔法 你有没有遇到过这样的情况?翻看老照片时,发现那些珍贵的面孔已经模糊不清;或者用AI生成图片时,人脸总是出现奇怪的…...

5G RedCap路由器如何选?关键特性解析与典型应用场景指南

1. 5G RedCap路由器选购的核心指标 第一次接触5G RedCap路由器时,我被参数表里密密麻麻的术语搞得头晕眼花。后来在工业现场实测了7款不同型号后,才发现真正影响使用体验的关键指标其实就这几个: 频段支持就像路由器的"语言能力"。…...

保姆级教程:在Ubuntu 22.04上手动编译FFmpeg+OpenCV,搞定昇腾CANN C++推理环境

昇腾NPU开发实战:从零构建FFmpegOpenCV的C推理环境 在昇腾NPU上进行C开发时,环境配置往往是第一个拦路虎。不同于常见的x86架构,昇腾平台的异构计算特性要求开发者对底层依赖有更深入的理解。本文将手把手带你完成FFmpeg和OpenCV的源码编译&a…...

3大核心功能打造智能游戏体验:League-Toolkit从入门到精通指南

3大核心功能打造智能游戏体验:League-Toolkit从入门到精通指南 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League…...

Overleaf-Workshop:在VSCode中实现Open Overleaf项目的无缝协作与高效管理

Overleaf-Workshop:在VSCode中实现Open Overleaf项目的无缝协作与高效管理 【免费下载链接】Overleaf-Workshop Open Overleaf/ShareLaTex projects in vscode, with full collaboration support. 项目地址: https://gitcode.com/gh_mirrors/ov/Overleaf-Workshop…...

Simulink SVPWM模块输出对不上?别慌,可能是这两个参数没设对(附24V电机FOC仿真案例)

Simulink SVPWM模块输出差异排查指南:从参数配置到波形修正 引言 在电机控制系统的仿真与开发过程中,Simulink的SVPWM模块是工程师们常用的工具之一。然而,许多开发者在对比自带模块与自建模型输出时,经常会遇到令人困惑的波形不一…...

如何快速解锁网易云音乐NCM文件:ncmdumpGUI终极指南

如何快速解锁网易云音乐NCM文件:ncmdumpGUI终极指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 还在为网易云音乐下载的NCM格式文件无法在其他…...

Ansible Playbook在JumpServer中的高级用法:自动化运维效率提升技巧

Ansible Playbook在JumpServer中的高阶实战:效率倍增的自动化运维策略 开篇:当堡垒机遇上自动化运维 想象一下这样的场景:凌晨三点,服务器突然告警,传统运维需要手动登录每台机器检查状态,而熟练使用Ansibl…...

告别重复造轮子:用快马ai一键生成arm7标准外设驱动,效率提升50%

作为一名嵌入式开发者,我经常需要和ARM7这类微控制器打交道。每次新项目启动,最头疼的就是那些重复性的外设驱动编写工作——尤其是定时器中断这种基础功能,虽然逻辑简单,但写起来特别耗时。最近发现InsCode(快马)平台的AI生成功能…...

别再为MoveIt安装发愁了!Ubuntu 20.04 + ROS Noetic 保姆级配置全流程

别再为MoveIt安装发愁了!Ubuntu 20.04 ROS Noetic 保姆级配置全流程 刚接触ROS和机械臂控制时,MoveIt的安装过程就像一道难以逾越的门槛。记得我第一次尝试配置时,整整两天都卡在依赖报错和环境变量设置上。本文将带你用最稳妥的方式&#x…...

VRCT完全指南:在VRChat中打破语言障碍的终极解决方案

VRCT完全指南:在VRChat中打破语言障碍的终极解决方案 【免费下载链接】VRCT VRCT(VRChat Chatbox Translator & Transcription) 项目地址: https://gitcode.com/gh_mirrors/vr/VRCT VRCT(VRChat Chatbox Translator & Transcription&…...

FanControl进阶指南:从噪音诊断到智能散热系统构建

FanControl进阶指南:从噪音诊断到智能散热系统构建 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/Fa…...

PX4仿真环境下的XTDrone实战:解决roslaunch常见错误的5个技巧

PX4仿真环境下的XTDrone实战:解决roslaunch常见错误的5个技巧 在无人机开发领域,PX4与ROS的结合为开发者提供了强大的仿真和测试平台。XTDrone作为基于PX4和ROS的开源无人机仿真框架,已经成为许多开发者和研究团队的首选工具。然而&#xff0…...

亿级并发下的抢票系统架构:从DDD到微服务的实战解析

1. 抢票系统的业务挑战与技术痛点 每年春运期间,12306系统都要面对全球最严苛的高并发考验。2019年春运最高峰日点击量达到1495亿次,相当于每个中国人当天点击了100多次。这种量级的并发请求,如果直接打到数据库上,就算是把阿里云…...

Kandinsky-5.0-I2V-Lite-5s多场景应用:社交头像动效、PPT动态配图、电子相册生成

Kandinsky-5.0-I2V-Lite-5s多场景应用:社交头像动效、PPT动态配图、电子相册生成 1. 认识Kandinsky-5.0-I2V-Lite-5s Kandinsky-5.0-I2V-Lite-5s是一款轻量级图生视频模型,它能将静态图片转化为动态视频。你只需要上传一张首帧图片,再补充一…...

从三角函数到雷达滤波:三角窗的DSP实现与性能测试全记录

从三角函数到雷达滤波:三角窗的DSP实现与性能测试全记录 1. 三角窗的数学本质与信号处理价值 在数字信号处理领域,窗函数就像是一位精密的调音师,能够对原始信号进行细致的修饰和调整。三角窗作为其中最基础却又最富特色的成员之一&#xff0…...

HackBar插件许可绕过实战:从旧版降级到源码修改

1. HackBar插件许可验证问题解析 最近不少安全测试同行反馈,HackBar插件突然弹出许可验证窗口,导致无法正常使用。这个问题其实从2.2.0版本开始就存在了,开发者加入了商业化验证机制。作为一个用了HackBar五年的老用户,我完全理解…...

人脸识别OOD模型在金融领域的身份验证应用

人脸识别OOD模型在金融领域的身份验证应用 1. 引言 想象一下这样的场景:一位银行客户正在通过手机APP进行大额转账,系统需要快速准确地确认他的身份。传统的人脸识别系统可能会因为光线不佳、佩戴口罩或者图像模糊而无法正常工作,甚至可能被…...

颠覆传统:智能网页捕获工具重新定义长截图体验

颠覆传统:智能网页捕获工具重新定义长截图体验 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-extension …...

老生常谈:聊聊mysql幻读问题?

之前有位小伙伴美团三面,一直被追求「幻读是否被 MySQL 可重复度隔离级别彻底解决了?」之前我也提到过,MySQL InnoDB 引擎的默认隔离级别虽然是「可重复读」,但是它很大程度上避免幻读现象(并不是完全解决了&#xff0…...

ESP32 CMakeLists.txt配置避坑指南:为什么加了PRIV_REQUIRES driver反而编译失败?

ESP32 CMakeLists.txt配置避坑指南:为什么加了PRIV_REQUIRES driver反而编译失败? 在ESP-IDF开发环境中,CMakeLists.txt文件的配置往往是决定项目能否顺利编译的关键。许多开发者在移植或创建新组件时,常常陷入依赖声明的误区——…...

Karp的21个NPC问题:从理论到实践的经典探索

1. Karp与NPC问题的历史背景 1971年,Stephen Cook在论文《The Complexity of Theorem Proving Procedures》中首次提出了NP完全性的概念,并证明了布尔可满足性问题(SAT)属于NP完全问题。这一突破性工作为计算复杂性理论奠定了基石…...

EcomGPT-中英文-7B电商模型实战:基于YOLOv8的商品图像识别与文案生成联动

EcomGPT-中英文-7B电商模型实战:基于YOLOv8的商品图像识别与文案生成联动 1. 引言 想象一下这个场景:你正在看一场电商直播,主播语速飞快地介绍着几十款商品。你刚对其中一款水杯产生兴趣,还没来得及问材质和容量,画…...

中小企业SEO推广应该投入多少费用

<h2>中小企业SEO推广应该投入多少费用</h2> <p>在数字化时代&#xff0c;网络已经成为企业推广和销售的重要渠道之一。特别是对于中小企业来说&#xff0c;通过优化搜索引擎&#xff08;SEO&#xff09;来提升网站的自然流量&#xff0c;是非常有效且相对经济…...

Ostrakon-VL像素UI设计细节:16色限定调色板与可访问性对比度达标

Ostrakon-VL像素UI设计细节&#xff1a;16色限定调色板与可访问性对比度达标 1. 项目背景与设计理念 1.1 从工业UI到像素艺术的转变 在零售与餐饮行业的AI应用场景中&#xff0c;传统工业级UI往往给人冰冷、复杂的印象。Ostrakon-VL扫描终端大胆采用8-bit复古像素风格&#…...

开发提效新组合:用Cursor编写核心逻辑,快马平台一键生成完整企业级项目

今天想和大家分享一个提升开发效率的实用组合&#xff1a;用Cursor编写核心业务逻辑&#xff0c;再通过InsCode(快马)平台一键生成完整项目。最近在开发一个企业内部工时管理系统时&#xff0c;这套组合拳帮我节省了大量重复劳动时间。 1. 为什么选择这个技术组合 开发企业级…...

实战向 Python 汽车推荐系统 Django框架 可视化 协同过滤算法 数据分析 大数据 机器学习(建议收藏)✅

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ > &#x1f345;想要获取完整文章或者源码&#xff0c;或者代做&#xff0c;拉到文章底部即可与…...

高效解决E-Hentai图库下载难题:实用下载工具全攻略

高效解决E-Hentai图库下载难题&#xff1a;实用下载工具全攻略 【免费下载链接】E-Hentai-Downloader Download E-Hentai archive as zip file 项目地址: https://gitcode.com/gh_mirrors/eh/E-Hentai-Downloader 在数字资源管理领域&#xff0c;E-Hentai作为知名的漫画…...