【免杀前置课——Windows编程】二十三、内存管理—堆内存管理、虚拟内存管理、文件映射、共享内存、不依靠临界区限制文件多开、DLL注入

文章介绍了文件映射作为跨进程共享数据的机制,以及如何通过创建文件映射对象和映射到内存来操作文件。同时,展示了使用DLL注入,特别是远程线程注入的方法,来将DLL加载到目标进程中。文中还给出了一个限制程序多开的示例,通过共享内存区域来计数已打开的程序实例。
摘要由CSDN通过智能技术生成

文件映射

文件映射的概念:

文件映射(Mapping)是一种将文件内容映射到进程虚拟内存的技术。
映射成功的文件可以用视图,来引用这段内存,从而达到操作位于此段内存中的文件的目的。文件映射最大的一个特点–>可以在不同的进程间共享数据。(跨进程)

文件映射会直接在打开文件,加载进进程虚拟内存后创建文件映射对象,将其映射到内存,不需要重写回文件,会直接通过映射同步修改。
即先拿到文件句柄,创建Mapping对象,将Mapping对象文件映射到内存。
正常操作文件:
CreateFile–》文件句柄—》通过文件句柄将文件内容读到虚拟内存,修改内容,重写写入到文件。
文件映射:
CreateFile打开文件—》创建文件映射对象—》将文件映射到内存—》对内存的操作直接映射到文件当中
在这里插入图片描述

在这里插入图片描述

共享内存

***多个进程通过Mapping对象进行映射,映射到开辟的共享内存区中,**下例中的number就是被映射进内存的,所以可以在程序多开时通过映射对他进行操作,来判断多开与否。
在这里插入图片描述

在这里插入图片描述

文件多开限制新思路

#include<Windows.h>
#include<iostream>

int main()
{
	HANDLE hMapping = INVALID_HANDLE_VALUE;
	//判断是否存在名字叫FILE_MAPPING_DSD的句柄
	hMapping = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, "FILE_MAPPING_DSD");
	//若第一次打开则创建该对象
	if (hMapping==NULL)
	{
		//创建Mapping对象
		hMapping = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 4, "FILE_MAPPING_DSD");
	}
	
	//建立映射
	DWORD* number = (DWORD*)MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 4);
	if (*number >= 3)
	{
		MessageBox(0, L"程序打开超过了3个",L"提示", MB_OK);
		return 0;
	}
	*number += 1;
	printf("程序打开了%d个\n", *number);
	system("pause");
	*number -= 1;
	return 0;
}

在这里插入图片描述

在这里插入图片描述

DLL注入

DLL注入:
将一个不属于某进程的DLL文件加载到该进程当中,称之为DLL注入。Dl注入初衷是给第三方的应用程序进行一个功能的扩展。
DLL注入方式:
1、远程线程注入
2、消息钩子注入
3、劫持进程创建注入
4、注册表注入
5、Apc注入
6、ComRes注入
7、依赖可信进程注入
8、输入法注入

在这里插入图片描述

远程线程注入

写个dll文件先设置属性-配置属性-常规-配置类型
在这里插入图片描述

远程线程注入.exe

#include<Windows.h>

int main()
{
	//1、打开目标进程 如何让远程进程加载LoadLibrary中呢?
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE,27328);//27328为目标进程号
	//2、申请远程进程内存空间
	DWORD buffSize = strlen("d://test.dll")+1;
	char *str = (char*)VirtualAllocEx(hProcess, 0, buffSize, MEM_COMMIT, PAGE_READWRITE);
	//3、将dll文件路径写入内存
	DWORD realWrite = 0;
	BOOL bSuccess = WriteProcessMemory(hProcess, str, "d://test.dll", buffSize,&realWrite);
	//创建远程线程 LoadLibrary作为回调函数为KENER32.DLL的函数 一定会被加载且也是指针类型
	HANDLE hThread = CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, str, 0,0);
	//等待LoadLibrary显示调用成功
	WaitForSingleObject(hThread, -1);
	system("pause");
	VirtualFreeEx(hProcess, str, 0, MEM_RELEASE);
	CloseHandle(hThread);
	CloseHandle(hProcess);
	return 0;
}

test.dll

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

webfker from 0 to 1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值