本文章講述利用cocos2d-x 開發手機遊戲的一些加密心得。
如有問題,請多指正。
很多其它資訊詳見:http://blog.csdn.net/chengyingzhilian/article/details/25540441
本文地址:http://blog.csdn.net/chengyingzhilian/article/details/25957895
好了,進入本文的主題——資料加密:
要將資料加密,不得不提的一款神器:八門神器。手機遊戲中的金手指。
八門神器是安卓、iOS、塞班平臺上通用的遊戲改動工具,能夠改動記憶體中的數值和引數,達到改動遊戲HP、MP、金錢、等級等的作用。八門神器類似於PC平臺的金山遊俠等遊戲改動器。
對於網路遊戲來說,可能沒有太大的影響,終端對於網遊來說基本上是一快螢幕,全部的資料都存放在server上。本機僅留部分配置資訊等無關重要的資料。可對於單機來說,意義就不一樣了,沒有網路無法驗證資料的正確,非常easy被記憶體改動器改動了資料。
因此,我們須要對我們用到的資料記憶體進行加密,防止記憶體被改動。
對資料加密基本可分為兩種:
- 可逆加密
- 不可逆加密
兩種加密也相應著不同的資料加密設計思想。
首先要了解八門神器的使用基本步驟:
- 1.發現介面上的資料,進入八門神器進行查詢。
- 2.更新介面上的資料,進入八門神器進行在上一步驟結果中繼續檢索。
- 3.反覆步驟2,直到結果僅僅是固定的地址。
- 4.改動該記憶體,更新介面檢視資料是否正確。
先說可逆加密:
不知道你發現上面八門神器使用步驟中,加紅的文字沒有。這就是可逆加密的關鍵。
首先要明白的一點就是
顯示的資料 ~= 記憶體的資料。
這就是可逆加密的中心思想。
將記憶體中的資料加密起來。在顯示的時候解密就可以。
使用一個最簡單的可逆演算法,實現加密和解密2個方法,然後對你覺得有必要保護的記憶體進行儲存前加密,取前解密。
可逆的加密演算法:最典型的可逆加密演算法是異或運算。大家都知道,對一個值連續異或兩次,其結果還是原值;於是,第一次異或被看成是加密,第二次異或被看成是解密。
本文不是介紹加密演算法,僅僅是介紹基本思路,關於高階的加密演算法可自行搜尋。在此僅適用一種簡單的演算法來演示。
記憶體 * 2
驗證方式非常簡單: 從1 開始,每次遞增1。
利用八門神器非常easy就能改動掉
那麼我們使用簡單演算法:
- 儲存記憶體 = (儲存記憶體 / 2) * 2
- 顯示內容 = 儲存記憶體 / 2
public class MainActivity extends Activity {
TextView showTextView = null;
int index = enNum(1);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showTextView =(TextView)findViewById(R.id.textView2);
showTextView.setText(""+deNum(index));
}
public void addNum(View view)
{
index = enNum(deNum(index)+1);
showTextView.setText(""+deNum(index));
}
public static int enNum(int num){
return num*2;
}
public static int deNum(int num){
return num/2;
}
}
簡單吧。
以下我們進行八門神器搜尋:
在輸入1 之後搜尋: 出現 202397 個資料。
點選button之後,搜尋 2 還是有大量資料。
多次點選button之後。搜尋的結果就會漸漸降低。
之後就發現不了了。
那麼我們利用 顯示內容 = 儲存記憶體 / 2 的演算法。搜尋 顯示 * 2
的記憶體,多次之後就非常easy發現該記憶體。
改動之後,記憶體成功變化。可見加密演算法的重要性。使用簡單的演算法,非常easy暴力掉。
接下來我們看看不可逆加密的方式:
不可逆的加密演算法:MD5 驗證 比如RSA公司發明的MD5演算法,以及由美國國家標準局建議的不可逆加密標準SHS(Secure
Hash Standard。安全雜湊資訊標準)等。
基本上就是:
基本上就是:
顯示記憶體 = 儲存記憶體
將儲存記憶體加密 儲存在驗證變數中。
只是在每次顯示/使用記憶體之前,對你加密與驗證變數對照,這樣就能非常easy發現是否記憶體被改動,是否應該採取措施等等。
if (md5(index).equals(enIndex)){
index++;
enIndex = md5(index);
showTextView.setText(""+index);
}
else
System.err.println("err index changed!!!");
版權宣告:本文部落格原創文章。部落格,未經同意,不得轉載。