逆向中共享内存的应用

共享内存,这个词相信大家多多少少有所耳闻。来看一下百科给我们的解释:

共享内存指 (shared memory)在多处理器的计算机系统中,

可以被不同中央处理器(CPU)访问的大容量内存。由于多个CPU需要快速访问存储器,

这样就要对存储器进行缓存(Cache)。

任何一个缓存的数据被更新后,由于其他处理器也可能要存取,

共享内存就需要立即更新,否则不同的处理器可能用到不同的数据。

共享内存是 Unix下的多进程之间的通信方法 ,这种方法通常用于一个程序的多进程间通信,

实际上多个程序间也可以通过共享内存来传递信息。

百科的回答比较官方,那么实际运用中,共享内存可以用来做什么?

详细举个例子:

某游戏助手(如TGP/wagame),读取英雄名称或者类型,推荐最佳出装/技能方案,

在单开游戏的情况下,自然用不到共享内存,而往往单开满足不了玩家需求。

如大多数DNF玩家都是通过wagame或者其他助手进行双开同步刷图,

这个时候想要给两个客户端同时下达相同的指令,即可用共享内存实现。

流程如下(设想):

wagame 申请共享内存

客户端1消息循环读取共享内存中的指令

客户端2消息循环读取共享内存中的指令

同步按键指令。

这个时候,如果关闭申请共享内存的程序(wagame平台),那么客户端1和2都将无法访问这一块内存区域。

以易语言为例子:

先以申请并写入内存为例:

1、CreateFileMapping申请一个文件映射内核对象,返回值为映射对象的句柄。

2、MapViewOfFile 将文件映射对象映射到当前应用程序的地址空间,返回值为内存区域指针。

3、将要写入的数据转化为字节集的形式,并且取得字节集长度。

4、在内存区域指针+4的位置开始写入指定的数据。

5、UnmapViewOfFile停止当前程序的内存映射。

CreateFileMapping函数原型
在这里插入图片描述
MapViewOfFile函数原型
在这里插入图片描述
UnmapViewOfFile函数
在这里插入图片描述
易代码如下图:
在这里插入图片描述
完成了写入内存数据代码后,还要实现读取写入数据的代码,

那么应该如何实现读取共享内存中的数据?

1、OpenFileMapping 通过内存名称打开共享内存。

2、同上,MapViewOfFile 将文件映射对象映射到当前应用程序的地址空间,返回值为内存区域指针。

3、将MapViewOfFile所返回的内存区域指针转换为字节集,

用到易语言函数——指针到字节集。

4、取得该内存区域的字节集长度,并在区域指针+4的位置开始读取。

5、UnmapViewOfFile停止当前程序的内存映射。

OpenFileMapping函数原型
在这里插入图片描述
代码如下图:
在这里插入图片描述
以字节集的形式读出了共享内存中的内存数据,就可以给他转换为各种数据类型,

文件,或者图片应用程序等等。

转换数据类型如下图:
在这里插入图片描述
实际运用效果图如下:

程序1写入内存数据

程序2、3、4、5读取。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

douluo998

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

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

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

打赏作者

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

抵扣说明:

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

余额充值