[cocos2dx]防止八门神器修改内存数据

网上的cocos2d-x教程多为知识点的讲解,但我们学习cocos2d-x的目的是为了什么?为了做出游戏来!这篇文章的前提是单机游戏,网络游戏有自己的加密方法,与单机游戏不尽相同!

游戏辛辛苦苦的做完了,但是使用八门神器可以轻松的修改你的重要数据(金币,道具数量),哈哈哈,那么恭喜您,您挣不到一分钱!说的有点危言耸听了,毕竟知道八门神器这个工具的不是非常多,而且使用条件比较苛刻,但是我们不能掉以轻心,他完全可以修改完成了,将存档放在网上,这样我们就十分被动了!

一.什么是八门神器

不明白八门神器为何物的请自行Google!这里我引用百度百科中的一段话:

八门神器是安卓、iOS、塞班平台上通用的游戏修改工具,可以修改内存中的数值和参数,达到修改游戏HP、MP、金钱、等级等的作用。八门神器类似 于PC平台的金山游侠等游戏修改器,是手机游戏中的金手指。但八门神器在安卓平台下需要Root权限才能正常工作,在iOS平台下需要iPhone越狱才 能正常工作,并且支持中、英双语言,并且自带帮助说明。

建议大家还是亲自去使用下这个工具,效果请看下图:

二.原理

知己知彼百战百胜,我们要先了解八门神器的原理:

在游戏运行时,内存和处理器都会对于游戏进行非常复杂的数据交换和变更,这是因为游戏有很多的数据,例如金钱、HP值、等级、攻击力、防御力等数 据,而这些数据,就在内存和处理器的各个地址当中,玩家只需要在八门神器中搜索相关的数据值,八门神器就会将搜索出记录此数据的各个地址显示,玩家进行多 次的数据变更后再次搜索,到最后就会确定此地址到底是哪一个,然后将此地址的数值进行修改,回到游戏中,相关的数据也会变化!总结下,就是八门神器会搜索出对应数值的内存地址,然后改变内存地址对应的值!

三.应对方案

这样我们貌似可以从两个方面去入手解决这个问题:

  1. 让它搜不着!
  2. 让它改变不了!但是仔细想想,一旦它拿到了你的变量的地址,还愁改变不了吗?所以我们只能从让它搜不着这个角度去考虑!

用过这个工具的人都明白,一般情况下,一次搜索就能准确定位内存地址的情况非常少见(除非这个数字非常大),都是先搜索,获得大量(几十万)的数据,然后回到游戏中,改变这个值,再回到八门神器,会自动筛选出之前搜索到的结果有哪些改变了...直到只剩下几个结果,这个时候我们挨个去改变值会变得十分的Easy!

1.改变内存地址

想想这个过程,好像只有第一次搜索是全局搜索,后面的每次搜索都是在之前搜索的结果上进行筛选!这样如果我们游戏中每次改变这个变量的时都去改变这个变量的内存地址,这样它就搜索不到了!代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

class
DynamicInt

{

public:

    DynamicInt(){m_pValue=NULL;}

 

    ~DynamicInt()

    {

        if(m_pValue)

        {

            deletem_pValue;

        }

    }

 

    int
getValue(){
return*m_pValue;}

 

    void
setValue(int nValue)

    {

        if(m_pValue)

        {

            deletem_pValue;

        }

        m_pValue=newint();

        *m_pValue=nValue;

    }

private:

    int
* m_pValue;

};

经过尝试,这个方法并不管用,还能被破解,不知我的做法错误呢还是八门神器的原理不是这样!请懂行人指出!

2.加密数据

换个思路,我们为何不在数据上做手脚,对数据进行加密(如:表面上显示的是50,内部存的却是50^0xff),这样他搜索表面上的数字当然搜索不到!代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

#ifndef
_H_DYNAMICVALUE_H_

#define
_H_DYNAMICVALUE_H_

 

template<class
T>

class
CEncryptValue

{

public:

    CEncryptValue()

        :
m_Value(0)

    {

    }

    ~CEncryptValue()

    {

    }

 

    T
getValue()

    {

        returnm_Value
^ m_EncryptKey;

    }

 

    void
setValue(T value)

    {

        m_Value
= value;

        m_EncryptKey
= rand();

        m_Value
^= m_EncryptKey;

    }

 

    void
offset(T value)

    {

        setValue(getValue()
+ value);

    }

 

public:

    T
m_Value;

    int
m_EncryptKey;

};

 

typedef
CEncryptValue<int> CDynamicValueInt;

typedef
CEncryptValue<float> CDynamicValueFloat;

typedef
CEncryptValue<bool> CDynamicValueBool;

 

#endif

使用时:


1

2

3

4

5

6

7

8

9

10

CDynamicValueInt
m_DynamicMoney;

 

//设置金钱数

m_DynamicMoney.setValue(1000);

 

//得到金钱

m_DynamicMoney.getValue()

 

//改变金钱

m_DynamicMoney.offset(-100);

这个方法经过测试,十分管用!也是我目前采取的方案!大家可以直接拿来使用!

时间: 2024-10-29 13:58:11

[cocos2dx]防止八门神器修改内存数据的相关文章

c#中用windows api函数修改内存数据

这个问题来自伴水的<划拳机器人>,对本文用途感兴趣的朋友请大致阅读伴水的帖子,在帖子中我用这个方法写了剪刀五号,战绩不错,当然属于作弊的方法了. 剪刀五号的思路就是每次出拳,尽量让对方能赢,然后根据一个地址段来扫描内存中对方所赢的局数的保存地址,找到后在得到比赛结果时把内存数据改掉.这个类似以前打单机游戏时用的fpe之类的修改工具.当然,如果对方故意犯规,一局也不赢,你是找不到他的地址的,这样可以通过正常途径来获取胜利. 把剪刀五号核心代码简化后,主要为三个api函数 OpenProcess,

修改内存数据相关问题(急)

问题描述 请问如何编程代替WinHex修改第一项PhysicalMemory某地址的16进制数据,需要用到哪些API,我知道如何修改指定进程的内存数据,但是按Alt+F9打开列表后选择第一个的PhysicalMemory是什么意思,它是整个物理内存吗?要如何指定修改这块内存的数据呢?十分着急,请达人指教,谢谢.

c-如何修改正在运行中程序的内存数据

问题描述 如何修改正在运行中程序的内存数据 就拿最原始的HelloWorld程序来说,如果我加入一个循环输出(作为程序A),让它每秒输出1次helloworld,我再写个程序B,如何让正在运行的程序A的输出变成"111111111"呢? 解决方案 http://www.tuicool.com/articles/Ij2Yfyhttp://blog.csdn.net/shifters/article/details/6750353 解决方案二: 用WriteProcessMemory可以修

防止工具(八门神器)进行内存修改的方法

http://www.eoeandroid.com/home.php?mod=space&uid=1297371&do=blog&id=48170 Android内存修改器有很多.拿其中的比较出名的八门神器来说,该应用通过修改正在运行的游戏的内存数据,可以非常方便地修改游戏的HP.MP.生命数等等参数.辛辛苦苦开发的游戏或应用被修改器一修改就悲催了.下面就通过一个demo来讲下,怎么通过多数据关联来保护应用的重要数据不被修改.<<<安卓APP破解技术有哪些?如何防

修改内存-汇编中使用debug更改内存中的内容问题

问题描述 汇编中使用debug更改内存中的内容问题 为了学习汇编,我经常使用debug中的指令修改主板内存中存的数据,我想问的是,我这样总是修改联系的话会不会使电脑内存出现问题呢?有牛人说虽然我们经常修改的是那些可以修改的内存内容,但是有的机器甚至连主板ROOM内容都能修改,这样练习练习岂不是我们很有可能将来得换一块主板?哈哈,不知道我说的哪里有问题,请大神指教!谢谢 我是在虚拟机中安装操作系统,在用debug修改内存内容的,也不知道这样做是不是会影响虚拟机中的系统的正常性能,反正是不会影响原本

linux编程-关于linux内存 数据段和bss段的疑惑???

问题描述 关于linux内存 数据段和bss段的疑惑??? 数据段和bss段分别存放 已初始化/未初始化 的全局变量和静态变量. 那么,假如bss段的全局变量和静态变量在代码执行中被初始化了,那么会不会被转移到 数据段存储呢??? 解决方案 首先我觉得你所说的在执行中被初始化的说法是不正确的,应该叫赋值. 接下来我们看一段代码: #include <stdio.h> int a; int b=10; int c=11; int main(void) { int d; int e=12; ret

海岛奇兵钻石辅助软件八门神器怎么快速刷钻

1.首先下载<海岛奇兵>八门神器钻石辅助软件. 2.安装辅助软件,打开软件之后再打开海岛奇兵游戏. 3.使用辅助软件开始搜索海岛奇兵的钻石信息. 如果发现有多条信息显示,那么你可以暂停搜素,然后故意让自己在战斗中挂掉,然后再开启辅助软件的搜索.这个时候搜索到的信息基本就是只有一条啦. 4.最后修改钻石的数量. 小伙伴一定要悠着来,不要太狠了,以免被发现之后封号.

windbg 修改内存和寄存器指令

顺手记一记.呵呵 修改寄存器命令 r @eax=1  //将eax置为1 修改内存命令ed 80505648 00001234 //将内存为80505648的数据改为00001234

ASP.NET中如何实现同一时间只有一人能够修改系统数据

asp.net|数据 有些特殊的系统中,要求同一时间,只能有一个人能够修改系统数据,这时其他人修改数据时,处于"锁"的状态,只有修改数据的人退出时其他人才可进行修改操作. 我们通过设置一个全局开关变量(Application),当第一个用户修改数据时,将该变量至为一个表示锁状态的值(例如LOCK),其他用户要修改数据前,检查是否能够修改,通常一下几种情况将该修改权释放(将变量置为UNLOCK)1.修改数据的用户退出系统2.修改数据的用户长时间不操作3.修改数据的用户关闭IE 第一种情况