您好,登錄后才能下訂單哦!
網(wǎng)上的cocos2d-x教程多為知識(shí)點(diǎn)的講解,但我們學(xué)習(xí)cocos2d-x的目的是為了什么?為了做出游戲來(lái)!這篇文章的前提是單機(jī)游戲,網(wǎng)絡(luò)游戲有自己的加密方法,與單機(jī)游戲不盡相同!
游戲辛辛苦苦的做完了,但是使用八門神器可以輕松的修改你的重要數(shù)據(jù)(金幣,道具數(shù)量),哈哈哈,那么恭喜您,您掙不到一分錢!說(shuō)的有點(diǎn)危言聳聽(tīng)了,畢竟知道八門神器這個(gè)工具的不是非常多,而且使用條件比較苛刻,但是我們不能掉以輕心,他完全可以修改完成了,將存檔放在網(wǎng)上,這樣我們就十分被動(dòng)了!
一.什么是八門神器
不明白八門神器為何物的請(qǐng)自行Google!這里我引用百度百科中的一段話:
八門神器是安卓、iOS、塞班平臺(tái)上通用的游戲修改工具,可以修改內(nèi)存中的數(shù)值和參數(shù),達(dá)到修改游戲HP、MP、金錢、等級(jí)等的作用。八門神器類似 于PC平臺(tái)的金山游俠等游戲修改器,是手機(jī)游戲中的金手指。但八門神器在安卓平臺(tái)下需要Root權(quán)限才能正常工作,在iOS平臺(tái)下需要iPhone越獄才 能正常工作,并且支持中、英雙語(yǔ)言,并且自帶幫助說(shuō)明。
建議大家還是親自去使用下這個(gè)工具,效果請(qǐng)看下圖:
二.原理
知己知彼百戰(zhàn)百勝,我們要先了解八門神器的原理:
在游戲運(yùn)行時(shí),內(nèi)存和處理器都會(huì)對(duì)于游戲進(jìn)行非常復(fù)雜的數(shù)據(jù)交換和變更,這是因?yàn)橛螒蛴泻芏嗟臄?shù)據(jù),例如金錢、HP值、等級(jí)、***力、防御力等數(shù) 據(jù),而這些數(shù)據(jù),就在內(nèi)存和處理器的各個(gè)地址當(dāng)中,玩家只需要在八門神器中搜索相關(guān)的數(shù)據(jù)值,八門神器就會(huì)將搜索出記錄此數(shù)據(jù)的各個(gè)地址顯示,玩家進(jìn)行多 次的數(shù)據(jù)變更后再次搜索,到最后就會(huì)確定此地址到底是哪一個(gè),然后將此地址的數(shù)值進(jìn)行修改,回到游戲中,相關(guān)的數(shù)據(jù)也會(huì)變化!總結(jié)下,就是八門神器會(huì)搜索出對(duì)應(yīng)數(shù)值的內(nèi)存地址,然后改變內(nèi)存地址對(duì)應(yīng)的值!
三.應(yīng)對(duì)方案
這樣我們貌似可以從兩個(gè)方面去入手解決這個(gè)問(wèn)題:
用過(guò)這個(gè)工具的人都明白,一般情況下,一次搜索就能準(zhǔn)確定位內(nèi)存地址的情況非常少見(jiàn)(除非這個(gè)數(shù)字非常大),都是先搜索,獲得大量(幾十萬(wàn))的數(shù)據(jù),然后回到游戲中,改變這個(gè)值,再回到八門神器,會(huì)自動(dòng)篩選出之前搜索到的結(jié)果有哪些改變了...直到只剩下幾個(gè)結(jié)果,這個(gè)時(shí)候我們挨個(gè)去改變值會(huì)變得十分的Easy!
1.改變內(nèi)存地址
想想這個(gè)過(guò)程,好像只有第一次搜索是全局搜索,后面的每次搜索都是在之前搜索的結(jié)果上進(jìn)行篩選!這樣如果我們游戲中每次改變這個(gè)變量的時(shí)都去改變這個(gè)變量的內(nèi)存地址,這樣它就搜索不到了!代碼如下:
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) { delete m_pValue; } } int getValue(){ return *m_pValue;} void setValue(int nValue) { if (m_pValue) { delete m_pValue; } m_pValue= new int(); *m_pValue=nValue; } private: int * m_pValue; }; |
經(jīng)過(guò)嘗試,這個(gè)方法并不管用,還能被破解,不知我的做法錯(cuò)誤呢還是八門神器的原理不是這樣!請(qǐng)懂行人指出!
2.加密數(shù)據(jù)
換個(gè)思路,我們?yōu)楹尾辉跀?shù)據(jù)上做手腳,對(duì)數(shù)據(jù)進(jìn)行加密(如:表面上顯示的是50,內(nèi)部存的卻是50^0xff),這樣他搜索表面上的數(shù)字當(dāng)然搜索不到!代碼如下:
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() { return m_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; //設(shè)置金錢數(shù) m_DynamicMoney.setValue(1000); //得到金錢 m_DynamicMoney.getValue() //改變金錢 m_DynamicMoney.offset(-100); |
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。