您好,登錄后才能下訂單哦!
? 八門神器是安卓、iOS、塞班平臺上通用的游戲修改工具,可以修改內存中的數值和參數。在游戲運行時,內存和處理器都會對于游戲進行非常復雜的數據交換和變更。因為游戲有很多的數據,例如金錢、HP值、等級、攻擊力、防御力、戰斗力等數據,尤其是PVE戰斗在客戶端進行。服務器校驗缺失等。而這些數據,就在內存和處理器的各個地址當中,玩家只需要在八門神器中搜索相關的數據值,八門神器就會將搜索出記錄此數據的各個地址顯示,玩家進行多次的數據變更后再次搜索,到最后就會確定此地址到底是哪一個,然后將此地址的數值進行修改,回到游戲中,相關的數據也會變化,八門神器的原理就如金山游俠、整人專家、游戲修改大師等類型的修改軟件,只不過八門神器只可以在智能手機中使用而已。
? 對于八門神器在修改游戲時發生無法修改或無法保存修改后的數據等情況,是因為游戲本身經過特殊處理。安全整型。主要用來內存存放功能。防止八門神器等外掛篡改。根據外掛機制可以在游戲開發中內存整形的簡單加密。也就是真實值A隱藏。內存中值只是A的影子而已。具體原理就是或與運算的巧妙應用。
或運算原理
1.常數A或變量=常數B。變量或常數A=常數B。
常數A:383391203
常數B:34603266
分析:分布轉換成二進制得出結論公式
10110110110100001010111100011
&
0X01X00X10X0XXXX0X0X1000XXX10
等于:
00010000100000000000100000010
結論:變量有規律,其中X可以是0或者1
則12個X可以取值個數為:1<<13=8192個數
例如:
?383391203&34867974;
00010000101000000101100000110
?383391203&34867978;
00010000101000000101100001010
?383391203&34867982;
00010000101000000101100001110
與運算原理
2.常數A與變量=常數B。變量與常數A=常數B
常數A:383391203
常數B:1459600891
分析:分布轉換成二進制得出結論公式
0010110110110100001010111100011
|
10X0XX0XX1XX1X1101X1X0XXXX110XX
等于:
1010110111111111011110111111011
例如:
?383391203|1076739384;
1000000001011011011110100111000
?383391203|1076210840;
1000000001001011010110010011000
?383391203|1076209688;
1000000001001011010100000011000
?383391203|1076210168;
1000000001001011010100111111000
得出結論。發散思維。推廣應用。
最后結論是把32位整形拆分:每位分解成兩個整數表示:算法即可得出參照SaftInt類
XXX0X01X 00X10X0X XXX0X0X1 000XXX10
010X0XX0 XX1XX1X1 101X1X0X XXX110XX
拓展:把整數對應位分別去除來
應用推廣:
如何一個整數A可以和另外一個變量互轉。
有了這個依據則可以用于游戲開發中內存整形的簡單加密。
也就是真實值A隱藏。內存中值只是A的影子而已。
Gk8SafeInt.cs
using System.Collections;
/**
* 安全整型:用主要用來內存存放功能。防止八門神器外掛等
* @Thinker
**/
public class Gk8SafeInt
{
private int m_nInt1; //內放整型1
private int m_nInt2; //內放整型2
//private int m_nMaskRnd; //隨機掩碼
//XXX0X01X 00X10X0X XXX0X0X1 000XXX10
//010X0XX0 XX1XX1X1 101X1X0X XXX110XX
//取對應位
static int g_nMaskBit1=383391203;
static int g_nMaskBit2=-383391204;
//合并
static int g_nUionBit1=1076209688;
static int g_nUionBit2=34603266;
public override string ToString ()
{
return GetInt().ToString ();
}
private void MakeInt(int nValue)
{
//m_nMaskRnd=383391203;
m_nInt1=g_nMaskBit1&nValue|g_nUionBit1;
m_nInt2=g_nMaskBit2&nValue|g_nUionBit2;
}
private int GetInt()
{
return (m_nInt1&g_nMaskBit1)+(m_nInt2&g_nMaskBit2);
}
public Gk8SafeInt()
{
MakeInt(0);
}
public Gk8SafeInt(int nValue)
{
MakeInt(nValue);
}
public static explicit operator Gk8SafeInt(int nValue)
{
return new Gk8SafeInt(nValue);
}
public static implicit operator int(Gk8SafeInt iSafeInt)
{
return iSafeInt.GetInt();
}
//重載加減乘除
public static Gk8SafeInt operator + (Gk8SafeInt iSafeInt,int nValue)
{
int n=iSafeInt.GetInt();
n+=nValue;
return new Gk8SafeInt(n);
}
public static Gk8SafeInt operator - (Gk8SafeInt iSafeInt,int nValue)
{
int n=iSafeInt.GetInt();
n-=nValue;
return new Gk8SafeInt(n);
}
public static Gk8SafeInt operator * (Gk8SafeInt iSafeInt,int nValue)
{
int n=iSafeInt.GetInt();
n*=nValue;
return new Gk8SafeInt(n);
}
public static Gk8SafeInt operator / (Gk8SafeInt iSafeInt,int nValue)
{
int n=iSafeInt.GetInt();
n/=nValue;
return new Gk8SafeInt(n);
}
//重載比較操作
public static bool operator < (Gk8SafeInt iSafeInt,int nValue)
{
if(iSafeInt.GetInt()< nValue) return true;
return false;
}
public static bool operator <= (Gk8SafeInt iSafeInt,int nValue)
{
if(iSafeInt.GetInt()<= nValue) return true;
return false;
}
public static bool operator == (Gk8SafeInt iSafeInt,int nValue)
{
if(iSafeInt.GetInt()==nValue) return true;
return false;
}
public static bool operator != (Gk8SafeInt iSafeInt,int nValue)
{
if(iSafeInt.GetInt()!=nValue) return true;
return false;
}
public static bool operator >= (Gk8SafeInt iSafeInt,int nValue)
{
if(iSafeInt.GetInt()>=nValue) return true;
return false;
}
public static bool operator > (Gk8SafeInt iSafeInt,int nValue)
{
if(iSafeInt.GetInt()>nValue) return true;
return false;
}
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。