Мини 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 разработчикам не следует забывать о том, что их код можно будет просмотреть и после компиляции. Чтобы усложнить жизнь тем, кто будет его смотреть или редактировать – можно воспользоваться удобными и простыми средствами для обфускации кода и подписи сборок. Это создаст несколько проблем. Из-за подписи сборку будет сложнее отредактировать, а из-за обфускации будет совершенно не ясно, что редактировать. Ведь описанным способом можно не только редактировать безобидные значения, а и снимать триалы с приложений и даже дописывать собственные методы и классы и переписывать существующие.
Метки:
Поделиться публикацией
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама
Комментарии 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
                                    Нет, я имел ввиду практические приемы защиты, например, игр от накруток счета или т.п.

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