进程间通信——DLL共享节
DLL共享节技术可以让使用同一个DLL的多个进程共享一块内存(共享节),下面我通过一个项目来演示使用方法。
首先准备一个受害者程序,我选用了xp的扫雷,您也可以用任意喜欢的程序。
然后,编写DLL,DLL中需要设置共享节,然后在本项目中,DLL被注入到扫雷进程,然后循环打印共享节中的数据,这个数据可以被控制程序修改。
下面是DLL代码,g_buffer就是共享节的数据。
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "framework.h"#pragma data_seg("Shared")
char g_buffer[0x1000] = {0};
#pragma data_seg()
#pragma comment(linker,"/section:Shared,rws")extern "C" __declspec(dllexport) void SetData(char *buf, DWORD dwDataLen)
{ZeroMemory(g_buffer, 0x1000);memcpy(g_buffer, buf, dwDataLen);
}extern "C" __declspec(dllexport) void GetData(char *buf)
{ memcpy(buf, g_buffer, 0x1000);
}BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:{// 区分是目标进程(游戏)还是控制进程(WG)// 如果是扫雷进程(winmine.exe)则开始接收数据char szModule[MAX_PATH] = { 0 };GetModuleFileNameA(NULL, szModule, MAX_PATH);if (strstr(szModule, "winmine") != NULL){ MessageBoxA(NULL, "扫雷程序注入DLL成功", "", MB_OK);while (1){if (strcmp(g_buffer, "quit") == 0) break; // 控制程序给的退出信号MessageBoxA(NULL, g_buffer, szModule, MB_OK);}}break;}case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;
}
然后是控制端代码,就是不停的修改共享节的数据而已。。
#define _CRT_SECURE_NO_WARNINGS
#include <Windows.h>
#include <stdio.h>BOOL InjectDLL();
BOOL EnableDebugPrivilege();int main()
{if (FALSE == InjectDLL()){printf("注入DLL失败\n");return -1;}else{printf("注入DLL成功\n");}HMODULE hModule = LoadLibraryA("DLLShareSection-DLL.dll");if (hModule == NULL){printf("获取DLL句柄失败\n");return -1;}typedef void (*PFNSETDATA)(char *, DWORD);typedef void (*PFNGETDATA)(char *);PFNSETDATA pFnSetData = (PFNSETDATA)GetProcAddress(hModule, "SetData");PFNGETDATA pFnGetData = (PFNGETDATA)GetProcAddress(hModule, "GetData");char szBuffer[0x1000]; while (1){printf("输入要发送的数据: ");ZeroMemory(szBuffer, 0x1000);scanf("%s", szBuffer);pFnSetData(szBuffer, strlen(szBuffer));//pFnGetData(szBuffer);//printf("修改数据成功,当前数据: %s\n", szBuffer);if (strcmp(szBuffer, "quit") == 0) break;}return 0;
}// 远程线程注入
BOOL InjectDLL()
{// 提权(win10)EnableDebugPrivilege();// 根据窗口名获取进程句柄HWND hWnd = FindWindowA(NULL, "扫雷");if (hWnd == NULL){printf("获取窗口句柄失败\n");return FALSE;}DWORD dwPid = -1;GetWindowThreadProcessId(hWnd, &dwPid);HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);if (hProcess == INVALID_HANDLE_VALUE){printf("打开进程失败\n");return FALSE;}// 在要注入的进程中申请一块内存,作为LoadLibrary的参数char szDllName[MAX_PATH] = "DLLShareSection-DLL.dll";LPVOID pAddress = VirtualAllocEx(hProcess, NULL, MAX_PATH, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);WriteProcessMemory(hProcess, pAddress, szDllName, strlen(szDllName), NULL);// 创建远程线程,线程入口设置为LoadLibrary,这样就可以自动加载dllHANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, pAddress, 0, NULL); //VirtualFreeEx(hProcess, pAddress, 0, MEM_RELEASE);CloseHandle(hProcess);return TRUE;
}// 提权函数:提升为DEBUG权限
BOOL EnableDebugPrivilege()
{HANDLE hToken;BOOL fOk = FALSE;if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)){TOKEN_PRIVILEGES tp;tp.PrivilegeCount = 1;LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);fOk = (GetLastError() == ERROR_SUCCESS);CloseHandle(hToken);}return fOk;
}
运行结果
注意要把扫雷,控制端程序和DLL放在相同目录下运行
先启动扫雷,在启动控制程序。
在控制台输入数据,修改共享节的缓冲区内容,对话框打印的内容就会变。
进程间通信——DLL共享节相关推荐
- linux动态链接库全局变量共享问题DLL共享数据段
Linux写时拷贝技术(copy-on-write) 进程间是相互独立的,其实完全可以看成A.B两个进程各自有一份单独的liba.so和libb.so,相应的动态库的代码段和数据段都是各个进程各自有一 ...
- Linux进程间通信(七)---共享内存之shmget()、shmat()、shmdt()及其基础实验
/********************************************************************* * 2019年6月26日声明:本博客资源下载积分最开始为免 ...
- [转]Linux 进程间通信:共享内存
(上) 级别: 初级 郑彦兴 (mlinux@163.com), 国防科大攻读博士学位 2003 年 5 月 01 日 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式.两个不同进程A.B ...
- VC 利用DLL共享区间在进程间共享数据及进程间广播消息
在进程间共享数据有很多种方法,剪贴板,映射文件等都可以实现,这里介绍用 DLL 的共享区间在进程间共享数据,及共享数据有变化时及时的反馈给各相关进程. 一.在DLL中设置共享区间 在DLL中是用数据段 ...
- 32查运行内存的map文件_Linux进程间通信——内存共享映射
一.概念 什么是内存共享映射? 将磁盘文件的一部分直接映射到内存中 共享内存,就是两个或多个进程都可以访问的同一块内存空间,一个进程对这块空间内容的修改可为其他参与通信的进程所看到的 映射种类 共享映 ...
- python进程共享内存_Python进程间通信之共享内存
前一篇博客说了怎样通过命名管道实现进程间通信,但是要在windows是使用命名管道,需要使用python调研windows api,太麻烦,于是想到是不是可以通过共享内存的方式来实现.查了一下,Pyt ...
- Linux进程间通信——使用共享内存
下面将讲解进程间通信的另一种方式,使用共享内存. 一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式 ...
- 【Linux系统编程】进程间通信之共享内存
00. 目录 文章目录 00. 目录 01. 共享内存概述 02. 共享内存函数 2.1 创建共享内存 2.2 共享内存映射 2.3 共享内存解除映射 2.4 共享内存操作函数 03. 案例实战 04 ...
- 进程间通信:共享内存概念及代码
前言 接下讨论的IPC机制,它们最初由System V版本的Unix引入.由于这些机制都出现在同一个版本中并且有着相似的编程接口,所以它们被称为System V IPC机制.接下来的内容包括: 信号量 ...
最新文章
- IBM: 拆分瘦身,还有机会吗?
- Castle IOC容器实践之EnterpriseLibrary Configuration Facility
- windows下Pycharm中安装Pygame
- Java集合中的排序API分析
- 0074 几道面试题
- Spark入门(十一)之排序
- 大数据之-Hadoop伪分布式_配置文件说明---大数据之hadoop工作笔记0029
- Leading and Trailing LightOJ - 1282
- equals方法 和 ==的区别
- ArcGIS下载在线地图影像上篇(手工版)
- 【爱思考】CISP考试基本介绍
- 基本的核方法和径向基函数简介
- 30字的完美个人简历
- 单片机学习笔记(数码管)
- python画风羽及风羽定义
- javascript数组
- 程序员孔乙己!一个愤世嫉俗,脱离低级趣味的人!
- HM编码器代码阅读(14)——帧间预测之AMVP模式(二)predInterSearch函数
- matlab pwm整流仿真
- 3B大战续集,你亲谁?
热门文章
- github 删除分支_Github新手入门指南
- 成功解决AttributeError: module tensorflow has no attribute reset_default_graph
- Python语言学习:python编程之pip命令集合、python调式、头部代码、代码运行等常见概念详细攻略(解决问题为导向)
- DL之ShuffleNet:ShuffleNet算法的架构详解
- 成功解决 cl: 命令行 error D8021 :无效的数值参数“/Wno-cpp” 和 cl: 命令行 error D8021 :无效的数值参数“/Wno-unused-function”
- 成功解决ValueError: Parameter values for parameter (max_depth) need to be a sequence.
- stm32f103zet6实现HTTP协议请求,UTF-8转码JSON打包上传
- 8.图片组件和动画效果--从零起步实现基于Html5的WEB设计器Jquery插件(含源码)...
- 老王Python-进阶篇4-面向对象第三节
- java基础之冒泡排序