dll注入原理分析

深入理解反射式dll注入技术 前言dll 注入技术是让某个进程主动加载指定的 dll 的技术。恶意软件为了提高隐蔽性,通常会使用 dll 注入技术将自身的恶意代码以 dll 的形式注入高可信进程。常规的 dll 注入技术使用 LoadLibraryA() 函数来使被注入进程加载指定的 dll。常规dll注入的方式一个致命的缺陷是需要恶意的 dll 以文件的形式存储在受害者主机上。这样使得常规 dll 注入技术在受害者主机上留下痕迹较大,很容易被 edr 等安全产品检测到。为了弥补这个缺陷,stephen fewer 提出了反射式 dll 阅读详情

获取目标进程的pid
获取目标进程的句柄
向目标进程写入注入dll的路径字符串
建立远程线程

// zhuru1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include <stdio.h> 
#include <Windows.h> 
#include <TlHelp32.h> 
//Code By Pnig0s1992 
//Date:2012,3,13 


DWORD getProcessHandle(LPCTSTR lpProcessName)//根据进程名查找进程PID 
{
	DWORD dwRet = 0;
	HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (hSnapShot == INVALID_HANDLE_VALUE)
	{
		printf("\n获得进程快照失败%d", GetLastError());
		return dwRet;
	}

	PROCESSENTRY32 pe32;//声明进程入口对象 
	pe32.dwSize = sizeof(PROCESSENTRY32);//填充进程入口对象大小 
	Process32First(hSnapShot, &pe32);//遍历进程列表 
	do
	{
		if (!lstrcmp(pe32.szExeFile, lpProcessName))//查找指定进程名的PID 
		{
			dwRet = pe32.th32ProcessID;
			break;
		}
	} while (Process32Next(hSnapShot, &pe32));
	CloseHandle(hSnapShot);
	return dwRet;//返回 
}

INT main(INT argc, CHAR * argv[])
{
	LPCTSTR aimProcess = L"Music_Player.exe";
	DWORD dwPid = getProcessHandle((LPCTSTR)aimProcess);//得到目标进程pid
	LPCSTR lpDllName = "E:\\c_project\\Dlltest\\Debug\\Dlltest.dll";
	HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, dwPid);//获取目标进程的句柄
	if (hProcess == NULL)
	{
		printf("\n获取进程句柄错误%d", GetLastError());
		return -1;
	}
	DWORD dwSize = strlen(lpDllName) + 1;
	DWORD dwHasWrite;
	LPVOID lpRemoteBuf = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);//获取目标进程的空间
	if (WriteProcessMemory(hProcess, lpRemoteBuf, lpDllName, dwSize, &dwHasWrite))//向目标进程空间写入注入dll的路径
	{
		if (dwHasWrite != dwSize)
		{
			VirtualFreeEx(hProcess, lpRemoteBuf, dwSize, MEM_COMMIT);
			CloseHandle(hProcess);
			return -1;
		}

	}
	else
	{
		printf("\n写入远程进程内存空间出错%d。", GetLastError());
		CloseHandle(hProcess);
		return -1;
	}

	DWORD dwNewThreadId;
	LPVOID lpLoadDll = LoadLibraryA;
	HANDLE hNewRemoteThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpLoadDll, lpRemoteBuf, 0, &dwNewThreadId);//在目标进程中创建远程线程
	if (hNewRemoteThread == NULL)
	{
		printf("\n建立远程线程失败%d", GetLastError());
		CloseHandle(hProcess);
		return -1;
	}

	WaitForSingleObject(hNewRemoteThread, INFINITE);//等待远程线程执行结束

	CloseHandle(hNewRemoteThread);//关闭远程线程

	//准备卸载之前注入的Dll 
	DWORD dwHandle, dwID;
	LPVOID pFunc = GetModuleHandleA;//获得在远程线程中被注入的Dll的句柄 
	HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, lpRemoteBuf, 0, &dwID);
	WaitForSingleObject(hThread, INFINITE);//等待远程线程执行结束
	GetExitCodeThread(hThread, &dwHandle);//线程的结束码即为Dll模块儿的句柄 
	CloseHandle(hThread);
	pFunc = FreeLibrary;
	hThread = CreateRemoteThread(hThread, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, (LPVOID)dwHandle, 0, &dwID); //将FreeLibraryA注入到远程线程中去卸载Dll 
	WaitForSingleObject(hThread, INFINITE);//等待远程线程执行结束
	CloseHandle(hThread);
	CloseHandle(hProcess);
	return 0;
}

问题一

每次当我先用ollydbg附加Music_Player.exe这个进程时,然后调试我们的注入程序,当执行到

在这里插入图片描述
OpenProcess返回NULL。
想到一个办法,先不用olly attach,等在目标进程中创建了远程线程后,我们在进行attach,于是乎陷入了死锁
ollydbg停在了 ntdll.ldrshutdownthread
在这里插入图片描述
注入程序停在了WaitForSingleObject(hNewRemoteThread, INFINITE);等待目标线程的结束
在这里插入图片描述
在询问过高人后发现是自己知识还存在很大的盲区。
ollydbg在attach目标进程后会将所有进程全部挂起
在这里插入图片描述
我们创建的远程线程也被挂起了,因为WaitForSingleObject(hNewRemoteThread, INFINITE),所以我们的注入程序会被阻塞
在这里插入图片描述
在这里插入图片描述
点击resume all threads,激活所有线程
在这里插入图片描述
程序正常运行

把dll模块注入到游戏进程的方法_远线程注入 远线程注入是指为要注入的目标进程创建一个远程线程,在远程线程里面加载要注入的目标dll。Windows操作系统提供了跨进程的内存读写机制,这就为各种注入打下了基础。 阅读详情

相关推荐

Reflective DLL Injection(字面翻译:反射dll注入)

      这两天把印度佬的metasploit视频看完了.带着印度口音的英语伤不起啊(请自己想象生活大爆炸里Rajesh),但是这个印度佬的口音特别重,-___-,脑海里久久回荡着印度腔英语......     为什么会提到Reflective DLL Injection,看Metasploit Unleashed,里面提到神器meterpreter和vnc injection都是利用这

GaA.Ra的自留地 in Csdn 9339

将注入进行到底之---------Windows挂钩实现Dll注入 汇编实现

这并不是什么新技术,但还是写下,方便新手入门., 废话不多说了,毕竟...., 开始吧!:我是以WH_KEYBOARD钩子来注入的,但我代码中仅用了系统自带的计算器来做实现,读者若想注入其它程序,只需把代码中的szWndName换成你想要注入的窗口名,因为只是测试,我只是简单地在用户点击注入按钮后,再按下键盘第一个按钮后,此时Dll便映射到目标进程地址空间中,在钩子回调函数中,我只是通过目标窗口句

life_still的专栏 1186

游戏外挂原理解析:逆向分析与DLL注入实战(植物大战僵尸

想深入了解游戏外挂的核心原理?本教程涵盖Cheat Engine(CE)修改数据、x64dbg逆向分析及Windows DLL注入等技术。通过《植物大战僵尸》实战演示,教你如何查找游戏基址、修改数值实现外挂功能,并掌握逆向工程的基础技能。适合对游戏修改、内存调试和破解技术感兴趣的学习者!

余识- 1948

Windows系统的dll注入

Windows系统的dll注入

m0_68937036的博客 2044

DLL注入技术与API拦截实战指南

动态链接库(DLL)是Windows操作系统中一种重要的模块,它允许程序共享代码和资源。DLL注入技术是一种高级技术,它允许我们将DLL强制加载到一个正在运行的进程的地址空间内。这一过程不仅涉及对操作系统底层的理解,还需要掌握进程管理和内存操作的知识。DLL注入技术的历史可以追溯到早期的Windows系统,当时被广泛用于扩展应用程序的功能和性能优化。随着时间的推移,这项技术被广泛应用于各种场景,包括但不限于游戏作弊、恶意软件攻击以及合法的系统级调试和软件开发。

weixin_42560991的博客 1062

C++实现DLL进程注入技术详解

在DLL项目中,导出符号允许其他程序使用DLL中定义的功能,而导入符号则允许DLL使用其他模块的功能。在Visual Studio中,有多种方法可以实现符号的导出和导入。一种常见的方法是使用和关键字。当代码被编译为DLL时,使用标记函数、变量或类等符号,以便它们可以被其他模块导入。当代码需要使用这些符号时,则使用来声明。另一种方法是使用模块定义文件(.def)。该文件列出所有需要导出的符号。在项目属性中,可以指定.def文件以简化导出过程。

weixin_26850469的博客 1451

DLL注入原理分析

所谓DLL注入就是将一个DLL放进某个进程的地址空间里,让它成为那个进程的一部分。要实现DLL注入,首先需要打开目标进程。 1、附加到目标/远程进程 hRemoteProcess = OpenProcess(PROCESS_CREATE_THREAD | //允许远程创建线程 PROCESS_VM_OPERATION | //允许远程VM操作 PROCESS_VM_WRITE, //允许...

顺其自然~专栏 3791

关于MOS管栅极和栅介质(氧化物)的材料选择

大概解释了高K材料作为栅介质的好处,以及为什么会带来好处,同时引出了金属栅的优点,总结了使用高K材料和金属栅的原因。

qq_52054477的博客 1万+

‌易语言DLL注入调试技巧:使用OllyDbg跟踪注入过程

OllyDbg是Windows平台下强大的32位汇编级调试器,特别适合用于DLL注入过程的跟踪分析。‌‌。

kkshdgxcjsd的博客 444

STM32F407通过SMBus协议精准读取BQ40Z50电池电量

本文详细介绍了STM32F407通过SMBus协议精准读取BQ40Z50电池电量的实现方法。从硬件连接到软件驱动开发,再到通信异常排查,提供了完整的解决方案。重点解析了SMBus协议的特殊时序要求、GPIO模拟驱动的关键代码,以及实际调试中的常见问题与对策,帮助开发者高效完成电池管理系统开发。

weixin_29189003的博客 253

想在瑞芯微RK3588上跑视频分类模型?避开3D卷积这个坑,试试这几种NPU友好的方案

本文探讨了在瑞芯微RK3588上部署视频分类模型时如何避开3D卷积的性能陷阱,提供了三种NPU友好的替代方案:MobileNetV2+GRU组合、Temporal Shift Module(TSM)和帧级池化。这些方案在保持较高准确率的同时,充分利用RKNPU的硬件加速能力,显著提升推理效率。文章还分享了从模型转换到部署优化的完整流程和实战经验。

weixin_28724319的博客 418

OllyDBG教程!

一、OllyDBG 的安装与配置OllyDBG 1.10 版的发布版本是个 ZIP 压缩包,只要解压到一个目录下,运行 OllyDBG.exe 就可以了。汉化版的发布版本是个 RAR 压缩包,同样只需解压到一个目录下运行 OllyDBG.exe 即可:screen.width*0.6) {this.width=screen.width*0.6;this.alt=此图已经缩小,点击察看原图。;}

yxyhack's blog 3万+

VASP计算层错能(SFE)全攻略2

本文介绍了使用VASP计算纯镍(Ni)层错能(SFE)的具体步骤。首先构建Ni的FCC单胞并扩展为超胞,通过修改原子位置引入堆垛层错;随后分别计算完美晶体和含层错结构的能量;最后通过能量差与层错面积之比求得SFE值。计算需注意k点网格、截断能和超胞尺寸的收敛性测试,并推荐使用PAW赝势和ASE等工具辅助结构构建。

weixin_50519490的博客 1986

DLL注入的术与道:分析攻击手法与检测规则

DLL 本质上是可供其他程序使用的函数和数据的集合,可将其视为虚拟公共资源,Windows运行的任何程序都会不断地调用动态链接库,以访问各种常见函数和数据。

2401_84466224的博客 1506

STM32+4G模块+MQTT协议:从零构建稳定可靠的物联网通讯链路

本文详细介绍了如何利用STM32、4G模块和MQTT协议构建稳定可靠的物联网通讯链路。通过硬件选型、AT指令配置和MQTT连接实战,帮助开发者实现低功耗、高可靠性的数据传输,特别适合户外和移动场景应用。

weixin_29191081的博客 334

给硬件工程师的UCIe软件配置入门:从寄存器表到实战调试,一篇讲透

本文为硬件工程师提供UCIe软件配置的全面指南,从寄存器表解析到实战调试技巧,涵盖链路训练、错误排查等关键环节。通过详细代码示例和分层诊断法,帮助工程师快速掌握UCIe寄存器访问机制,提升异构集成开发效率。

weixin_30268921的博客 313

C++ DLL注入原理以及示例

是一种技术,通过将外部的 DLL 文件强行加载到的地址空间中,使得外部代码可以执行。这种技术常用于修改或扩展应用程序的行为,甚至用于恶意攻击。

weixin_43354152的博客 1916

prplOS适配USB LAN网卡

本文介绍了将USB LAN网卡(如rndis0)适配到prplOS的LAN管理流程。

四儿家的小祖宗的博客 322

进程注入之DLL注入

前言DLL注入是我在大一的时候接触的一种技术,那时候还不懂,最近结合小程序详细的理解了一下。DLL注入是将代码注入到一个远程进程中,并让远程进程调用LoadLibrary()函数,从而强制远程进程加载一个DLL程序到进程中。而当DLL被加载时就会运行DLL中的DllMain()函数,所以就会为恶意代码的执行提供机会,而因为DLL本身是由感染后的进程加载的同时PE文件也并没有对系统进行过多的敏感操作...

bj5716的博客 1万+

[SoC]SoC验证中bootcode与firmware相关验证经验总结

本文总结了SoC验证中bootcode和firmware的验证经验。重点介绍了两种数据加载方法:1)使用Verilog系统函数$readmemh/$readmemb直接写入ROM/ARAM,需注意文件路径、格式和斜杠方向;2)通过Memory Hierarchy在initial块中操作,需要添加适当延时并注意路径拼接。文章还提供了在testcase phase中先读取数据到HASH再写入SRAM的示例,并强调加载后需使能edc_bypass以避免ECC错误。验证过程中需特别注意文件位置、格式要求及路径处理等

元直的博客 2498

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

记一次简单的dll注入

目录 第一章 DLL注入基本概念与原理 1.1 DLL 1.2 DLL注入 1.3DLL注入的实现方法 1.4DLL注入步骤 第二章 相关工具介绍 2.1 相关软件 2.1.1 ProcessExplorer 2.1.2 VC6.0 2.1.3 IDLE 2.2 相关API函数 2.2.1 OpenProcess(processthreadsapi.h) 2.2.2 VirtualAllocEx(memoryapi.h) 2.2.3 WriteProcess...

YANG12345_6的博客 1605

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

DLL注入的几种姿势(一):Windows Hooks

DLL注入的目的是将代码放进另一个进程的地址空间中,所以要怎样才能实现DLL注入呢? 其实在Windows中有好几种方法可以实现,这里我们首先尝试通过“SetWindowsHookEx”创建钩子(hooks)来实现。另外如果你对这方面很感兴趣,可以参考文章最底下的相关文献,这些文献包含大量的代码以及其他有用的信息。 WindowsHooks 首先我们需要理解Windows的hook机制和API函数SetWindowsHookEx。Hook机制允许应用程序截获处理窗口消息或特定事件。而钩子又可以分为..

翻肚鱼儿的博客 2078

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

本文详细介绍了如何在Windows系统下使用C++实现DLL注入技术。DLL注入的核心原理是通过强制目标进程加载指定的DLL文件,实现进程间通信或功能扩展。文章首先介绍了所需的资源,包括目标程序、注入器和待注入的DLL文件。接着,深入解析了DLL注入的核心流程,包括获取目标进程句柄、分配内存、写入DLL路径以及创建远程线程等步骤。文章还详细讲解了关键API函数的使用方法,如OpenProcess、VirtualAllocEx、WriteProcessMemory和CreateRemoteThread等。最后

曼岛_的博客 2033

Windows内核Dll注入(一)

近期在云桌面中遇到许多情况都需要对应用层程序的函数进行HOOK,并需要对函数参数进行各种修改,以便能够在虚拟桌面里面支持一些特性(尤其是一些3D的场景)。因此这里最主要的就是需要对HOOK的进程进行注入,来实现HOOK函数的功能。在早期开发中,就实现过DLL注入的功能,不过都是基于用户层的注入来实现的,例如有远线程注入,消息钩子注入,用户层OPE注入。HOOK注入的第一步是需要找到一个函数,这个函数可以确保所有的进程启动的时候都会被调用,这个函数就是。下面的文章主要是针对HOOK函数的注入,这个函数是。

xsinlink的博客 2004

《Windows核心编程》之“DLL注入”(一)

一、背景知识 1,Private Address Space         在Windows操作系统中,每个进程都有自己私有的地址空间(private address space)。各个进程的地址空间(user partition)是相互独立的,尽管它们的地址编码范围相同(0x00010000 ~ 0x7FFEFFFF),但是它们对应虚拟地址的后备物理存储器一般都不相同(只读模式下的Imag

Sagittarius_Warrior的博客 7841

逆向工程核心原理 Chapter24 | DLL卸载

逆向工程核心原理第24章学习记录

ULGANOY的博客 1338
上一篇: pwn题中 setbuf的用处
下一篇: shell脚本集合及学习笔记
Maxmalloc
博客等级 码龄8年 12粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值