Guest User

Untitled

a guest
Nov 2nd, 2014
1,489
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
HTML 18.23 KB | None | 0 0
  1.                                                         ПРОТОКОЛ
  2.                             АНАЛИЗА ПРИЛОЖЕНИЯ "BURGER KING" ОТ РАЗРАБОТЧИКА "LOYALTY PLANT" ("ФАБРИКА ЛОЯЛЬНОСТИ")
  3.    
  4. ОСНОВНЫЕ ПОЛОЖЕНИЯ:
  5. ========================================================================================================
  6. 1. Приложение разработано для мобильных платформ: Android, Windows Phone, iOS
  7. 2. Приложение разработано на основе фреймворка Xamarin, который реализует поддержку .NET-приложений в мобильной среде
  8. 3. Приложение, кроме того, состоит в целом из двух важных частей:
  9.     * .NET-ассембли, написаный, скорее всего, на C#. (Весь код, включая структуру классов, а так же декомпилированные листинги методов, можно получить с использованием .NET Reflector)
  10.         * Ассембли содержит основной функционал программы, логику работы с аппаратным обеспечением, логику для генерирования уникального идентфикатора устройства
  11.         * Ассембли содержит основную логику для работы с REST-сервисом LoyaltyPlant на основе XML-запросов
  12.         * Ассембли содержит вызовы подпрограмм для обеспечения шифрования передаваемых данных:
  13.             * Используется следующая схема:
  14.             КЛИЕНТ->СЕРВЕР: [ XML-запрос] -> [ AES-шифрование (Java-бэкенд) ] -> [ Base64-кодирование ]
  15.             СЕРВЕР->КЛИЕНТ: [ Base64-декодирование ] -> [ Дешифровка AES (Java-бэкенд) ] -> [ XML-ответ ]
  16.     * Java-бэкенд (весь существенный код, кроме биндингов к Android-среде, прошёл процедуру обфускации путём искажения реальных имён классов и их членов, а так же локальных переменных. Получить исходные коды можно через связку утилит: dex2jar -> jd-gui):
  17.         * Состоит из биндингов из Xamarin (.NET) среды к среде Android (в данном конкретном случае рассматривается только реализация для Android)
  18.         * Содержит в себе набор обфусцированных классов библиотеки BouncyCastle для обеспечения поддержки AES-шифрования
  19.         * Содержит в себе класс (с именем a.class), цель которого обеспечить связь между .NET-частью и Java-бэкендом через вызовы JNI со стороны .NET-части. Связь выражается в виде вызовов подпрограмм для шифрования/дешифрования
  20.         * Содержит класс "a.class", который в своём статическом блоке инициализации единожды генерирует постоянный 16-байтовый ключ для AES-шифрования. Кроме того, класс имеет подпрограммы вызова шифрующих/дешифрующих подпрограмм.
  21.         * Содержит в себе класс com.google.utils.Util, который, в свою очередь, содержит подпрограмму для генерации уникального идентификатора пользователя на основе данных о его модели. Содержит строковые константы с предупреждением о возможном нарушении статьи 272 УК РФ, а так же вызовы хеш-функции CRC32
  22. 4. Некоторые сведения об используемой "защите":
  23.     * Криптографическая схема в стандартных обозначениях: AES/CBC/PCKS7Padding (алгоритм: симметричный шифр AES (aka Rijndael), режим: блочный, выравнивание блоков: PCKS7)
  24.     * Хеш-функция: CRC32
  25.     * Функция обратимого кодирования малым алфавитом: Base64
  26.     * Схема передачи данных:
  27.         КЛИЕНТ->СЕРВЕР: [ XML-запрос] -> [ AES-шифрование (Java-бэкенд) ] -> [ Base64-кодирование ]
  28.         СЕРВЕР->КЛИЕНТ: [ Base64-декодирование ] -> [ Дешифровка AES (Java-бэкенд) ] -> [ XML-ответ ]
  29.        
  30. ЦЕЛЬ:
  31. ========================================================================================================
  32. Разработать приложение, которое будет имитировать ввод промо-кода на физическом устройстве с целью получения бонусных баллов с минимумом затрат
  33.  
  34. ОБФУСЦИРОВАННЫЕ НАЗВАНИЯ КЛАССОВ Java-БЭКЕНДА И ИХ ПРЕДНАЗНАЧЕНИЕ:   
  35. ========================================================================================================
  36. * a - Main (можно назвать главным классом в крипографической схеме. Генерирует ключ шифрования, обеспечивает связь с .NET-частью в плане вызова шифрующих/дешифрующих подпрограмм)
  37. * d - BlockCipher (BouncyCastle)
  38. * l - CBCBlockCipher (BouncyCastle)
  39. * t.class, r.class - кодирование BASE64
  40. * k.class -  Реализация AES (BouncyCastle)
  41. * n.class - PaddedBufferedBlockCipher (BouncyCastle)
  42.  
  43. ПРОТОКОЛ ЛЕГАЛЬНОЙ СЕССИИ ПЕРЕДАЧИ ДАННЫХ МЕЖДУ КЛИЕНТОМ И СЕРВЕРОМ:
  44. ========================================================================================================
  45. Общие положения:
  46.     * Передача данных ведётся по протоколу HTTP версии 1.1
  47.     * Используется метод POST
  48.     * URL, к которому идут запросы, постоянен и имеет вид: http://54.247.166.174/IPLPhoneServer/PhoneServerSec.do
  49.     * Тело запроса и ответа на запрос зашифровано известной схемой, приведённой выше
  50.     * Тело каждого запроса, если исключить шифрование и кодирование, это обращение к REST-сервису на основе XML-формата. В каждом запросе упоминается:
  51.         * Версия протокола
  52.         * Уникальный идентификатор клиента (устройства)
  53.        
  54.     * Запросы от клиента имеют следующие заголовки:
  55.         POST /IPLPhoneServer/PhoneServerSec.do HTTP/1.1
  56.         Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml
  57.         User-Agent: RestSharp 104.1.0.0
  58.         Content-Type: application/octet-stream
  59.         Content-Length: длина-передаваемых-данных
  60.         Host: 54.247.166.174 (айпи сервера, постоянен)
  61.         Accept-Encoding: gzip, deflate (клиент принимает в качестве ответа от сервера сжатый ZLib/Deflate поток данных)
  62.        
  63.     * Ответы сервера на запросы имеют следующие заголовки:
  64.         HTTP/1.1 200 OK
  65.         Server: nginx/1.4.7
  66.         Date: временная-метка-в-формате-GMT
  67.         Content-Length: длина-пакета-данных
  68.         Connection: keep-alive
  69.         Set-Cookie: JSESSIONID=A7F19DE146D0C1DA921CF279643A0A5A; Path=/IPLPhoneServer/; HttpOnly
  70.         Content-Encoding: gzip
  71.        
  72. ========================================================================================================
  73. Краткая схема запросов клиента:
  74. 1. Запрос на регистрацию
  75. 2. Запрос на данные интернационализации (Loyalty Plant - межнациональная компания, так-то)
  76. 3. Запрос на получение информации о партнёре (в нашем случае это Burger King)
  77. 4. Запрос на загрузку данных синхронизации
  78. 5. Подробный журнал запуска
  79. 6. Подробный журнал, в том числе содержащий информацию о модели физического устройства
  80. 7. Подробный журнал, содержащий данные метрики BlackBox (какие кнопки когда и где нажаты, какие окна открывались/закрывались и т. п.)
  81. 8. Запрос на проверку введённого промо-кода
  82.  
  83. ПОДРОБНЫЙ РАЗБОР СЕССИИ ПЕРЕДАЧИ ДАННЫХ:
  84. ========================================================================================================
  85.  
  86. * Знаком [!] помечены СУЩЕСТВЕННЫЕ для выполнения ЦЕЛИ вещи
  87.  
  88. 0. [!] Запрос на регистрацию клиента (первая установка)
  89. <?xml version="1.0" encoding="utf-8"?>
  90.     <request type="register" protocol-version="9">
  91.         <hardware>
  92.             <device-ids device-id="298527684033946" device-id-udi="b1fb2d86eccb62e7" device-id-android="309a28a181eaf3a0" ad-tracking-enabled="false" />
  93.             <platform phone-model="samsung SM-G900F 4.4.2" type="1" platform-version="4.4.2" />
  94.             <screen width="900" height="1392" depth="32" />
  95.         </hardware>
  96.    
  97.         <application version="10.39 8139" build="8139" />
  98.         <partner id="1579" />
  99.         <android-identifiers android-fingerprint="samsung/kltexx/klte:4.4.2/KOT49H/G900FXXU1ANCE:user/release-keys" android-manufacturer="samsung" android-operator="T-Mobile" />
  100.         <android-accounts />
  101.     </request>
  102.  
  103. 1. [!] Ответ на пакет о первой регистрации
  104. <response protocol-version="9"
  105.     type="register"
  106.     current-server-timestamp="1409952551734"
  107.     accepted="true"
  108.     first-install="true"
  109.     public-id="1540654"
  110.     first-install-timestamp="1409952551737"
  111.     client-id="a122a4f6ec92dc1e1ecc13eb3ec7b95d"
  112. />
  113.  
  114. 2. Запрос на получение данных интернационализации (язык, переводы и пр.)
  115. <?xml version="1.0" encoding="utf-8"?><request type="get-i18n" protocol-version="9" client-id="a122a4f6ec92dc1e1ecc13eb3ec7b95d" />
  116.  
  117. 3. Ответ на запрос данных интернационализации (готовые кнопки меню)
  118. <response protocol-version="9" type="get-i18n"><!-- длинное содержимое пропущено --></response>
  119.  
  120. 4. Запрос на получение информации о партнёре
  121. <?xml version="1.0" encoding="utf-8"?><request type="get-partner-info" protocol-version="9" client-id="a122a4f6ec92dc1e1ecc13eb3ec7b95d" />
  122.  
  123. 5. Ответ на запрос информации о партнёре, возвращает кучу данных о бургер-кинге, включая описание, какая валюта используется, телефон тех. поддержки и т. п.
  124. <response protocol-version="9" type="get-partner-info">
  125.  
  126. 6. [!] Запрос на синхронизацию
  127. <?xml version="1.0" encoding="utf-8"?>
  128.     <request type="sync" protocol-version="9" client-id="a122a4f6ec92dc1e1ecc13eb3ec7b95d" public-id="1540654">
  129.         <application version="10.39 8139" build="8139" />
  130.         [!] <device-ids device-id="298527684033946" device-id-udi="b1fb2d86eccb62e7" device-id-android="309a28a181eaf3a0" ad-tracking-enabled="false" last-client-id-ok-da="a122a4f6ec92dc1e1ecc13eb3ec7b95d" />
  131.         <texts version="1409749682000" />
  132.         <partner-info version="1409574473000" />
  133.         <device-token />
  134.         <social-networks>
  135.             <social-network-info type="vk" />
  136.             <social-network-info type="fb" />
  137.             <social-network-info type="twi" />
  138.         </social-networks>
  139.         <date timestamp="1409952610610" />
  140.         <points amount="0" />
  141.         <coupons>
  142.             <hidden />
  143.             <shown />
  144.         </coupons>
  145.         <uses />
  146.         <sections wp-fixed-section-id="0" />
  147.         <feedback-records />
  148.         <features />
  149.     </request>
  150.    
  151. 7. Ответ на запрос о синхронизации.
  152. Беглый анализ показывает, что в ответе содержатся следующие данные:
  153.     * Текущее время на сервере в формате временной метки POSIX-TIME
  154.     * Количество бонусных очков
  155.     * Список филиалов Burger King в городе, включая их точные GPS-координаты
  156.     * Список купонов
  157.     * Шаблон пригласительного смс-сообщения
  158.     Заголовок: <response protocol-version="9" type="sync" current-server-timestamp="1409952553144">
  159.    
  160. 8. [!] Запрос на синхронизацию меню
  161. <?xml version="1.0" encoding="utf-8"?><request type="sync-menu" protocol-version="9" client-id="a122a4f6ec92dc1e1ecc13eb3ec7b95d"><version value="1" /><menu-items /><categories /></request>
  162.  
  163. 9. Ответ на запрос синхронизации меню
  164. <response protocol-version="9" type="sync-menu" current-server-timestamp="1409952554845">
  165.  
  166. Содержит:
  167.     * Текущее время сервера
  168.     * Список элементов меню, включая купоны
  169.     * Список категорий
  170.    
  171. 10. [!] Клиент отправляет подробный журнал запуска
  172. <?xml version="1.0" encoding="utf-8"?><request type="log" client-id="a122a4f6ec92dc1e1ecc13eb3ec7b95d" build="8139" platform-id="1" protocol-version="9" timestamp="1409952614890"><log timestamp="1409952608470" level="info">
  173. Требуется полностью имитировать его формирование и отправку в целях поддержания максимального сходства с легальным приложением
  174.  
  175. 11. Ответ на высланный лог, подтверждение со стороны сервера
  176. <response protocol-version="9" type="log" accepted="true"/>
  177.  
  178. 12. [!] Очередной посыл лога, содержит важную информацию о модели устройства:
  179. <![CDATA[Log: ======================= CURRENT MODEL =======================
  180. CorrectedCurrentTimestamp: 1409952553254
  181. ==================== PERSISTENCE FIELDS ====================
  182. - PartnerId: 1579
  183. - Server: http://54.247.166.174/IPLPhoneServer/PhoneServer.do
  184. ==================== MODEL FIELDS ====================
  185. - PublicId: 1540654
  186. - IsLoggedIn (Facebook): False
  187. - IsLoggedIn (Vkontakte): False
  188. - IsLoggedIn (Twitter): False
  189. - IsLoggedIn (Odnoklassniki): False
  190. - DeviceToken:
  191. - ClientId: a122a4f6ec92dc1e1ecc13eb3ec7b95d
  192. - WindowsPhoneFixedSectionId: 0
  193. - PointsAmount: 0
  194. - StartPresentId: 0
  195. - CanUseStartPresentNow: True
  196. - AskToLeaveMarketFeedback: True
  197. - SubscriptionToPush: True
  198. - UserValidatedPresent: False
  199. - UserValidatedBonusCard: False
  200. ===================== SHOWN CARDS ====================
  201. ]]!>
  202.  
  203. 13. Ответ сервера на высланный лог
  204.  
  205. 14. Клиент посылает запрос типа "log" (журнал) с данными от системы метрики BlackBox:
  206. <?xml version="1.0" encoding="utf-8"?><request type="log" client-id="a122a4f6ec92dc1e1ecc13eb3ec7b95d" build="8139" platform-id="1" protocol-version="9" timestamp="1409952631590">
  207. <blackbox version="8">
  208. <![CDATA[{{
  209.              ДАННЫЕ МЕТРИКИ
  210. ]]></blackbox></request>
  211.  
  212. 15. Ответ сервера на присланный лог
  213.  
  214. 16. Очередные данные о метрике. [!] СУЩЕСТВЕННО: в метрике содержатся данные о том, что открыто окно ввода промо-кода (требуется имитировать и это в целях 100% схожести)
  215. Код запроса:
  216. <?xml version="1.0" encoding="utf-8"?><request type="log" client-id="a122a4f6ec92dc1e1ecc13eb3ec7b95d" build="8139" platform-id="1" protocol-version="9" timestamp="1409952650730"><blackbox version="8"><![CDATA[{{
  217. TIME :: 1409952650720
  218. ACTION :: MESSAGE_OPENED
  219. MESSAGE_TYPE :: PleaseEnterPromoCode
  220. TEXT :: Введите промо-код
  221. VISUAL_TYPE :: MessageWithTextField
  222. }}
  223.  
  224. {{
  225. TIME :: 1409952650720
  226. ACTION :: MESSAGE_BUTTON_CLICKED
  227. MESSAGE_TYPE :: AskAboutPromoCode
  228. I18N_IDENTIFIER :: ENTER_PROMO_CODE
  229. BUTTON_TYPE :: positive
  230. BUTTON_TEXT :: Ввести промо-код
  231. TEXT :: Если у вас есть промо-код, введите его
  232. VISUAL_TYPE :: PlainTextMessage
  233. }}
  234.  
  235. {{
  236. TIME :: 1409952650720
  237. ACTION :: MESSAGE_CLOSED
  238. MESSAGE_TYPE :: AskAboutPromoCode
  239. TEXT :: Если у вас есть промо-код, введите его
  240. VISUAL_TYPE :: PlainTextMessage
  241. }}
  242.  
  243. ]]></blackbox></request>
  244.  
  245. 17. Ответ сервера на принятый лог (такой же, как и в пунктах №15, №13, №11)
  246.  
  247. 18. [!] Запрос к серверу: пользователь ввёл промо-код
  248. <?xml version="1.0" encoding="utf-8"?>
  249. <request type="check-promo-code" protocol-version="9" client-id="a122a4f6ec92dc1e1ecc13eb3ec7b95d" user-entered-promo-code="[!]ПРОМО-КОД" />
  250.  
  251. 19. [!] Ответ от сервера о статусе принятия промо-кода (это, собственно, цель имитации, дальнейшие действия, скорее всего, будут несущественны)
  252. <response protocol-version="9" type="check-promo-code">
  253.    <result value="accepted"/>
  254. </response>
  255.  
  256. ========================================================================================================
  257. Дата последнего изменения: 07.09.14 0:30 МСК
Advertisement
Add Comment
Please, Sign In to add comment