[防多开] 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 在第一个实例中搜索,依据打开关闭新的实例来筛选增加的值和减少的值,最后过滤出基地址。