Пользователь
26 июня 2012 в 11:58

Разработка → Мини reverse engineering и модификация Windows Phone приложений из песочницы

Здравствуйте!

Несколько дней назад мне попалась на глаза забавная игра, в которой необходимо на мотоцикле объезжать препятствия и за это получать очки, и мы с друзьями начали меряться количеством набранных очков немного увлеклись. Немного подумав, я решил покопаться в коде игры и добавить небольшой хак для очков. Итак, о том, как разобрать Windows Phone приложение, изменить в нем что-то и собрать это все обратно:

Для начала определимся со всем необходимым:
  • Разлоченое Windows Phone устройство (эмулятор тоже подойдет, но нет удовольствия от игры).
  • Установленный WP7.1 SDK или любая альтернатива для установки .xap на устройство.
  • .NET Reflector для декомпиляции/компиляции сборок.
  • Reflexil для сохранения сборок
  • HxD для редактирования HEX значений
  • Phone7Market для выкачивания .xap из маркета

Моих познаний быдлохакера в рефлекторе/hex-редакторе хватает как раз на замену простых значений.
Для начала выкачиваем приложение из маркета с помощью Phone7Market. Находим игру поиском, нажимаем правой кнопкой и сохраняем в необходимую директорию на диске.



Теперь копируем наш .xap файл и переименовываем копию в .zip и распаковываем в папку. Например, у меня после операций папка выглядит примерно так:



Теперь приступим к самому интересному. Распаковываем reflexil и копируем путь к нему. Теперь запускаем ReShrper и заходим в Tools -> Add-Ins… нажимаем Add и вставляем путь к Reflexil.Reflector.dll в папке с reflexil. Эта штуковина нужна в рефлекторе для того, чтобы редактировать и пересобрать сборки.
Открываем в рефлекторе наш ранее распакованный архив. Быстро пробежавшись по списку библиотек, открываем ту, у которой, название похоже на приложение. Скорее всего, это и есть основной проект.



В глаза сразу бросается класс Config. Постойте – да это же класс с основными значениями! Теперь можно поменять что-то небольшое типа скорости или вероятности появления машин. Давайте немного подправим скорость прибавления очков, вероятность появления препятствий и количество очков за обход препятствия.



Открываем HxD и выбираем нашу библиотеку ThreeDMoto.dll.



Немного пугает, но просто все понять. Находим строчку, которую будем изменять.

public static readonly float[] TIMESPAN_OF_SHIFT = new float[] { 0.5f, 1f, 3f, 5f };

Итак, у нас есть значения 0.5, 1, 3, 5. Возвращаемся в HxD и жмем поиск. Искать будем по числу 3.



нашлось несколько значений. Теперь ищем 5. Их всего 2. Теперь необходимо найти то место где 3 и 5 стоят рядом:



Отлично. Убеждаемся что там именно те числа и заменяем все 4 на 0,1



Жмем сохранить и переключаемся в рефлектор. Чтобы убедиться что мы сделали все правильно. Удаляем из рефлектора библиотеку и подключаем ее снова. Заходим в конфиг и находим нужную строку:

 public static readonly float[] TIMESPAN_OF_SHIFT = new float[] { 0.1f, 0.1f, 0.1f, 0.1f };

Итак, сборка изменилась. Теперь в проводнике перетягиваем dll на zip и подтверждаем замену. Переименовываем .zip в .xap и выгружаем приложение на устройство.



И получаем первую ошибку. Эта ошибка возникает из-за того, что в .xap пакете находится файл с контрольной суммой приложения WMAppPRHeader.xml. Удаляем файл из архива и пробуем снова:



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



Снова выполняем действие с переименованием и перетягиваем и выгружаем проект на устройство. Заработало. Теперь разгон происходит за четверть секунды, и очки умножаются в 4 раза почти мгновенно. Теперь отредактируем количество очков за объезд препятствия и вероятность появления препятствий на дороге.



Заменяем все на:



Сохраняем, переименовываем, копируем, переименовываем, заливаем. Теперь можно легко установить рекорд любого размера.

Оригинал приложения.
Редактированное приложение.

Итак, подведем итог


При разработке игр и приложений на Windows Phone разработчикам не следует забывать о том, что их код можно будет просмотреть и после компиляции. Чтобы усложнить жизнь тем, кто будет его смотреть или редактировать – можно воспользоваться удобными и простыми средствами для обфускации кода и подписи сборок. Это создаст несколько проблем. Из-за подписи сборку будет сложнее отредактировать, а из-за обфускации будет совершенно не ясно, что редактировать. Ведь описанным способом можно не только редактировать безобидные значения, а и снимать триалы с приложений и даже дописывать собственные методы и классы и переписывать существующие.
Антон Полховский @polhovskiy
карма
5,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (43)

  • +1
    При разработке игр и приложений на Windows Phone разработчикам не следует забывать о том, что их код можно будет просмотреть и после компиляции.

    Ну, дык пускай смотрят. Мне, например, не жалко бы было.
    • 0
      Вопрос всегда о данных… Не думаю, что банк будет рад тому, что их код можно легко «почитать».
      • 0
        До определенной степени спасет обфускатор, самое главное это валидация сборки. Но, к сожалению, не в курсе как это на WP.
        • 0
          Подписать сборку есть возможность. Это не происходит во вкладке в свойствах, но с консолью и постбилд событиями можно автоматизировать. Не помню как называется, но есть гибридные библиотеки для сервелата, винфона и дотнета — там, возможно, есть вкладка для подписи.
          • 0
            В смысле я могу использовать strong named сборки и хранить ключик в своем сейфе?
      • 0
        После хорошей обфускации даже вышеупомянутый пример было бы уже не так просто подредактировать. А банковский софт вообще не должен никуда уходить за пределы здания, если уж на то пошло…
        • 0
          В маркете есть достаточно много банковских приложений, в которых можно посмотреть код. Причем эти банковские приложения выполняют функции перевода денег.
          • +2
            Так это UI обертка над банковским API, по идее никаких вредительских операций вы не сможете сделать даже имея все сорцы клиента.
      • 0
        Но все равно данные могут прочесть. Обфускация тут, максимум, даст ложную уверенность, что данные в безопасности.
        • +1
          Насколько я понимаю после выхода WP8 все это будет уже не актуально, т.к. обещали «Cloud Compile» в Native Code.
          • 0
            Обещали NGen в облаке?
            • 0
              Да, в том числе для тех приложений которые уже опубликованы (при условии запуска на wp8).
        • 0
          Сам код особой ценности не имеет. От того что вы прочитаете код, тот же SAML токен вам не расшифровать.
          Нормальный обфускатор устроит такую лапшу, что будет очень сложно что-то понять.
  • 0
    Вспомнил! В Portable Library Tools есть вкладка подписи в свойствах:

    • 0
      Эта вкладка есть во всех проектах .net
      • +2
        Спешу вас огорчить:

        • 0
          Вот ведь! Интересно, в связи с чем это.
  • +1
    Зачем мучаться с обфускацией, защищаясь от ничтожного количества пользователей-хакеров?
    • –1
      достаточно одного который уведет у банка кое что что ему не принадлежит.
      • 0
        Можете перечислить то, что можно увести из приложения? Может я чего не понимаю, но приложение на трубке — low trust, что автоматом выливается в невозможность хранения ценных данных в открытом виде и передачу чего либо по незащищенным каналам, предварительно не пройдясь шифрованием?
      • +1
        Какая чушь, что ж это за банк который не делает дополнительные проверки на сервере. И не использует https для общения с клиентом?
    • 0
      Обфускация производится не только для защиты. Это ещё и оптимизация (в зависимости от возможностей обфускатора): например, вынос (или, наоборот, инлайн) методов, удаление неиспользуемых переменных и мёртвого кода, сокращение названий классов, методов и свойств, сортировка классов и методов и пр. На мобильных устройствах пусть даже мелкая оптимизация, но для миллионов устройств, выливается в значительную экономию ресурсов.
  • 0
    Тоже занимался целую ночь [нет, не тем, что вы подумали] реверсингом инженерной утилиты Dell Venue Pro, хотел саморучно исправить одну досадную ошибку… Вроде как и получилось, но под утро оказалось, что без подписи ее ну никак там не запустить. Было довольно досадно.
    • +2
      Могу сказать, что уже существуют способы обхода проверки подписи для приложений WP7 — правда пока только для запуска их на эмуляторе. Но нам динамического анализа приложений на текущий момент и эмулятора хватает.
      • 0
        Чисто анализ — это относительно просто, но без практического применения в виде изменения уже скомпилированных приложений такой реверсинг мало что даст.
        • 0
          Что такое «чисто анализ»? Мы производим статическую инструментацию скомпилированного приложения для WP7 и анализируем его в процессе его работы на эмуляторе. При желании и логику работы приложения изменить можно.
          • 0
            Написал же. Анализ скомпилированного XAP'а как самоцель имхо неинтересна. Гораздо интереснее именно изменение логики приложения (я это делал с помощью Reflexil), но проблема как раз в том, что без соответствующих цифровых подписей такое приложение запустить на телефоне не получится.
            • 0
              Это всего лишь вопрос времени — работаем в данном направлении. Для этого либо уязвимость в ОС WP7 нужна или ослабление безопасности ОС WP7 (по аналогии с jailbreak в iOS), что в принципе и реализует цепочку уязвимостей.
      • 0
        Есть программы, которые тупо срубают подпись с пакета
    • 0
      Так погодите, автор же запустил приложение у себя. Правда, у него developer unlocked устройство.
      • 0
        Так и у меня developer unlock, само собой, был (без него, кстати, вы xap в принципе на телефон не забросите). Но видимо либо игрушка была неподписанная, либо просто кастомная прошивка на телефоне (для некоторых моделей таких уже хватает).
        • 0
          А заливали вы как? Application Deployment'ом? По идее он и должен ее переподписывать.
          • 0
            Что имеется ввиду под подписью? Если подпись маркета — то ее просто удаляем (WMAppPRHeader.xml)
            Если именно подпись каждой сборки — от этого тоже умеет спасать рефлексил. У меня обычный моцарт с самой стандартной прошивкой :)
            • 0
              Приложения без подписи ставятся и работают? Андроид, например, требует подпись. Но, удалив оригинальное приложение, подписав его своей, можно поставить и оно будет успешно работать (если оно или другое не будет проверять ключ).
              • 0
                На разлоченом девайсе, редактированое приложение удаляет старое ставит себя. Тут нет подписки как в Android. Как я понял — вся подпись маркета — это файл WMAppPRHeader.xml содержимое которого выглядит следующим образом:

                <WRMHEADER xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader" version="4.0.0.0">
                <DATA>
                  <PROTECTINFO>
                    <KEYLEN>16</KEYLEN>
                    <ALGID>AESCTR</ALGID>
                  </PROTECTINFO>
                  <KID>lds1jRP2aDeWpl8X+H+MsA==</KID>
                  <LA_URL>http://microsoft.com/</LA_URL>
                  <CUSTOMATTRIBUTES xmlns="">
                    <S>dfGxu4ileP4+LWZdE6ds4wQ==</S>
                    <KGV>0</KGV>
                  </CUSTOMATTRIBUTES>
                  <CHECKSUM>tXG3tIfoarY=</CHECKSUM>
                </DATA>
                </WRMHEADER>
                
            • 0
              Нет, не маркета, а цифровая подпись.
              И оффициальным пробовал, и альтернативным XAP Deployer (если не ошибаюсь, так назывался). Но нет — оригинальная подпись слетает, а нужна именно она, а не какой-то самоподписанный сертификат.
              Рефлексил не спасает, так как нету закрытого ключа от Microsoft Corporation для подписи (а, собственно, откуда ему взяться? :) ). Ну а, не знаю как игрушки, но инженерное меню требует именно их сертификата.
              • 0
                Цифровая подпись чего?
                Сборки со Strong Name?

                Просто весь .xap никто кроме майкрософта не подписывает. Я такого и не встречал даже :(
                • 0
                  Strong Named, естественно.
                  Ну я тоже не встречал, просто очередное предположение)
              • 0
                Только что стянул geoDefense, удалил подпись маркета — и не работает, гад.
              • 0
                Это скорее делается для платных приложений. Хотя на XDA много хакнутых платных игр :)
  • 0
    Реквестиру статью об общих методах защиты от такого воздействия.
    • 0
      Хранить зашифрованные сборки в СУБД, проверяя подписи везде и вся? :)
      • 0
        Нет, я имел ввиду практические приемы защиты, например, игр от накруток счета или т.п.

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