2012-08-21 3 views
2

Недавно у меня были проблемы с людьми, обманывающими использование приложения для пользователей root под названием Gamecih. Пользователи Gamecih позволяют пользователям приостанавливать игры и изменять переменные во время выполнения.Обфускать исходный код с помощью ProGuard

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

Я сериализую игровые объекты, используя интерфейс Javas Serializable, а затем записываю их в файл. Теперь предположим, что я сериализую объект класса «Player». Он становится сериализованным и сохраняется в файле. Затем пользователь загружает обновление с помощью реализации Proguard. Proguard переименует имена классов и классов. Не будет ли причиной серьезных ошибок при попытке чтения в уже сохраненном объекте Player?

Если бы я еще не начал свою игру, это не было бы проблемой. Но теперь некоторые игроки играют в одной и той же сохраненной игре (это RPG) в течение нескольких месяцев. Они были бы очень разозлены, если бы они загрузили обновление и должны были начать с нуля.

Я знаю, что могу поручить Proguard не запутывать определенные классы, но это класс Player, который мне действительно нужно запутывать.

Разъяснение: Допустим, у меня есть следующий простой unobfuscated класс:

public class Player { 

    private int gold; 
    private String name; 
    //Lots more. 

    public Player(String name) 
    { 
     this.name = name; 
    } 
    public int getGold() { 
     return gold; 
    } 
    public void setGold(int gold) { 
     this.gold = gold; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
} 

Игрок создан, сериализованная и сохранены в файл. После того, как я реализую обфускатор, это может выглядеть следующим образом:

public class Axynasf { 

    private int akdmakn; 
    private String anxcmjna; 

    public Axynasf(String adna) 
    { 
     anxcmjna=adna; 
    } 
    public int getAkdmakn() { 
     return akdmakn; 
    } 
    public void setAkdmakn(int akdmakn) { 
     this.akdmakn = akdmakn; 
    } 
    public String getAnxcmjna() { 
     return anxcmjna; 
    } 
    public void setAnxcmjna(String anxcmjna) { 
     this.anxcmjna = anxcmjna; 
    } 
} 

Представьте себе, что я после обновления теперь и игрок, который имеет unobfuscated версия проигрывателя загружает это обновление. При попытке прочитать этот объект будут разные имена участников и другое имя класса. Скорее всего, я получу ClassCastException или что-то в этом роде.

+1

Оффтопик, но почему? Если некоторые геймеры хотят играть в мошенничество, пусть они, это не так, как если бы они повлияли на вас или других. – SJuan76

+1

@ SJuan76: Потому что у меня есть глобальные списки рекордов и пвп-битвы. – Emiam

+0

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

ответ

1

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

Одним из возможных способов решения этого может быть реализация слоя поверх текущей структуры сохранения. Вы можете сообщить Proguard, какие классы вы не хотите путать. Оставьте Player (и аналогичные объекты) одинаковым на данный момент и не обфускайте. После того, как объект был де-сериализован, передайте его на новый слой (который запутан), с которым связана остальная часть игры, - если вы не сохраните объект, не обфусканный, то это вызовет изменение настроек читеров во время игры (хотя и не во время загрузки). В то же время вы можете взглянуть на перенос игровых файлов вашего игрока на другой вариант сохранения, который не зависит от сериализации, что, вероятно, сделает такие проблемы более легкими в будущем.

+0

Это должно быть тихо, так как вы могли бы расширить плеер (как сохраненный в файлах) в obPlayer (точная копия, но обфускация) - однако не остановить игроков, изменяющих данные в сохраненных файлах – Elemental

1

Для обеспечения совместимого сериализации в ProGuard:

Для повышения сериализованную класса в другой класс в Java:

  • JDK документация > Сериализация> Классы ввода объектов> readResolve

  • JDK документация> Сериализация> сериализации объекта Примеры> Эволюция/Замена

+1

Обратите внимание, что вы должны опубликовать полезные пункты ответа здесь, на этом сайте или ваши риски для публикации, удаленные как [«Не ответ»] (http://meta.stackexchange.com/q/8259). Вы можете по-прежнему включать ссылку, если хотите, но только как ссылку. Ответ должен стоять сам по себе, не нуждаясь в ссылке. –

1

Я понимаю, ППЛ может обновить вары @ выполнения ж/приложение, которое вы назвали.

Если вы измените имена участников, значения будут по-прежнему давать подсказки. Если вы запутались, имя класса изменится, но новое имя закончится на форуме в любом случае. Так что этого недостаточно

Что вы можете сделать в своем обновлении, при запуске загружать сериализованные данные в старый объект, переносить на «новый» обфускационный класс, использовать пользовательскую сериализацию (с помощью XOR с использованием значения идентификатора устройства или адрес gmail, чтобы сделать его менее очевидным).

Попытайтесь получить данные своего игрока на несколько классов.

0

Что я буду делать в вашей ситуации:

  1. релиз обновление с запутанным и не запутанным классом. Когда игрок будет загружен, он попытается выполнить оба класса. Если игрок загружен не-obf. class, тогда сопоставьте этот класс с вашим запутанным классом.
  2. Когда игрок будет сохранен, он сохранит с запутанным классом.
  3. После достаточного количества времени выпустите обновление только с запутанными классами.
Смежные вопросы