内存管理—堆
- 文件映射
- ***文件映射的概念:***
- 共享内存
- 文件多开限制新思路
- ```DLL注入```
- 远程线程注入
- 远程线程注入.exe
- test.dll
文件映射
文件映射的概念:
文件映射(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;
}