首页 > 其他分享 >远程线程注入 Dll

远程线程注入 Dll

时间:2024-09-02 21:03:43浏览次数:9  
标签:NULL 函数 Dll 线程 fileName hProcess 远程 注入

常用的线程注入方法有:远程线程注入、普通消息钩子注入、全局消息钩子注入、APC 应用层异步注入、ZwCreateThreadEx 强力注入纯汇编实现的线程注入等。

今天我们讲一下远程线程注入的这种方法,其原理是获取 LoadLibrary 系统函数的地址(我们知道系统函数的地址在每个进程中都是保持一致的,因此在我们自己进程中获取的系统函数地址同样适用于其他进程),通过调用 CreateRemoteThread 跨进程执行 LoadLibrary 将我们的 Dll 文件加载到目标地址空间内,实现注入。

step 1

首先我们需要打开目标进程,获取它的句柄:

HANDLE hProcess = NULL, hThread = NULL;
PSTR fileName = NULL;
FARPROC pfnThreadRtn = NULL;

// 打开注入进程,获取进程句柄
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Pid);
if (NULL == hProcess)
{
    printf("打开进程失败\r\n");
    return FALSE;
}

step 2

然后我们需要将 Dll 可执行文件的路径写入到目标地址空间内,否则在目标地址空间内调用 LoadLibrary 函数的时候找不到路径。

// 计算将注入 Dll 文件的完整路径长度
SIZE_T fileNameLen = strlen(DllName) + 1;

// 在目标空间申请一块长度为 fileNameLen 大小的内存空间
fileName = (PSTR)VirtualAllocEx(hProcess, NULL, fileNameLen, MEM_COMMIT, PAGE_READWRITE);
if (NULL == fileName)
{
    CloseHandle(hProcess);
    printf("在目标空间申请内存空间失败\r\n");
    return FALSE;
}

// 将 Dll 文件的完整路径写入目标进程申请的空间内
if (FALSE == WriteProcessMemory(hProcess, fileName, (PVOID)DllName, fileNameLen, NULL))
{
    VirtualFreeEx(hProcess, fileName, 0, MEM_RELEASE);
    CloseHandle(hProcess);
    printf("将完整路径写入目标进程空间失败\r\n");
    return FALSE;
}

step 3

将 Dll 路径写入到目标地址空间内后,我们需要获取 LoadLibrary 系统函数的地址:

// 在我们进程空间内获得 LoadLibrary 函数的地址
pfnThreadRtn = GetProcAddress(GetModuleHandle(L"Kernel32"), "LoadLibraryA");
if (NULL == pfnThreadRtn)
{
    VirtualFreeEx(hProcess, fileName, 0, MEM_RELEASE);
    CloseHandle(hProcess);
    printf("获取 LoadLibrary 函数地址失败\r\n");
    return FALSE;
}

step 4

此时,我们就可以注入 Dll 了,通过执行 CreateRemoteThread 函数,跨进程调用目标函数中的 LoadLibrary 函数加载我们的 Dll 并等待加载成功:

// 使用 CreateRemoteThread 创建远程线程,注入 Dll
hThread = CreateRemoteThread(hProcess, NULL, 1024, (LPTHREAD_START_ROUTINE)pfnThreadRtn,
    fileName, 0, NULL);

// 等待函数返回
WaitForSingleObject(hThread, INFINITE);
if (NULL != hThread)
{
    CloseHandle(hThread);
    CloseHandle(hProcess);
    VirtualFreeEx(hProcess, fileName, 0, MEM_RELEASE);
    return TRUE;
}

step 5

最后,在我们的主函数中调用即可:

int main()
{
	// 尽量指定绝对路径(相对路径不知道为啥不行),且必须使用反斜杠
	if (CreateRemoteThreadInjectDll(22212, "C:\\Users\\Administrator\\Desktop\\console_Dll.dll"))
	{
		printf("Dll 注入成功\r\n");
	}
	system("pause");

	return 0;
}

注入结果如下:

标签:NULL,函数,Dll,线程,fileName,hProcess,远程,注入
From: https://www.cnblogs.com/lostin9772/p/18393476

相关文章

  • java ThreadLocal做线程隔离
    `ThreadLocal`类提供了线程局部变量,每个线程都可以独立地访问自己的变量副本,而不会影响其他线程的副本。这在多线程环境中非常有用,可以避免线程间的数据共享和竞争条件,提高程序的线程安全性。###ThreadLocal的用法:1.**创建ThreadLocal对象**:首先需要创建一个`ThreadLocal`......
  • 浙江省建设人才远程继续教育平台刷课脚本-JavaScript编写
    脚本学习网站:https://zj.zjjsrc.cn/web/web_toUserSignUp.page脚本地址:浙江省建设人才远程继续教育平台刷课脚本:https://greasyfork.org/zh-CN/scripts/506406-浙江省住房和城乡建设行业专业技术人员继续教育-刷课脚本教程1.插件安装(以MicrosoftEdge浏览器为例)打开最中间......
  • Java线程生命周期:Java线程生命周期全景解读
    1.线程生命周期概述:不仅仅是状态转换在多线程编程中,理解线程的生命周期对于编写有效、高效的代码至关重要。线程生命周期通常描述了线程从创建到死亡的一系列状态变化过程,但其实不仅仅局限于这些状态的简单转换。线程生命周期的理解应该考虑系统资源的分配、线程调度、同步、通信......
  • Dll 可执行文件的编写与调用
    一、Dll可执行文件的编写首先我们需要在VS创建一个动态链接库(DLL)项目,然后会生成如下代码://dllmain.cpp:定义DLL应用程序的入口点。#include"pch.h"BOOLAPIENTRYDllMain(HMODULEhModule,//指向Dll模块的句柄DWORDul_reason_for......
  • 多线程的使用-->3
    1.死锁在线程同步过程中,因为多线程争抢锁资源,所以有些线程会执行,有些线程会等待。如果线程A和线程B分别需要X和Y两个锁资源恰好A获得了X资源,准备争抢Y,而B获得了Y资源,准备争抢X,此时A和B就进入了一中死锁状态。如何解决死锁问题?①从业务逻辑层面解决让它们随机抢资源......
  • 《鸣潮》游戏崩溃弹窗“错误代码[126]:加载xapofx1_5.dll失败”该怎么解决?鸣潮游戏闪
    在《鸣潮》游戏中,若出现崩溃弹窗“错误代码[126]:加载xapofx1_5.dll失败”,可尝试重新安装游戏运行所需的组件。检查系统环境是否完整,确保相关动态链接库文件正确安装,以解决此问题,顺利进行游戏。本篇将为大家带来《鸣潮》游戏崩溃弹窗“错误代码[126]:加载xapofx1_5.dll失败”该......
  • “由于找不到 acui23.dll 无法执行代码”专家级修复教程:详尽步骤助您重启应用程序
    当您尝试运行AutoCAD或其他依赖acui23.dll文件的应用程序时,可能会遇到“由于找不到acui23.dll无法执行代码”的错误提示。这通常意味着系统中缺少必要的动态链接库文件或存在兼容性问题。本文将详细解释这个问题的原因,并提供多种解决方法,帮助您顺利运行应用程序。acui2......
  • WinRM远程管理受阻?wsclient.dll缺失的诊断与修复全流程
    wsclient.dll是一个与Windows系统相关的动态链接库(DLL)文件,通常与Windows远程管理(WinRM)服务有关。WinRM服务允许远程访问和管理Windows系统,wsclient.dll可能包含了处理远程请求、资源管理和与其他系统组件交互等功能所需的函数和资源,对于确保远程管理功能的正常运行非常重要。......
  • hp1006pp.dll:HP打印机驱动的核心,受损后的修复指南
    hp1006pp.dll是一个与HP打印机相关的动态链接库(DLL)文件,通常与HPLaserJet1006等型号的打印机驱动程序的功能实现有关。这个DLL文件可能包含了处理打印作业、资源管理和与其他系统组件交互等功能所需的函数和资源,对于确保打印机驱动程序的正常运行非常重要。当hp1006pp.dll......
  • IDA反编译dll库时导入C++头文件
    引言有时候,可能因为硬盘损坏等等原因,自己曾经写的动态链接库源码丢失了,幸好对应的头文件得以保留了下来,这个动态链接库主要是某种算法的实现,并没有继承其他的一些类库,比如MFC之类的,而自己对算法的实现已经忘得差不多了,而突然又需要该算法的实现过程,那么有什么办法可以帮助......