天天看點

[cocos2dx]防止八門神器修改記憶體資料

網上的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

<code>class DynamicInt</code>

<code>{</code>

<code>public:</code>

<code>    </code><code>DynamicInt(){m_pValue=NULL;}</code>

<code>    </code><code>~DynamicInt()</code>

<code>    </code><code>{</code>

<code>        </code><code>if</code><code>(m_pValue)</code>

<code>        </code><code>{</code>

<code>            </code><code>delete</code><code>m_pValue;</code>

<code>        </code><code>}</code>

<code>    </code><code>}</code>

<code>    </code><code>int getValue(){</code><code>return</code><code>*m_pValue;}</code>

<code>    </code><code>void setValue(int nValue)</code>

<code>        </code><code>m_pValue=</code><code>new</code><code>int();</code>

<code>        </code><code>*m_pValue=nValue;</code>

<code>private:</code>

<code>    </code><code>int * m_pValue;</code>

<code>};</code>

經過嘗試,這個方法并不管用,還能被破解,不知我的做法錯誤呢還是八門神器的原理不是這樣!請懂行人指出!

2.加密資料

換個思路,我們為何不在資料上做手腳,對資料進行加密(如:表面上顯示的是50,内部存的卻是50^0xff),這樣他搜尋表面上的數字當然搜尋不到!代碼如下:

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

<code>#ifndef _H_DYNAMICVALUE_H_</code>

<code>#define _H_DYNAMICVALUE_H_</code>

<code>template&lt;class T&gt;</code>

<code>class CEncryptValue</code>

<code>    </code><code>CEncryptValue()</code>

<code>        </code><code>: m_Value(0)</code>

<code>    </code><code>~CEncryptValue()</code>

<code>    </code><code>T getValue()</code>

<code>        </code><code>return</code><code>m_Value ^ m_EncryptKey;</code>

<code>    </code><code>void setValue(T value)</code>

<code>        </code><code>m_Value = value;</code>

<code>        </code><code>m_EncryptKey = rand();</code>

<code>        </code><code>m_Value ^= m_EncryptKey;</code>

<code>    </code><code>void offset(T value)</code>

<code>        </code><code>setValue(getValue() + value);</code>

<code>    </code><code>T m_Value;</code>

<code>    </code><code>int m_EncryptKey;</code>

<code>typedef CEncryptValue&lt;int&gt; CDynamicValueInt;</code>

<code>typedef CEncryptValue&lt;float&gt; CDynamicValueFloat;</code>

<code>typedef CEncryptValue&lt;bool&gt; CDynamicValueBool;</code>

<code>#endif</code>

使用時:

<code>CDynamicValueInt m_DynamicMoney;</code>

<code>//設定金錢數</code>

<code>m_DynamicMoney.setValue(1000);</code>

<code>//得到金錢</code>

<code>m_DynamicMoney.getValue()</code>

<code>//改變金錢</code>

<code>m_DynamicMoney.offset(-100);</code>

這個方法經過測試,十分管用!也是我目前采取的方案!大家可以直接拿來使用!

本文轉蓬萊仙羽 51CTO部落格,原文連結:http://blog.51cto.com/dingxiaowei/1366114,如需轉載請自行聯系原作者

繼續閱讀