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


    许可协议: 文章中的代码均为学习时整理的笔记,博客中除去明确标注有参考文献的文章,其他文章【均为原创】作品,转载请务必【添加出处】,您添加出处是我创作的动力!
  • 相关阅读:
    双栈排序
    Koishi Loves Segments
    [USACO14FEB] Cow Decathlon 牛的十项全能
    [HNOI2016]网络
    koishi的数学题
    邦邦的大合唱站队
    #613(div2)
    Educational Codeforces Round 77
    #Hello 2020
    #601 (Div. 2)
  • 原文地址:https://www.cnblogs.com/LyShark/p/15019159.html
Copyright © 2011-2022 走看看