三个模块

1,game.exe,三个方法,控制台输入指令('A','B','R')分别控制三个方法的调用;

2,WGDll.dll,要注入到game进程中的dll文件;

3,myconsole.exe,用来注入dll文件的程序;

先开启game进程,然后用myconsole把dll注入到game,dll模块和myconsole模块利用共享内存实现进程通信,在myconsole的控制台输入指令,dllmokuai接受指令,调用game模块的方法,达到控制game的目的

game模块

#include<stdio.h>

void attack()
{
printf("**********attack**********");
return;
}
void rest()
{
printf("**********rest**********\n");
return;
}
void blood()
{
printf("**********blood**********\n");
return;
} int main()
{
char orderChar;
printf("**********GAME BEGIN**********\n");
while ()
{
orderChar = getchar();
switch (orderChar)
{
case 'A':
attack();
break;
case 'R':
rest();
break;
case 'B':
blood();
break;
case 'Q':
printf("**********GAME OVER**********\n");
return ;
}
} return ;
}

dll模块

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include<Windows.h>
#include<iostream>
#include<stdio.h>
using namespace std; #define _MAP_ TEXT("gameDll") #define ATTACK 0x0641740
#define REST 0x0641800
#define BLOOD 0x06417a0 HANDLE hMapFile;
LPTSTR lpBuffer;
TCHAR dwType; DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, _MAP_);
if (!hMapFile)
{
printf("OpenMappingFile Error : %d", GetLastError());
return ;
}
lpBuffer = (LPTSTR)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, , , BUFSIZ);
for (;;)
{
Sleep();
if (lpBuffer != NULL)
{
// CopyMemory(&dwType, lpBuffer, 4);
wmemcpy_s(&dwType, , lpBuffer, );
wcout << lpBuffer << endl;
}
if (dwType == L'A')
{
//MessageBox(NULL, TEXT("AAAAA"), TEXT("AAAAA"), MB_OK);
__asm
{
mov eax, ATTACK
call eax
}
//dwType = 0;
//CopyMemory(lpBuffer, &dwType, 4);
}
if (dwType == L'B')
{
//MessageBox(NULL, TEXT("BBBBBB"), TEXT("BBBBBBB"), MB_OK);
__asm
{
mov eax, BLOOD
call eax
}
//dwType = 0;
//CopyMemory(lpBuffer, &dwType, 4);
}
if (dwType == L'R')
{
//MessageBox(NULL, TEXT("RRRRRRR"), TEXT("RRRRRRR"), MB_OK);
__asm
{
mov eax, REST
call eax
}
//dwType = 0;
//CopyMemory(lpBuffer, &dwType, 4);
}
if (dwType == L'Q')
{
//MessageBox(NULL, TEXT("QQQQQQQ"), TEXT("QQQQQQ"), MB_OK);
UnmapViewOfFile(lpBuffer);
}
}
return ;
} BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
MessageBox(NULL, TEXT("hehe"), TEXT("HAHA"), MB_OKCANCEL);
CreateThread(NULL, , (LPTHREAD_START_ROUTINE)ThreadProc, NULL, , NULL);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

myconsole模块

#include<Windows.h>
#include<stdio.h>
#include<Tlhelp32.h>
#include <iostream>
#include<stdlib.h>
using namespace std; #define _MAP_ TEXT("gameDll") HANDLE hFileMapping;
LPTSTR lpBuffer;
BOOL init()
{ hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, , 0x1000, _MAP_);
if (hFileMapping==NULL)
{
printf("create filemapping failed error : %d", GetLastError());
return FALSE;
}
lpBuffer = (LPTSTR)MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, , , BUFSIZ);
if (lpBuffer==NULL)
{
printf("create filemappingview failed error : %d", GetLastError());
return FALSE;
}
return TRUE;
} DWORD GetPid(const TCHAR* pDest)
{
HANDLE hProcessHandle;
PROCESSENTRY32 pe32 = {}; hProcessHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,);
if (hProcessHandle == INVALID_HANDLE_VALUE)
{
return FALSE;
}
pe32.dwSize = sizeof(PROCESSENTRY32);
//const TCHAR* pDest = TEXT("game.exe");
while (Process32Next(hProcessHandle,&pe32))
{
//printf("%s\n", pe32.szExeFile);
if (wcscmp(pe32.szExeFile,pDest)==)
{
CloseHandle(hProcessHandle);
return pe32.th32ProcessID;
wcout << pe32.szExeFile << ":" << pe32.th32ProcessID << endl;
} }
return ; } BOOL LoadDll(DWORD pID,const TCHAR* pName)
{
HANDLE hDestProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID); DWORD pLEN = sizeof(WCHAR)*wcslen(pName)+;
LPVOID lpStart = VirtualAllocEx(hDestProcess, NULL, pLEN, MEM_COMMIT, PAGE_READWRITE);
BOOL bRET = WriteProcessMemory(hDestProcess, lpStart, pName, pLEN, NULL);
if (!bRET)
{
cout << "writeprocessmemory failed error : %d" << GetLastError() << endl;
CloseHandle(hDestProcess);
return FALSE;
}
HMODULE hModule = GetModuleHandle(TEXT("Kernel32.dll"));
if (!hModule)
{
cout << "get kernel32 failed error :" << GetLastError() << endl;
CloseHandle(hDestProcess);
return FALSE;
}
DWORD f = (DWORD)GetProcAddress(hModule, "LoadLibraryW");
if (!f)
{
cout << "get loadLibraryA failed error :" << GetLastError() << endl;
CloseHandle(hDestProcess);
CloseHandle(hModule);
return FALSE;
}
CreateRemoteThread(hDestProcess,NULL,, (LPTHREAD_START_ROUTINE)f,lpStart,NULL,NULL);
CloseHandle(hDestProcess);
CloseHandle(hModule);
return TRUE;
} int main()
{
init(); const TCHAR* pName = TEXT("game.exe");
DWORD pid = GetPid(pName);
wcout << pid << endl;
TCHAR DLLNAME[] = TEXT("D:\\vs-workspace\\WGDll\\Debug\\WGDll.dll");
TCHAR* DNAME = DLLNAME;
BOOL fl = LoadDll(pid, DNAME);
if (fl)
{
cout << "haha" << endl;
} TCHAR gameCmd[] = { L'A',L'B',L'R' };
TCHAR tempp;
int randnum = ;
for (;;)
{
randnum = rand()%;
tempp = gameCmd[randnum];
wcout << tempp << endl;
CopyMemory(lpBuffer, &tempp,);
wmemcpy_s(lpBuffer, , &tempp, );
Sleep();
}
getchar();
return ;
}

Windows进程通信-共享内存空间的更多相关文章

  1. Windows进程通信 -- 共享内存(1)

    共享内存的方式原理就是将一份物理内存映射到不同进程各自的虚拟地址空间上,这样每个进程都可以读取同一份数据,从而实现进程通信.因为是通过内存操作实现通信,因此是一种最高效的数据交换方法. 共享内存在 W ...

  2. Windows进程通信 -- 共享内存

    享内存的方式原理就是将一份物理内存映射到不同进程各自的虚拟地址空间上,这样每个进程都可以读取同一份数据,从而实现进程通信.因为是通过内存操作实现通信,因此是一种最高效的数据交换方法. 共享内存在 Wi ...

  3. Windows进程间共享内存通信实例

    Windows进程间共享内存通信实例 抄抄补补整出来 采用内存映射文件实现WIN32进程间的通讯:Windows中的内存映射文件的机制为我们高效地操作文件提供了一种途径,它允许我们在WIN32进程中保 ...

  4. Linux学习笔记(14)-进程通信|共享内存

    在Linux中,共享内存是允许两个不相关的进程访问同一个逻辑内存的进程间通信方法,是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式. 不同进程之间共享的内存通常安排为同一段物理内存.进程可 ...

  5. Windows中利用共享内存来实现不同进程间的通信

    Windows中利用共享内存来实现不同进程间的通信 一.msdn详细介绍 https://docs.microsoft.com/zh-cn/windows/win32/memory/sharing-f ...

  6. C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案

    C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...

  7. linux 两个进程通过 共享内存 通信例子

    例子1:两个进程通过共享内存通信,一个进程向共享内存中写入数据,另一个进程从共享内存中读出数据 文件1 创建进程1,实现功能,打印共享内存中的数据 #include <stdio.h> # ...

  8. C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转

    原文:C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing ...

  9. 【VS开发】内存映射文件进程间共享内存

    内存映射文件进程间共享内存 内存映射文件的另一个功能是在进程间共享数据,它提供了不同进程共享内存的一个有效且简单的方法.后面的许多例子都要用到共享内存.共享内存主要是通过映射机制实现的.Windows ...

随机推荐

  1. 洛谷 P2925 [USACO08DEC]干草出售Hay For Sale

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P2925 这是一道简单的01背包问题,但是按照正常的01背包来做会TLE一个点,所以要加一个特判(见代 ...

  2. [ DLPytorch ] word2vec&词嵌入

    word2vec WordEmbedding 对词汇进行多维度的描述,形成一个密集的矩阵.这样每两个词之间的相似性可以通过进行内积的大小体现出来.越大说明距离越远,则越不相似. Analogies(类 ...

  3. leetcode菜鸡斗智斗勇系列(7)--- 用最小的时间访问所有的节点

    1.原题: https://leetcode.com/problems/minimum-time-visiting-all-points/ On a plane there are n points ...

  4. LeetCode 19. Remove Nth Node From End of List(删除链表中倒数第N个节点)

    题意:删除链表中倒数第N个节点. 法一:递归.每次统计当前链表长度,如果等于N,则return head -> next,即删除倒数第N个节点:否则的话,问题转化为子问题“对head->n ...

  5. Duilib 修改程序exe、在任务栏以及任务管理器上的图标

    参考:https://blog.csdn.net/Rongbo_J/article/details/47379997       https://www.cnblogs.com/happinessda ...

  6. windows下svn post-commit的实现

    前言: 好的!在结束了上一博客教程的Subversion安装之后.我们开始了下一项工作,windows版本下 svn post-commit的实现.说实话,这方面的知识网上的知识并不是很多~~~~~~ ...

  7. 【PAT甲级】1028 List Sorting (25 分)

    题意: 输入一个正整数N(<=100000)和C(C属于{1,2,3}),接下来输入N行,每行包括学生的六位学号(习惯用string输入,因为可能有前导零),名字和成绩(正整数).输出排序后的信 ...

  8. 如何启动mac版docker自带的k8s

    最近准备好好学习下k8s,为了图方便,直接使用docker集成的k8s,但是网上找了一些教程但都没能一次性成功,只好自己从头跑一遍,顺手写个教程可以方便有类似需求的同学参考. 话不多说,直接上步骤. ...

  9. STM32 的系统滴答定时器( Systick) 彻底研究解读

    作者:王健 前言 SysTick 比起那些 TIM 定时器可以说简单多啦~~~~~哥的心情也好了不少, 嘎嘎!! ARM Cortex-M3 内核的处理器内部包含了一个 SysTick 定时器,它是一 ...

  10. 5(计算机网络)从物理层到MAC层

    故事就从我的大学宿舍开始讲起吧.作为一个八零后,我要暴露年龄了. 我们宿舍四个人,大一的时候学校不让上网,不给开通网络.但是,宿舍有一个人比较有钱,率先买了一台电脑.那买了电脑干什么呢? 首先,有单机 ...