[防多开] data_seg 共享内存


背景

pragma data_seg() 一般用在 dll 中,用来在不同进程间共享一段数据(两个进程对应不同的 exe ),如果是相同文件的多个进程间共享,就不需要 dll。

这里我们只做防多开功能,所以不需要 dll。

另外,这种防多开技术必须在程序关闭时将数据恢复,否则会出现逻辑错误。(恢复功能在代码中没有体现)。

代码实现

#include 
#include 
using namespace std;

#pragma data_seg("LYSM_shared")
INT instance_count = 0;
#pragma data_seg()
#pragma comment(linker, "/SECTION:LYSM_shared,RWS")

int main()
{
	
	instance_count++;
	cout << "instance counts : " << instance_count << endl;
	
	cout << "finished." << endl;
	getchar();
	return 0;
}

效果图

共享数据段在内存中的位置

因为它的本质是一个全局变量,所以一定是绿色的基地址。再者,因为它属于一个数据段,所以在 PE 的区段表里可以看到,数据的基地址就是该exe模块基地址(如果是dll 的话就是dll 的模块基地址)加上该区段的 virtual address。

验证方法

使用 ce 在第一个实例中搜索,依据打开关闭新的实例来筛选增加的值和减少的值,最后过滤出基地址。

相关