模糊的原始数据types作弊

即时尝试创建轻量级值obscurer,反对可能性公然更改内存编辑器中的原始值。 如作弊引擎。 这就是我所要做的。

/// <summary> /// Obscure for type int. /// </summary> public class ObscuredInt{ public ObscuredInt() { this.value = 0; } public ObscuredInt(int value) { this.value = value; } private int _a; private int _b; /// <summary> /// Current obscure value. /// </summary> public int value { get { return _a + _b; } set { _a = Random.Range(int.MinValue, int.MaxValue); _b = value - _a; } } } 

用法

 ObscuredInt health = new ObscuredInt(5); health.value = 10; printInConsle(health.value); 

这个工作原理是从来没有存储实际值,而是两个整数的组合,其中的和表示值。 这样的值实际上从来没有在内存中长时间caching。 所以使用作弊引擎以原始的方式find它是不可能的。

我的问题

我已经看到了其他一些模糊的例子,其中包括转换为二进制或string散列或其他相当繁重的操作。

这个例子当然要轻得多,这个例子比更高级的哈希或转换更糟。 你看这个例子有什么缺陷? 你能提出什么建议?

谢谢

主要的缺陷是,你正在int.MinValueint.MaxValue之间添加随机值,没有更多的空间为您的真实价值。 好的,C#中的默认值是不执行范围检查, 但可以更改 。

为了保持整个值的范围为您的真实值,我会建议使用异或操作。

 public int value { get { return _a ^ _b; } set { _a = Random.Range(int.MinValue, int.MaxValue); _b = value ^ _a; } } 

再次应用同一个“掩码”时, XOR将恢复原始值 。 XOR的结果总是在int ,永远不会溢出。 异或速度非常快,不涉及范围检查。


或者,你可以将你的代码包装在unchecked语句中。

 public int value { get { unchecked { return _a + _b; } } set { _a = Random.Range(int.MinValue, int.MaxValue); unchecked { _b = value - _a; } } } 

请参阅: 选中和取消选中(C#参考) 。


速度:最昂贵的操作是创建随机数。 如果速度很重要,可考虑将随机数设置为静态,并且每个会话只创建一个。


安全:我认为大多数作弊引擎不会聪明地绕过你的伎俩。 当然,对于黑客来说,这是另一回事。