Cocos2d-x单机游戏防八门神器修改数据
来源:http://cocos2d.9tech.cn/news/2014/0212/39812.html
网上的cocos2d-x教程多为知识点的讲解,但我们学习cocos2d-x的目的是为了什么?为了做出游戏来!这篇文章的前提是单机游戏,网络游戏有自己的加密方法,与单机游戏不尽相同!
游戏辛辛苦苦的做完了,但是使用八门神器可以轻松的修改你的重要数据(金币,道具数量),哈哈哈,那么恭喜您,您挣不到一分钱!说的有点危言耸听了,毕竟知道八门神器这个工具的不是非常多,而且使用条件比较苛刻,但是我们不能掉以轻心,他完全可以修改完成了,将存档放在网上,这样我们就十分被动了!
一.什么是八门神器
不明白八门神器为何物的请自行Google!这里我引用百度百科中的一段话:
八门神器是安卓、iOS、塞班平台上通用的游戏修改工具,可以修改内存中的数值和参数,达到修改游戏HP、MP、金钱、等级等的作用。八门神器类似 于PC平台的金山游侠等游戏修改器,是手机游戏中的金手指。但八门神器在安卓平台下需要Root权限才能正常工作,在iOS平台下需要iPhone越狱才 能正常工作,并且支持中、英双语言,并且自带帮助说明。
建议大家还是亲自去使用下这个工具,效果请看下图:
二.原理
知己知彼百战百胜,我们要先了解八门神器的原理:
在游戏运行时,内存和处理器都会对于游戏进行非常复杂的数据交换和变更,这是因为游戏有很多的数据,例如金钱、HP值、等级、攻击力、防御力等数 据,而这些数据,就在内存和处理器的各个地址当中,玩家只需要在八门神器中搜索相关的数据值,八门神器就会将搜索出记录此数据的各个地址显示,玩家进行多 次的数据变更后再次搜索,到最后就会确定此地址到底是哪一个,然后将此地址的数值进行修改,回到游戏中,相关的数据也会变化!总结下,就是八门神器会搜索出对应数值的内存地址,然后改变内存地址对应的值!
三.应对方案
这样我们貌似可以从两个方面去入手解决这个问题:
- 让它搜不着!
- 让它改变不了!但是仔细想想,一旦它拿到了你的变量的地址,还愁改变不了吗?所以我们只能从让它搜不着这个角度去考虑!
用过这个工具的人都明白,一般情况下,一次搜索就能准确定位内存地址的情况非常少见(除非这个数字非常大),都是先搜索,获得大量(几十万)的数据,然后回到游戏中,改变这个值,再回到八门神器,会自动筛选出之前搜索到的结果有哪些改变了...直到只剩下几个结果,这个时候我们挨个去改变值会变得十分的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 { public: DynamicInt(){m_pValue=NULL;} ~DynamicInt() { if
{ delete
} } int return
void { if
{ delete
} m_pValue= new
*m_pValue=nValue; } private: int }; |
经过尝试,这个方法并不管用,还能被破解,不知我的做法错误呢还是八门神器的原理不是这样!请懂行人指出!
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 #define template<class class { public: CEncryptValue() : { } ~CEncryptValue() { } T { return
} void { m_Value m_EncryptKey m_Value } void { setValue(getValue() } public: T int }; typedef typedef typedef #endif |
使用时:
1
2
3
4
5
6
7
8
9
10
|
CDynamicValueInt //设置金钱数 m_DynamicMoney.setValue(1000); //得到金钱 m_DynamicMoney.getValue() //改变金钱 m_DynamicMoney.offset(-100); |
这个方法经过测试,十分管用!也是我目前采取的方案!大家可以直接拿来使用!
最新文章
- 【译】更快的方式实现PHP数组去重
- .NET设计模式(1):1.1 单例模式(Singleton Pattern)
- php操作mysql数据库
- 5分钟 wamp下php phpmaile发送qq邮件 2015最新方法说明
- Kerberos认证流程详解
- FJ省队集训DAY3 T2
- PostgreSQL的存储系统二:REDOLOG文件存储结构二
- AngularJS 学习笔记值post传值
- C#使用AutoMapper6.2.2.0进行对象映射
- [Luogu 1559]运动员最佳匹配问题
- [SQL]SQL 执行顺序
- MySQL数据库使用规范
- Java 存储时间戳的几种方式
- Windows10 VS2017 C++ Server Socket简单服务器端与客户端
- sql 查询重复数据,删除重复数据,过滤重复数据
- 关于no matching key exchange method found. Their offer: diffie-hellman-group1-sha1的解决办法
- vue写后台管理系统问题概述和解决方案
- SpringMVC使用@ResponseBody时返回json的日期格式及可能产生的问题
- WMRouter:美团外卖Android开源路由框架
- jsp 小记
热门文章
- php里的declare用法
- Java反射基本玩法
- 【转】 [C/OC的那点事儿]NSMutableArray排序的三种实现(依赖学生成绩管理系统).
- for-in遍历json数据
- PHP String函数分类
- mysql的data数据库只有.frm 而.myd和.myi没有,使用正常
- linux -- 串口调试总结
- 嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误
- 利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用
- jQuery插件开发的模式和结构