获取目标进程导入DLL模块地址的方法

以下是一些常用的方法,可以用于获取目标进程导入DLL模块的地址。根据具体情况选择合适的方法,并注意安全性和稳定性:

1、使用 LoadLibrary 函数和 GetModuleHandle 函数:
#include <Windows.h>// 获取目标进程中某个 DLL 模块的地址
HMODULE GetRemoteModuleAddress(DWORD pid, LPCSTR moduleName) {HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);if (hProcess == NULL) {// 处理错误return NULL;}HMODULE hModule = NULL;HMODULE hKernel32 = GetModuleHandleA("kernel32.dll");FARPROC loadLibraryAddr = GetProcAddress(hKernel32, "LoadLibraryA");if (loadLibraryAddr != NULL) {// 在目标进程中调用 LoadLibrary 加载指定的 DLL 模块LPVOID remoteString = VirtualAllocEx(hProcess, NULL, strlen(moduleName), MEM_COMMIT, PAGE_READWRITE);WriteProcessMemory(hProcess, remoteString, moduleName, strlen(moduleName), NULL);HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)loadLibraryAddr, remoteString, 0, NULL);WaitForSingleObject(hThread, INFINITE);VirtualFreeEx(hProcess, remoteString, 0, MEM_RELEASE);// 获取加载的模块句柄GetExitCodeThread(hThread, (LPDWORD)&hModule);CloseHandle(hThread);}CloseHandle(hProcess);return hModule;
}
2、使用 CreateRemoteThread 函数和 LoadLibrary 函数:
#include <Windows.h>// 获取目标进程中某个 DLL 模块的地址
HMODULE GetRemoteModuleAddress(DWORD pid, LPCSTR moduleName) {HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);if (hProcess == NULL) {// 处理错误return NULL;}HMODULE hModule = NULL;LPVOID remoteString = VirtualAllocEx(hProcess, NULL, strlen(moduleName), MEM_COMMIT, PAGE_READWRITE);WriteProcessMemory(hProcess, remoteString, moduleName, strlen(moduleName), NULL);// 在目标进程中创建远程线程,调用 LoadLibrary 加载指定的 DLL 模块HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, remoteString, 0, NULL);WaitForSingleObject(hThread, INFINITE);// 获取加载的模块句柄GetExitCodeThread(hThread, (LPDWORD)&hModule);VirtualFreeEx(hProcess, remoteString, 0, MEM_RELEASE);CloseHandle(hThread);CloseHandle(hProcess);return hModule;
}
3、使用 EnumProcessModules 函数和 GetModuleBaseName 函数:
#include <Windows.h>
#include <Psapi.h>// 获取目标进程中某个 DLL 模块的地址
HMODULE GetRemoteModuleAddress(DWORD pid, LPCSTR moduleName) {HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);if (hProcess == NULL) {// 处理错误return NULL;}HMODULE hModule = NULL;HMODULE hModules[1024];DWORD cbNeeded;if (EnumProcessModules(hProcess, hModules, sizeof(hModules), &cbNeeded)) {int moduleCount = cbNeeded / sizeof(HMODULE);char szModuleName[MAX_PATH];for (int i = 0; i < moduleCount; i++) {if (GetModuleBaseNameA(hProcess, hModules[i], szModuleName, sizeof(szModuleName)) > 0) {if (_stricmp(szModuleName, moduleName) == 0) {hModule = hModules[i];break;}}}}CloseHandle(hProcess);return hModule;
}
4、使用 CreateToolhelp32Snapshot 函数和 Module32First 函数:
#include <Windows.h>
#include <TlHelp32.h>// 获取目标进程中某个 DLL 模块的地址
HMODULE GetRemoteModuleAddress(DWORD pid, LPCSTR moduleName) {HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);if (hSnapshot == INVALID_HANDLE_VALUE) {// 处理错误return NULL;}HMODULE hModule = NULL;MODULEENTRY32 me32;me32.dwSize = sizeof(MODULEENTRY32);if (Module32First(hSnapshot, &me32)) {do {if (_stricmp(me32.szModule, moduleName) == 0) {hModule = me32.hModule;break;}} while (Module32Next(hSnapshot, &me32));}CloseHandle(hSnapshot);return hModule;
}
5、使用 NtQuerySystemInformation 函数和 EnumProcessModulesEx 函数:
#include <Windows.h>
#include <TlHelp32.h>
#include <ntstatus.h>typedef NTSTATUS(WINAPI* PNT_QUERY_SYSTEM_INFORMATION)(ULONG SystemInformationClass,PVOID SystemInformation,ULONG SystemInformationLength,PULONG ReturnLength);#pragma pack(push, 1)
typedef struct _SYSTEM_MODULE_INFORMATION_ENTRY {HANDLE Section;PVOID MappedBase;PVOID Base;ULONG Size;ULONG Flags;USHORT LoadOrderIndex;USHORT InitOrderIndex;USHORT LoadCount;USHORT PathLength;CHAR ImageName[256];
} SYSTEM_MODULE_INFORMATION_ENTRY, * PSYSTEM_MODULE_INFORMATION_ENTRY;typedef struct _SYSTEM_MODULE_INFORMATION {ULONG NumberOfModules;SYSTEM_MODULE_INFORMATION_ENTRY Module[1];
} SYSTEM_MODULE_INFORMATION, * PSYSTEM_MODULE_INFORMATION;
#pragma pack(pop)// 获取目标进程中某个 DLL 模块的地址
HMODULE GetRemoteModuleAddress(DWORD pid, LPCSTR moduleName) {HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);if (hProcess == NULL) {// 处理错误return NULL;}HMODULE hModule = NULL;HMODULE hModules[1024];DWORD cbNeeded;// 调用 NtQuerySystemInformation 函数查询系统模块信息HMODULE hNtDll = GetModuleHandleA("ntdll.dll");PNT_QUERY_SYSTEM_INFORMATION pNtQuerySystemInformation = (PNT_QUERY_SYSTEM_INFORMATION)GetProcAddress(hNtDll, "NtQuerySystemInformation");ULONG ulSize = 0;pNtQuerySystemInformation(11, NULL, 0, &ulSize);PSYSTEM_MODULE_INFORMATION pModuleInfo = (PSYSTEM_MODULE_INFORMATION)VirtualAlloc(NULL, ulSize, MEM_COMMIT, PAGE_READWRITE);pNtQuerySystemInformation(11, pModuleInfo, ulSize, &ulSize);// 枚举目标进程中的模块,查找指定的 DLL 模块HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);if (hSnapshot == INVALID_HANDLE_VALUE) {VirtualFree(pModuleInfo, 0, MEM_RELEASE);CloseHandle(hProcess);return NULL;}MODULEENTRY32 me32;me32.dwSize = sizeof(MODULEENTRY32);if (Module32First(hSnapshot, &me32)) {do {for (int i = 0; i < pModuleInfo->NumberOfModules; i++) {if (_stricmp(me32.szModule, moduleName) == 0 &&(DWORD_PTR)me32.hModule == (DWORD_PTR)pModuleInfo->Module[i].MappedBase) {hModule = me32.hModule;break;}}} while (Module32Next(hSnapshot, &me32) && hModule == NULL);}VirtualFree(pModuleInfo, 0, MEM_RELEASE);CloseHandle(hSnapshot);CloseHandle(hProcess);return hModule;
}
6、使用 GetProcAddress 函数和 VirtualQueryEx 函数:
#include <Windows.h>// 获取目标进程中某个 DLL 模块的地址
HMODULE GetRemoteModuleAddress(DWORD pid, LPCSTR moduleName) {HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);if (hProcess == NULL) {// 处理错误return NULL;}HMODULE hModule = NULL;HMODULE hKernel32 = GetModuleHandleA("kernel32.dll");FARPROC getProcAddressAddr = GetProcAddress(hKernel32, "GetProcAddress");// 在目标进程中调用 GetProcAddress 获取指定 DLL 模块的导出函数地址HMODULE hModuleKernel32 = GetModuleHandleA("kernel32.dll");LPVOID remoteString = VirtualAllocEx(hProcess, NULL, strlen(moduleName), MEM_COMMIT, PAGE_READWRITE);WriteProcessMemory(hProcess, remoteString, moduleName, strlen(moduleName), NULL);HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)getProcAddressAddr, (LPVOID)hModuleKernel32, 0, NULL);WaitForSingleObject(hThread, INFINITE);// 获取 GetProcAddress 函数返回的地址LPVOID lpRemoteProcAddress;GetExitCodeThread(hThread, (LPDWORD)&lpRemoteProcAddress);// 使用 VirtualQueryEx 函数获取返回地址所在的模块地址MEMORY_BASIC_INFORMATION mbi;VirtualQueryEx(hProcess, lpRemoteProcAddress, &mbi, sizeof(mbi));hModule = (HMODULE)mbi.AllocationBase;VirtualFreeEx(hProcess, remoteString, 0, MEM_RELEASE);CloseHandle(hThread);CloseHandle(hProcess);return hModule;
}
7、使用 CreateToolhelp32Snapshot 函数和 Module32First 函数:
#include <Windows.h>
#include <TlHelp32.h>// 获取目标进程中某个 DLL 模块的地址
HMODULE GetRemoteModuleAddress(DWORD pid, LPCSTR moduleName) {HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);if (hSnapshot == INVALID_HANDLE_VALUE) {// 处理错误return NULL;}HMODULE hModule = NULL;MODULEENTRY32 me32;me32.dwSize = sizeof(MODULEENTRY32);if (Module32First(hSnapshot, &me32)) {do {if (_stricmp(me32.szModule, moduleName) == 0) {hModule = me32.hModule;break;}} while (Module32Next(hSnapshot, &me32) && hModule == NULL);}CloseHandle(hSnapshot);return hModule;
}
8、使用 EnumProcessModules 函数和 GetModuleBaseName 函数:
#include <Windows.h>
#include <Psapi.h>// 获取目标进程中某个 DLL 模块的地址
HMODULE GetRemoteModuleAddress(DWORD pid, LPCSTR moduleName) {HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);if (hProcess == NULL) {// 处理错误return NULL;}HMODULE hModule = NULL;HMODULE hModules[1024];DWORD cbNeeded;if (!EnumProcessModules(hProcess, hModules, sizeof(hModules), &cbNeeded)) {// 处理错误CloseHandle(hProcess);return NULL;}for (int i = 0; i < (cbNeeded / sizeof(HMODULE)); i++) {CHAR szModuleName[MAX_PATH];if (GetModuleBaseNameA(hProcess, hModules[i], szModuleName, sizeof(szModuleName))) {if (_stricmp(szModuleName, moduleName) == 0) {hModule = hModules[i];break;}}}CloseHandle(hProcess);return hModule;
}
9、使用 EnumProcessModules 函数和 GetModuleFileNameEx 函数:
#include <Windows.h>
#include <Psapi.h>// 获取目标进程中某个 DLL 模块的地址
HMODULE GetRemoteModuleAddress(DWORD pid, LPCSTR moduleName) {HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);if (hProcess == NULL) {// 处理错误return NULL;}HMODULE hModule = NULL;HMODULE hModules[1024];DWORD cbNeeded;if (!EnumProcessModules(hProcess, hModules, sizeof(hModules), &cbNeeded)) {// 处理错误CloseHandle(hProcess);return NULL;}for (int i = 0; i < (cbNeeded / sizeof(HMODULE)); i++) {CHAR szModuleName[MAX_PATH];if (GetModuleFileNameExA(hProcess, hModules[i], szModuleName, sizeof(szModuleName))) {if (_stricmp(PathFindFileNameA(szModuleName), moduleName) == 0) {hModule = hModules[i];break;}}}CloseHandle(hProcess);return hModule;
}
10、使用远程线程注入技术,将一个自定义DLL注入到目标进程中,然后在自定义DLL中获取模块地址。这种方法需要对Windows进程注入技术有一定的了解,需要谨慎使用,并且要遵守相关法律法规。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/673843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL基础查询篇(10)-正则表达式的基础使用

正则表达式在MySQL数据库中是非常强大且常用的功能&#xff0c;它可以帮助我们快速的匹配和处理文本数据。在MySQL中&#xff0c;正则表达式的使用可以通过正则表达式函数来实现。 MySQL中常用的正则表达式函数有&#xff1a; REGEXP/RLIKE&#xff1a;通过正则表达式进行模式…

java Map集合相关介绍和方法使用操作

Java的Map集合是存储键值对的一种数据结构。在Map中&#xff0c;每个键都是唯一的&#xff0c;用来标识该键值对。 Map接口是java.util包中的一部分&#xff0c;它有多个实现类&#xff0c;包括HashMap&#xff0c;TreeMap&#xff0c;LinkedHashMap等。 下面是Map接口的一些…

Docker的镜像和容器的区别

1 Docker镜像 假设Linux内核是第0层&#xff0c;那么无论怎么运行Docker&#xff0c;它都是运行于内核层之上的。这个Docker镜像&#xff0c;是一个只读的镜像&#xff0c;位于第1层&#xff0c;它不能被修改或不能保存状态。 一个Docker镜像可以构建于另一个Docker镜像之上&…

P2957

题目描述 The cows enjoy mooing at the barn because their moos echo back, although sometimes not completely. Bessie, ever the excellent secretary, has been recording the exact wording of the moo as it goes out and returns. She is curious as to just how mu…

numa网卡绑定

#概念 参考&#xff1a;https://www.jianshu.com/p/0f3b39a125eb(opens new window) chip&#xff1a;芯片&#xff0c;一个cpu芯片上可以包含多个cpu core&#xff0c;比如四核&#xff0c;表示一个chip里4个core。 socket&#xff1a;芯片插槽&#xff0c;颗&#xff0c;跟…

Sping Cloud Hystrix 参数配置、简单使用、DashBoard

Sping Cloud Hystrix 文章目录 Sping Cloud Hystrix一、Hystrix 服务降级二、Hystrix使用示例三、OpenFeign Hystrix四、Hystrix参数HystrixCommand.Setter核心参数Command PropertiesFallback降级配置Circuit Breaker 熔断器配置Metrix 健康统计配置Request Context 相关参数C…

Docker容器监控-CIG

目录 一、CIG说明 1. CAdvisor 2. InfluxDB 3. Grafana 二、环境搭建 1. 创建目录 2. 编写 docker-compose.yml 3. 检查并运行容器 三、进行测试 1. 查看 influxdb 存储服务 是否能正常访问 2. 查看 cAdvisor 收集服务能否正常访问 3. 查看 grafana 展现服务&#…

金融行业专题|证券超融合架构转型与场景探索合集(2023版)

更新内容 更新 SmartX 超融合在证券行业的覆盖范围、部署规模与应用场景。新增操作系统信创转型、Nutanix 国产化替代、网络与安全等场景实践。更多超融合金融核心生产业务场景实践&#xff0c;欢迎阅读文末电子书。 在金融行业如火如荼的数字化转型大潮中&#xff0c;传统架…

路由器如何映射端口映射?

在现代互联网中&#xff0c;随着网络应用的不断发展&#xff0c;很多用户需要进行远程访问或搭建服务器来满足自己的需求。由于网络安全的原因&#xff0c;直接将内网设备暴露在公网中是非常危险的。为了解决这个问题&#xff0c;路由器映射端口映射技术应运而生。本文将介绍什…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Span组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Span组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Span组件 鸿蒙&#xff08;HarmonyOS&#xff09;作为Text组件的子组件&#xff0…

C#基础-线程暂停方案之重置事件

默认情况下&#xff0c;一个线程的特定指令相对于另一个线程中的指令的执行时机是不确定的&#xff0c;如果想要对这种不确定性进行控制&#xff0c;其中一种办法就是使用重置事件&#xff08;虽然称为事件&#xff0c;但是跟C#的委托跟事件没关系&#xff09;。 重置事件用于…

uniapp 开发App 权限授权 js-sdk

从官网的插件市场下载的&#xff1a; 直接上代码&#xff1a; /*** 本模块封装了Android、iOS的应用权限判断、打开应用权限设置界面、以及位置系统服务是否开启*/var isIos // #ifdef APP-PLUS isIos (plus.os.name "iOS") // #endif// 判断推送权限是否开启 fu…

Excel VBA exit退出循环

Excel VBA exit退出循环 exit for退出for循环&#xff0c;exit do用于退出do 或 do while循环&#xff1a; 获取非空行 Function GetNotNullRow(ByVal iStartRow, ByRef iRow) Dim Rng As Range For Each Rng In Range(“B” & iStartRow & “:” & “P” & …

【开源】JAVA+Vue+SpringBoot实现公司货物订单管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 客户管理模块2.2 商品维护模块2.3 供应商管理模块2.4 订单管理模块 三、系统展示四、核心代码4.1 查询供应商信息4.2 新增商品信息4.3 查询客户信息4.4 新增订单信息4.5 添加跟进子订单 五、免责说明 一、摘要 1.1 项目…

微信小程序新手入门教程四:样式设计

WXSS (WeiXin Style Sheets)是一套样式语言&#xff0c;用于描述 WXML 的组件样式&#xff0c;决定了 WXML 的组件会怎么显示。 WXSS 具有 CSS 大部分特性&#xff0c;同时为了更适合开发微信小程序&#xff0c;WXSS 对 CSS 进行了扩充以及修改。与 CSS 相比&#xff0c;WXSS …

Tkinter教程21:Listbox列表框+OptionMenu选项菜单+Combobox下拉列表框控件的使用+绑定事件

------------★Tkinter系列教程★------------ Tkinter教程21&#xff1a;Listbox列表框OptionMenu选项菜单Combobox下拉列表框控件的使用绑定事件 Tkinter教程20&#xff1a;treeview树视图组件&#xff0c;表格数据的插入与表头排序 Python教程57&#xff1a;tkinter中如何…

Flink Format系列(2)-CSV

Flink的csv格式支持读和写csv格式的数据&#xff0c;只需要指定 format csv&#xff0c;下面以kafka为例。 CREATE TABLE user_behavior (user_id BIGINT,item_id BIGINT,category_id BIGINT,behavior STRING,ts TIMESTAMP(3) ) WITH (connector kafka,topic user_behavior…

Python中的权限控制

面向对象的三大特征&#xff1a; 1.封装&#xff1a;隐藏内部细节&#xff0c;对外提供操作方式。 权限控制&#xff1a;是通过对属性或方法添加单下划线、双下划线以及首尾下划线来实现 单下划线开头&#xff1a;以单下划线开头的属性或方法表示protected受保护的成员&…

GPT4_VS_ChatGPT(from_nytimes)

GPT4 VS ChatGPT&#xff08;from nytimes &#xff09; 正如文章官网博文&#xff1a;https://openai.com/research/gpt-4所述&#xff0c;GPT4仍有很多不足之处&#xff0c;还不及人类水平。纽约时报报道了一些人体验GPT4的效果和一些评价&#xff1a; Cade Metz 要求专家使…

什么是制动电阻器?工作及其应用

电梯、风力涡轮机、起重机、升降机和电力机车的速度控制是非常必要的。因此&#xff0c;制动电阻器是这些应用不可或缺的一部分&#xff0c;因为它们是电动机驱动器中最常用的高功率电阻器&#xff0c;用于控制其速度&#xff0c;在运输、海事和建筑等行业中。 电动火车主要比柴…