内存加密方案

JEngine针对特定情况制作了内存加密结构

提示

内存加密结构能干什么?

  • 防止内存修改(例如GG修改器)
  • 内存加密结构进行数学运算时:
    • 10次计算,加密结构耗时与原生无区别
    • 100次计算,加密结构耗时是原生1~3倍;
    • 1000次计算,加密结构耗时是原生18~20倍;
    • 10000次计算,加密结构耗时是原生19~21倍;
    • 100000次计算,加密结构耗时是原生19~21

compare

命名空间

  • using JEngine.AntiCheat;
    

API

  • AntiCheatHelper.OnMemoryCheatDetected(Action toDo); //如果被发现玩家有修改内存,执行toDo
    

请勿调用

  • AntiCheatHelper.OnDetected(); //该方法是内部方法,请勿调用!
    

支持类型

  • JBool 对应 bool
    
  • JChar 对应 char
    
  • JString 对应 string
    
  • JByte 对应 byte
    
  • JSByte 对应 sbyte
    
  • JShort 对应 short
    
  • JUShort 对应 ushort
    
  • JInt 对应 int
    
  • JUInt 对应 uint
    
  • JLong 对应 long
    
  • JULong 对应 ulong
    
  • JFloat 对应 float
    
  • JDecimal 对应 decimal
    
  • JDouble 对应 double
    

如何使用

和正常数值结构一样,直接使用

int a = 0;
JInt b = 1;
b++; //b会是2
b *= a; //b会是0
a++; //a会是1
b = a; //b也会是1

从上面的示范里,可以看到,内存加密数据结构会自动转换为正常结构,进行运算时也是如此

推荐写法

最简化JSON和Protobuf序列化的长度

[ProtoBuf.ProtoContract]
public class SafeData
{
  //Use this format to serialize and deserialize safe data
  [global::ProtoBuf.ProtoMember(1)]
  private float realA;
  [global::ProtoBuf.ProtoMember(2)]
  private long realB;

  //Use this format to declare safe data
  [global::LitJson.JsonIgnore]
  public JFloat a;
  [global::LitJson.JsonIgnore]
  public JLong b;

  public SafeData()
  {
    a = realA;
    b = realB;
  }

  public void BeforeSerialize()
  {
    realA = a;
    realB = b;
  }
}

需要在序列化前,调用BeforeSerialize(),这样一来可以最简化序列化结果长度。