• [防多开] data_seg 共享内存


    背景

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

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

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

    代码实现

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


    许可协议: 文章中的代码均为学习时整理的笔记,博客中除去明确标注有参考文献的文章,其他文章【均为原创】作品,转载请务必【添加出处】,您添加出处是我创作的动力!
  • 相关阅读:
    多态实现--虚函数与纯虚函数
    CentOS6编译安装gcc高版本
    Linux多进程CS服务器简单测试
    Linux单用户CS模型TCP通讯完全注释手册
    进程线程及其状态
    Java学习-字符串、字符、ASCII、数字的互相转换
    Java学习-素数
    Java学习-日期
    Java学习-多态
    Java学习-练习
  • 原文地址:https://www.cnblogs.com/LyShark/p/15019159.html
Copyright © 2020-2023  润新知