Windows C++远程线程(CreateRemoteThread)注入DLL方法、代码示例。

2023-11-08

        使用远程线程CreateRemoteThread的方法可以在其他进程中注入自己想注入的DLL,千万不要用这个方法搞破坏哦。

        我们搞一个可以弹窗的DLL代码,让进程只要LOAD DLL就会弹窗。

        DLL代码:

#include <windows.h>

// DLL入口点函数
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        // 弹窗代码
        MessageBox(NULL, L"Hello from YourDLL!", L"DLL Injection", MB_OK | MB_ICONINFORMATION);
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

        被注入DLL的进程代码,这个可以随意写,只要程序能一直run就可以。:

#include<windows.h>
#include<iostream>
int main()
{
	while (1)
	{
		Sleep(1000 * 2);
		std::cout << "***\n" << std::endl;

	}

}

        接下来就是执行注入的代码:

        先说注入的步骤,这个有点复杂。

        1. 获得要注入进程的进程ID,可以使用进程名获得。

        2. 使用VirtualAllocEx api来在该进程内开辟一块内存,大小正好是DLL路径。

        3. 将DLL路径信息通过WriteProcessMemory 写入该进程空间。

        4. 获得kernal32在本进程的地址。因为同平台下所有exe都在同一位置加载kernal32。

        5. 在kernal32中获得LoadLibraryW的地址,此地址也是被注入进程的LoadLibraryW地址。

        6. 创建远程线程执行这个LoadLibraryW操作,参数就是要传入的DLL路径。

代码示例:

#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
#include <stdio.h>

// 获取目标进程ID
DWORD GetTargetProcessID(const TCHAR* targetProcessName)
{
    DWORD processID = 0;
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnapshot != INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32 processEntry;
        processEntry.dwSize = sizeof(PROCESSENTRY32);
        if (Process32First(hSnapshot, &processEntry))
        {
            do
            {
                if (_tcsicmp(processEntry.szExeFile, targetProcessName) == 0)
                {
                    processID = processEntry.th32ProcessID;
                    break;
                }
            } while (Process32Next(hSnapshot, &processEntry));
        }
        CloseHandle(hSnapshot);
    }
    return processID;
}

// 远程线程注入DLL
BOOL InjectDll(DWORD processID, const TCHAR* dllPath)
{
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);
    if (hProcess == NULL)
    {
        return FALSE;
    }

    LPVOID dllPathAddress = VirtualAllocEx(hProcess, NULL, _tcslen(dllPath) * sizeof(TCHAR), MEM_COMMIT, PAGE_READWRITE);
    if (dllPathAddress == NULL)
    {
        CloseHandle(hProcess);
        return FALSE;
    }

    SIZE_T bytesWritten;
    if (!WriteProcessMemory(hProcess, dllPathAddress, dllPath, _tcslen(dllPath) * sizeof(TCHAR), &bytesWritten))
    {
        VirtualFreeEx(hProcess, dllPathAddress, 0, MEM_RELEASE);
        CloseHandle(hProcess);
        return FALSE;
    }

    HMODULE kernel32Module = GetModuleHandle(_T("kernel32.dll"));
    LPTHREAD_START_ROUTINE loadLibraryFunction = (LPTHREAD_START_ROUTINE)GetProcAddress(kernel32Module, "LoadLibraryW");
    HANDLE hRemoteThread = CreateRemoteThread(hProcess, NULL, 0, loadLibraryFunction, dllPathAddress, 0, NULL);
    if (hRemoteThread == NULL)
    {
        VirtualFreeEx(hProcess, dllPathAddress, 0, MEM_RELEASE);
        CloseHandle(hProcess);
        return FALSE;
    }

    WaitForSingleObject(hRemoteThread, INFINITE);
    VirtualFreeEx(hProcess, dllPathAddress, 0, MEM_RELEASE);
    CloseHandle(hRemoteThread);
    CloseHandle(hProcess);
    return TRUE;
}

int main()
{
    const TCHAR* targetProcessName = _T("runTest.exe"); // 目标进程的名称
    const TCHAR* dllPath = _T("C:\\Users\\admin\\source\\repos\\DLLinject\\x64\\Debug\\DLLinject.dll"); // 自定义DLL的路径

    DWORD targetProcessID = GetTargetProcessID(targetProcessName);
    if (targetProcessID != 0)
    {
        if (InjectDll(targetProcessID, dllPath))
        {
            printf("DLL injected successfully.\n");
        }
        else
        {
            printf("Failed to inject DLL.\n");
        }
    }
    else
    {
        printf("Target process not found.\n");
    }

    return 0;
}

        执行结果:

 

        procxp查看dll已经在被注入的进程中了。

        还是那句话,不能用来搞破坏哦。这是盗版软件或者游戏外挂什么的经常使用的方式,在其他进程里搞一些自己的东西。听说原本CreateRemoteThread是微软为调试其他进程而创建的,同样的被别有用心的人给利用了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows C++远程线程(CreateRemoteThread)注入DLL方法、代码示例。 的相关文章

随机推荐

  • 进军微信第一步:接入微信JS-SDK

    前言 某天 接到这么一个需求 自定义微信网页分享出来的标题 描述和图标 以前没玩过这个 感觉应该很简单 动手了之后 躺过各种坑才知道并没那么容易 完全独立研究排错 感受颇多 分享出来给大家铺一铺路 一 需求来源 开发了一个移动端H5活动页面
  • LaTeX技巧189:LaTeX括号总结

    begin longtable l 1 你好啊 2 吃了没 end longtable 功能 语法 显示 不好看 frac 1 2 好一点 left frac 1 2 right 您可以使用 left和 right来显示不同的括号 功能 语
  • 在WPF中获取程序的专用工作集内存 PerformanceCounter

    使用 PerformanceCounter 获取程序的专用工作集内存并不难 但是就是得找一下属性 通过 CategoryName 遍历 InsanceName 再通过它们遍历 CounterName 之后通过这三个属性得到我们想要的内存 p
  • 数字电路设计之Leon系列处理器结构

    LEON处理器核心是一个与SPARCV8兼容的整数处理单元IU Integer Unit LEON2 是 5 级流水线 LEON3 是 7 级流水线 LEON 包含整数硬件乘法和除法单元 双协处理器 接口 FPU 浮点处理单元和Co pro
  • Python Web:绝对路径和相对路径

    Python Web篇学习汇总 Python Web 操作系统与虚拟机软件 Python Web 了解Ubuntu操作系统 Python Web Linux查看 切换目录命令 努力为大家更新Python web部分的内容 想看持续更新的记得
  • 电脑中常用的“扇区”、“簇”、“块”、“页”等概念

    先看百度百科对于磁盘簇的解释 扇区是磁盘最小的物理存储单元 但由于操作系统无法对数目众多的扇区进行寻址 所以操作系统就将相邻的扇区组合在一起 形成一个簇 然后再对簇进行管理 每个簇可以包括2 4 8 16 32或64个扇区 显然 簇是操作系
  • svg -> text文本水平、垂直居中。文本垂直对齐方式

  • Systemd 入门教程:实战篇

    本文转载至 http www ruanyifeng com blog 2016 03 systemd tutorial part two html 作者 阮一峰 日期 2016年3月 8日 上一篇文章 我介绍了 Systemd 的主要命令
  • 企业知识分享系统的设计与实现

    摘 要 随着信息技术和网络技术的飞速发展 人类已进入全新信息化时代 传统管理技术已无法高效 便捷地管理信息 为了迎合时代需求 优化管理效率 各种各样的管理系统应运而生 各行各业相继进入信息管理时代 企业知识分享系统就是信息时代变革中的产物之
  • 基于AI的4G/5G基站节能的智能解决方案

    随着移动通信网络建设规模逐年增加 通信设备对能源的需求与日俱增 移动通信网络的能耗在运营商的运营成本 OPEX Operating Expense 占比已高于15 经过5G试商用网络的测试验证 5G单站功耗是4G单站功耗的3 4倍 运营商面
  • 提示OpenGL版本过低怎么办

    OpenGL是一个可以加速2D和3D图形的图形库 在计算机显示技术中广泛使用 常用于游戏制作 建筑设计 医疗成像 科学数据可视化等领域 然而 当你尝试运行使用OpenGL的软件或游戏时 你可能会收到一个消息 OpenGL版本过低 请升级驱动
  • 易语言升级版火山软件开发平台现在很庞大了

    中文编程的魅力很吸引人 易语言时代就经常用它编编小程序 易语言最后是输出成vc6编译出来的效果一样 小而精 vc6毕竟是比较古老的技术 现在升级版火山软件开发平台已经能够比较耐用了 一个ide可以开发安卓和windows这2种应用 wind
  • BlueZ5.45 D-Bus总线 GATT API 分析

    笔者目前做linux系统下bluez蓝牙项目开发 发现网上关于bluez开发的资料很少 对于刚开始接触bluez蓝牙的开发人员来说是非常痛苦的 通过调试bluez源码自带的应用例子和文档说明 对BlueZ5 45 D Bus总线 GATT
  • 最大公约数GCD

    输入2个正整数A B 求A与B的最大公约数 Input2个数A B 中间用空格隔开 1 lt A B lt 10 9 Output输出A与B的最大公约数 Sample Input 30 105 Sample Output 15 includ
  • 对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。

    对于长度为5位的一个01串 每一位都可能是0或1 一共有32种可能 它们的前几个是 00000 00001 00010 00011 00100 请按从小到大的顺序输出这32种01串 输入格式 本试题没有输入 输出格式 输出32行 按从小到大
  • Unity3D中三种调用其他脚本函数的方法

    第一种 被调用脚本函数为static类型 调用时直接用 脚本名 函数名 第二种 GameObject Find 脚本所在的物体的名字 SendMessage 函数名 能调用public和private类型函数 第三种 GameObject
  • 14-矩阵相乘及其运算法则

    矩阵与向量的乘法 在这一篇文章中我们就将基于上一篇重新审视矩阵的这个视点来理解矩阵的乘法 那么在这一篇 我们主要来看一下矩阵和向量的乘法 这里这个线性方程组是上一小节给大家举的模拟的一个非常简单的小型经济系统的例子 我们可以把这个经济系统其
  • 细说业务逻辑(后篇)

    细说业务逻辑 后篇 作者 EricZhang T2噬菌体 来源 博客园 时间 2009 11 01 阅读 295 次 原文链接 收藏 前篇 http kb cnblogs com page 50470 3 业务逻辑的架构模式及实现 Mart
  • Unity3d之Animation(动画系统)

    Unity3d之Animation 动画系统 原创 2016年04月30日 18 15 17 标签 unity3d 动画 Animation 20914 1 动画系统配置 2 代码控制动画 原文地址 http blog csdn net d
  • Windows C++远程线程(CreateRemoteThread)注入DLL方法、代码示例。

    使用远程线程CreateRemoteThread的方法可以在其他进程中注入自己想注入的DLL 千万不要用这个方法搞破坏哦 我们搞一个可以弹窗的DLL代码 让进程只要LOAD DLL就会弹窗 DLL代码 include