2009-04-23 2 views
2

Итак, друг рассказывал мне, как была взломана игра и как работает эта техника. Затем он спросил, как лучше всего предотвратить такую ​​атаку. Самый прямой путь, который я знал, заключался в том, чтобы A) перетасовать бит важного значения B) хэшировать значения и сравнивать их каждый раз (int, который держит оценку или деньги, скорее всего, будет проверяться редко).оператор перегрузки = в C#. Как я могу принимать другие типы?

Тогда я попробовал реализацию в C#, я не мог перегрузить оператор =. Как я могу это сделать?

ex код.

class EncryptVal <T> 
{ 
    T v; 
    public T operator = (T v2) 
    { 
     //shuffle bits 
    } 
    public T operator()() 
    { 
     //return unshuffle bits 
    } 
} 
+0

Обратите внимание, что .Net код все-таки довольно легко взломать. В большинстве случаев вы можете получить точный источник от своего ИЛ, а внешний отладчик (например, windbg с расширениями SoS) позволит вам легко изучить ваш «зашифрованный» экземпляр. Итак, я считаю, что такой класс - это пустая трата времени для хакера с еще 5 минутами. – Groo

+0

lol Groo, я этого не знал.Я изначально задал этот вопрос, чтобы посмотреть, могу ли я сделать это на C#. То, что вы только что сказали, вероятно, более того, что знал бы базовый игровой хакер. Я на самом деле думаю о хэшировании значения, а затем сравнить его. Если это не то же самое, пусть игра отобразит шутку хакеру. Но это предполагает, что я делаю игру на C# или на любом языке. – 2009-04-23 13:44:55

ответ

10

Вы можете инкапсулировать значение в классе и перегружать неявные преобразования и из класса:

public class EncryptVal<T> { 

    private T _value; 

    private EncryptVal(T value) { 
     _value = value; 
    } 

    public static implicit operator EncryptVal<T>(T value) { 
     //shuffle bits 
     return new EncryptVal<T>(value); 
    } 

    public static implicit operator T(EncryptVal<T> value) { 
     //unshuffle bits 
     return value._value; 
    } 

} 

Использование:

// implicit conversion from int 
EncryptVal<int> e = 42; 

// implicit conversion to int 
int i = e; 
+0

: D. – 2009-04-23 12:40:28

2

Вам не разрешено перегружать оператор присваивания в C#. Here's the MSDN documentation on it.

Для этого вам придётся создать свою собственную функцию.

13

Вы ищете оператор implicit и explicit, а не =. Это позволяет вам определить, как будут работать вещи при неявно (т.е. просто присваивании) и явно (т. Е. Есть оператор литья).

public static implicit operator Type1(Type2 p) {} 
public static explicit operator Type1(Type2 p) {} 
+0

Думаю, он не хочет бросать. Ему нужен контейнер, который хранит зашифрованное значение. –

+1

Это похоже на довольно элегантный способ выполнения задачи на C#. Я собирался предлагать методы доступа или даже свойство value, но это делает использование намного проще. – Noldorin

+0

Кастинг был неправильным словом для использования. Конверсия была бы более точной. Этот метод выполнит то, что вы описываете. –

2

Я предполагаю, что вы пришли из C++, где очень часто приходится писать классы, которые используются как примитивные типы данных. В C# вы делаете что-то более явно.

Я хотел бы написать это как свойство или двумя способами, например:

class EncryptVal <T> 
{ 
    T v; 
    public T Value 
    { 
     get 
     { 
     //return unshuffle bits 
     } 
     set 
     { 
     //shuffle bits 
     } 
    } 
} 
+0

Твой близкий, но не кубик. Мне нужно было бы сделать o.v = val; вместо o = val; – 2009-04-23 12:22:33

+0

Да, это как с Nullable . int i = nullableInt.Value –

0

не использовать = для установки значения. Вы не можете перегрузить назначение.

Что вы можете сделать, это спрятать его за свойством.

int _encyptedValue; 
Public int myInt 
{ 
    get 
    { 
     return Decrypt(_encryptedValue); 
    } 
    set 
    { 
     _encryptedValue = Encrypt(value); 
    } 
} 

Вы получаете chosse своего дешифрования/шифрования

0

Я бы неявный/явный оператор перегрузки для части реализации.

Наверное, явный, так как ваше преобразование делает тяжелую обработку и что в конечном итоге может потерпеть неудачу.

Я бы просто добавил, что перетасовывание бит, по-видимому, является лишь обфускационной техникой, которая наверняка не продлится долго, если у вас есть желаемые хакеры, заинтересованные в вашей игре. Для защиты ваших данных вам, вероятно, нужна более сильная криптография, но необходим больше контекста.

Смежные вопросы