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

广州做网站信科分公司新浪博客 搬家 wordpress 工具

广州做网站信科分公司,新浪博客 搬家 wordpress 工具,如何学编程入门教程,网络网站建设[逆向工程]C实现DLL注入:原理、实现与防御全解析(二十五) 引言 DLL注入(DLL Injection)是Windows系统下实现进程间通信、功能扩展、监控调试的核心技术之一。本文将从原理分析、代码实现、实战调试到防御方案&#x…

[逆向工程]C++实现DLL注入:原理、实现与防御全解析(二十五)

引言

DLL注入(DLL Injection)是Windows系统下实现进程间通信、功能扩展、监控调试的核心技术之一。本文将从原理分析、代码实现、实战调试到防御方案,全方位讲解如何用C++实现DLL注入,并提供可直接编译的完整项目代码。

一、资源准备

1.资源准备

gmp.exe 被注入的程序

injector.exe 注入器

mandaohook.dll 需注入的dll

2.任务目标

将编写好的mandaohook.dll通过injector.exe注入器注入到gmp.exe可运行程序中。gmp.exe是一个密码学工具箱。

二、DLL注入的核心原理

DLL注入的本质是强制目标进程加载指定的DLL文件,其核心流程为:

  1. 获取目标进程句柄:通过进程ID或进程名定位目标
  2. 在目标进程中分配内存:用于存储DLL路径
  3. 写入DLL路径:将DLL的完整路径写入目标内存
  4. 创建远程线程:通过LoadLibrary加载DLL

三、关键API函数解析

API函数作用描述关键参数说明
OpenProcess打开目标进程dwProcessId:目标进程ID
VirtualAllocEx在目标进程分配内存lpAddress:分配内存地址
WriteProcessMemory向目标内存写入数据lpBaseAddress:目标内存地址
CreateRemoteThread在目标进程创建远程线程lpStartAddress:线程入口点
GetProcAddress获取LoadLibrary函数地址lpProcName:函数名

四、完整C++实现代码

1. 注入器代码(Injector.cpp)
#include <Windows.h>
#include <TlHelp32.h>
#include <iostream>
#include <memory>// 自动释放资源模板
template<typename T>
struct HandleDeleter {void operator()(T* handle) const {if (handle) CloseHandle(handle);}
};
using UniqueHandle = std::unique_ptr<void, HandleDeleter<void>>;// 查找进程ID(优化版)
DWORD FindProcessId(const wchar_t* processName) {PROCESSENTRY32W pe = { sizeof(pe) };UniqueHandle snapshot(CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0));if (!snapshot.get()) return 0;if (Process32FirstW(snapshot.get(), &pe)) {do {if (_wcsicmp(processName, pe.szExeFile) == 0) {return pe.th32ProcessID;}} while (Process32NextW(snapshot.get(), &pe));}return 0;
}// 注入主函数
int main() {// 1. 查找进程const DWORD pid = FindProcessId(L"gmp.exe");if (!pid) {std::wcerr << L"错误:未找到进程!" << std::endl;return EXIT_FAILURE;}// 2. 打开进程UniqueHandle hProcess(OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION |PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ,FALSE, pid));if (!hProcess) {std::wcerr << L"打开进程失败(代码:" << GetLastError() << L")" << std::endl;return EXIT_FAILURE;}// 3. 获取DLL路径wchar_t dllPath[MAX_PATH];if (!GetFullPathNameW(L"mandaohook.dll", MAX_PATH, dllPath, nullptr)) {std::wcerr << L"获取路径失败(代码:" << GetLastError() << L")" << std::endl;return EXIT_FAILURE;}// 4. 分配内存const size_t pathSize = (wcslen(dllPath) + 1) * sizeof(wchar_t);UniqueHandle pRemoteMem(VirtualAllocEx(hProcess.get(), nullptr, pathSize, MEM_COMMIT, PAGE_READWRITE));if (!pRemoteMem) {std::wcerr << L"内存分配失败(代码:" << GetLastError() << L")" << std::endl;return EXIT_FAILURE;}// 5. 写入路径if (!WriteProcessMemory(hProcess.get(), pRemoteMem.get(), dllPath, pathSize, nullptr)) {std::wcerr << L"写入内存失败(代码:" << GetLastError() << L")" << std::endl;return EXIT_FAILURE;}// 6. 获取LoadLibrary地址const auto pLoadLibrary = reinterpret_cast<LPTHREAD_START_ROUTINE>(GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "LoadLibraryW"));if (!pLoadLibrary) {std::wcerr << L"获取函数地址失败(代码:" << GetLastError() << L")" << std::endl;return EXIT_FAILURE;}// 7. 创建远程线程UniqueHandle hThread(CreateRemoteThread(hProcess.get(), nullptr, 0,pLoadLibrary, pRemoteMem.get(), 0, nullptr));if (!hThread) {std::wcerr << L"创建线程失败(代码:" << GetLastError() << L")" << std::endl;return EXIT_FAILURE;}// 8. 等待注入完成WaitForSingleObject(hThread.get(), INFINITE);std::wcout << L"注入成功!" << std::endl;return EXIT_SUCCESS; 
}

编译:

g++ -shared -o mandaohook.dll mandaohook.cpp -luser32 -lgdi32 -Wall

在这里插入图片描述

2.目标DLL头文件(mandaohook.h)
#pragma once
#include <Windows.h>LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam);
3. 目标DLL代码(mandaohook.cpp)
/*********************** myhook.cpp ***********************/
#include "mandaohook.h"// 全局变量
HHOOK g_hHook = NULL;
HWND g_hNotepadppWnd = NULL;// 前向声明线程函数
DWORD WINAPI ThreadProc(LPVOID lpParameter);//-----------------------------------------------------------------------------
// DLL入口函数
//-----------------------------------------------------------------------------
BOOL APIENTRY DllMain(HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:// 创建线程避免阻塞DllMainCreateThread(nullptr, 0, ThreadProc, hModule, 0, nullptr);break;case DLL_PROCESS_DETACH:if (g_hHook) {UnhookWindowsHookEx(g_hHook);g_hHook = nullptr;}break;}return TRUE;
}// 线程处理函数
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{HMODULE hModule = (HMODULE)lpParameter;// 使用 OutputDebugStringW 输出调试信息OutputDebugStringW(L"DLL成功注入gmp.exe!");MessageBoxW(nullptr, L"DLL成功注入gmp.exe!", L"提示", MB_OK);g_hNotepadppWnd = FindWindowExW(nullptr, nullptr, L"gmp.exe", nullptr);if (g_hNotepadppWnd) {g_hHook = SetWindowsHookExW(WH_KEYBOARD_LL,HookProc,hModule,0);}return 0;
}//-----------------------------------------------------------------------------
// 钩子处理函数
//-----------------------------------------------------------------------------
LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam)
{if (code == HC_ACTION) {const auto* pKbd = reinterpret_cast<KBDLLHOOKSTRUCT*>(lParam);if (pKbd->vkCode == VK_F12 && (pKbd->flags & LLKHF_UP)) {MessageBoxW(g_hNotepadppWnd, L"安全提示:F12功能已被拦截!", L"安全防护", MB_ICONWARNING | MB_OK);return 1;}}return CallNextHookEx(g_hHook, code, wParam, lParam);
}

编译:

g++ -shared -o mandaohook.dll mandaohook.cpp -luser32 -lwininet -Wall -municode

在这里插入图片描述

五、测试结果

gmp.exe injector.exe mandaohook.dll放入同一个文件夹下:

在这里插入图片描述

1.先打开gmp.exe 工具

2.再打开DebugView

3.执行injector.exe 注入器注入

4.查看注入信息

可以先查看下gmp.exe PID
在这里插入图片描述
在这里插入图片描述

查看DebugView已注入。

六、技术难点与解决方案

1. 权限问题
  • 症状OpenProcess返回ERROR_ACCESS_DENIED
  • 解决:以管理员权限运行注入器
  • 代码实现
    #include <ShellAPI.h>
    ShellExecuteW(nullptr, L"runas", L"Injector.exe", nullptr, nullptr, SW_SHOW);
    
2. 路径转换问题
  • 症状:DLL路径包含中文字符导致写入失败
  • 解决:使用宽字符API并验证路径
    if (!PathFileExistsW(dllPath)) {// 处理路径不存在的情况
    }
    
3. 64/32位进程兼容
  • 症状:跨架构注入失败(如64位注入器操作32位进程)
  • 解决:使用Wow64DisableWow64FsRedirection
    PVOID oldValue = nullptr;
    Wow64DisableWow64FsRedirection(&oldValue);
    // 执行文件操作
    Wow64RevertWow64FsRedirection(oldValue);
    

七、防御DLL注入方案

  1. 进程保护:调用SetProcessMitigationPolicy
    PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY policy = {};
    policy.MicrosoftSignedOnly = 1;
    SetProcessMitigationPolicy(ProcessSignaturePolicy, &policy, sizeof(policy));
    
  2. 钩子检测:定期检查LoadLibrary调用栈
  3. 内存保护:启用DEP和ASLR
    #pragma comment(linker, "/DYNAMICBASE:YES")
    #pragma comment(linker, "/NXCOMPAT")
    

八、实战调试技巧

  1. 调试输出:使用OutputDebugStringW
    OutputDebugStringW(L"[DEBUG] DLL已加载");
    
  2. 日志文件:写入临时文件监控行为
    FILE* f = _wfopen(L"C:\\inject_log.txt", L"a+");
    fwprintf(f, L"PID:%d 已注入\n", GetCurrentProcessId());
    fclose(f);
    
  3. Process Monitor:监控进程的DLL加载事件

如果本教程对您有帮助,请点赞❤️收藏⭐关注支持!欢迎在评论区留言交流技术细节!


文章转载自:

http://sYzYDr0Z.LxwgL.cn
http://I0QSBpjL.LxwgL.cn
http://0P7ZtsoA.LxwgL.cn
http://M6jgimbD.LxwgL.cn
http://CUgJG3CZ.LxwgL.cn
http://N0zrwjqN.LxwgL.cn
http://0y19YlXT.LxwgL.cn
http://wg1e8D1c.LxwgL.cn
http://mIjXx1jm.LxwgL.cn
http://DbTrrJqw.LxwgL.cn
http://8qppccV5.LxwgL.cn
http://3jI0nd5c.LxwgL.cn
http://g0nittUl.LxwgL.cn
http://MFMqCJTf.LxwgL.cn
http://2t6ZmngK.LxwgL.cn
http://QtLaRqPW.LxwgL.cn
http://8TjXSHFi.LxwgL.cn
http://1AYSu9KM.LxwgL.cn
http://7kQY374J.LxwgL.cn
http://VfpfPRZ9.LxwgL.cn
http://X0hzyYY4.LxwgL.cn
http://mYIUUJUp.LxwgL.cn
http://4R2YMHo6.LxwgL.cn
http://aJF0dYPO.LxwgL.cn
http://UmM0Cjhf.LxwgL.cn
http://ZBF4GDif.LxwgL.cn
http://5gqAFAL0.LxwgL.cn
http://ywIGw5wR.LxwgL.cn
http://X8nNmCwY.LxwgL.cn
http://Jofq8rb9.LxwgL.cn
http://www.dtcms.com/wzjs/735894.html

相关文章:

  • 仿xss网站搭建徐州手机网站制作公司哪家好
  • 优服优科网站建设公司微信免费下载2023新版
  • 网站开发业务方向架构文档wordpress 物流主题
  • 做网站的风险陕西专业做网站
  • 东莞搭建网站要多少钱东莞长安网站建设
  • 北京网站备案代理wordpress企业中文模板
  • 小说网站制作丹东网站网站建设
  • 网站站长英文网站开发 性能方面
  • 花瓣设计网站官网入口昆明网站建设企业
  • 做网站一个程序员够吗毕业设计实在不会怎么办
  • 山西网站开发如何把网站主关键词做到百度首页
  • 网站会员功能介绍海安网站建设
  • 网站想换空间影视广告创意拍摄
  • 网站搭建设计课程报告天津怎么建立企业网站
  • 做网站好还是阿里巴巴好网页定制哪家不错
  • 九州建网站素材网站下载
  • 如何使用记事本做网站网页前端框架
  • 微信网站设计最好的建设网站
  • 九江市住房和城乡建设厅网站化妆品网站设计方案
  • 百度广告商seo外包公司如何优化
  • 网站建设代理商电话专业的网站建设公
  • 手机版网站开发用什么语言长春自助建站模板
  • 北京seo诊断商丘网站建设优化推广
  • 网站建设岗位有哪些婚恋网站建设
  • 公司网站注册要多少钱手机app软件开发软件
  • 怎样更新网站网络工程是干啥的
  • 连云港 网站设计企业网站在ps里做吗
  • 微信里我的微站是怎么弄的网站推广营销方案
  • 云端智能建站系统注册公司什么名字大气
  • 色目人seo顾问服