Как обмануть программу 1с
Нейронные сети – не единственная модель, реализующая принципы машинного обучения. Есть еще байесовская модель, которая математически строже и определеннее, поскольку построена на надежном фундаменте теории вероятностей. Применению байесовского вывода к решению интересной теоретической задачи и посвящена данная статья. Слово "взлом" в заголовке использовано для привлечения внимания. Речь идет исключительно о математическом методе, показанном на примере знакомой всем задачи.
1. Задача
Суть решаемой задачи заключается в следующем:
2. Немного теории
В основе байесовской модели лежит понятие распределения вероятностей. Оно определяет вероятность каждого из возможных исходов некоторого "случайного" события. Например, бросание игрального кубика характеризуется распределением вероятностей (1/6, 1/6, 1/6, 1/6, 1/6, 1/6), а правильность выбранного "вслепую" варианта ответа описывается распределением (1/5, 1/5, 1/5, 1/5, 1/5). Исходное распределение вероятностей, называемое априорным, может впоследствии уточняться при поступлении дополнительной информации о событии. Например, если стало известно, что число, выпавшее при бросании кубика, четное, то уточненным распределением вероятностей будет распределение вероятностей (0, 1/3, 0, 1/3, 0, 1/3). Уточненное распределение вероятностей называется апостериорным, а процесс расчета апостериорного распределения на основе дополнительной информации и на основе априорного распределения называется байесовским выводом. Вывод производится на основе формулы условной вероятности или формулы Байеса:
Р( А | Б) = Р( АБ ) / Р( Б ) = Р( Б | А ) Р( А ) / Р( Б ),
где А - исследуемое событие, Б - зависимое событие, которое оказывается произошедшим в свете полученной дополнительной информации.
В одной этой формуле и заключается вся суть байесовской модели.
В следующий раз апостериорное распределение, полученное на предыдущем шаге, считается уже априорным и с получением следующей порции информации оно опять пересчитывается. До тех пор пока не будет достигнута максимальная определенность, например, распределение вероятностей не выродится в единичный вектор вида ( . 0, 1, 0, . ), что означает, что вероятен один единственный исход исследуемого события.
Мера неопределенности по ходу обучения может оцениваться формулой для расчета энтропии:
Σ j = 1,n | - Pj log(Pj) |
В процессе обучения эта мера должна снижаться, что характеризует прогресс обучения.
3. Алгоритм решения
В рассматриваемой задаче исходная неопределенная ситуация характеризуется распределениями вероятностей правильности каждого варианта ответа на каждый из вопросов. Первоначально все варианты ответа на каждый вопрос считаются равновероятно правильными, а неопределенность максимальна.
4. Подробности реализации
Для выбора варианта ответа и пересчета вероятностей Р1 - Р5 в выбранных по номеру текущего теста строках таблицы используется следующая процедура:
Для четырех знаков эта простая функция порождает последовательность "0000", "0001", "0010", "0100", "1000", "0011", "0101", "1001", "0110", "1010", "1100", "0111", "1011", "1101", "1110", "1111", "0000" и так далее.
5. Практическая проверка
6. Выводы
Как видно, байесовская модель точно подошла к решаемой задаче и позволила получить решение с минимальными затратами времени и других вычислительных ресурсов.
Это значит, что несмотря на то, что сейчас внимание исследователей и заинтересованной общественности приковано в основном к нейронным сетям, последние не всегда являются "серебряной пулей", а классические модели еще рано выкидывать на свалку. Тем более, что ажиотаж вокруг нейронных сетей может закончится так же внезапно, как начался, с исчерпанием круга решаемых ими задач [ ссылка ]. Кстати, нейросетевые модели прекрасно комбинируются с байесовским выводом в нейробайесовских моделях, пропагандируемых, например, Ветровым [ ссылка ].
Эта замечательная задача была придумана Максимом Б (Xershi) и предложена им в ходе обсуждения реальных практических задач для нейронных сетей. Решение, найденное в ходе обсуждения, показалось настолько поучительным, что была высказана просьба и получено согласие использовать эту задачу для публикации найденного решения.
Ранее в нескольких хардкорных публикациях мы говорили о работе с журналом регистрации нестандартными способами:
Настало время поговорить о чем-нибудь простом, приземленном. Поговорим о теме, актуальной для всех. Как разработчикам и администраторам, так и простым пользователям. О том, как случайными (или не всегда случайными) действиями можно уронить информационную систему на платформе 1С. Причем это могут сделать почти все, кто работает с ней, не только божественные администраторы и разработчики.
Даже простой пользователь в силах создать серьезные проблемы в ее работе самыми обычными рабочими действиями. В лучшем случае работа будет исправлена в течении короткого промежутка времени, в худшем может потребоваться вмешательство эксперта для анализа и исправления ситуации. А иногда даже потребуется реализация большого проекта.
Полный рандом
Все персонажи являются вымышленными. Любое совпадение с реальными событиями и людьми случайно.
Трэш и угар
Практически все случаи, которые будут описаны далее, не являются проблемами самой платформы 1С, а лишь являются результатом непродуманной разработки конфигураций, решений на ее основе, ошибками внедрения, сделанными настройками и так далее. Но давайте уже к делу :)
Мой личный номер
Теплым летним днем на линию поддержки прилетает ошибка при записи заказа клиента.
Начинается расследование. Выясняется, что кто-то вручную изменил номер документа заказа клиента на максимальный, тем самым остановив ввод новых документов. А значит и продаж (хотя может и нет). А значит, что будут последствия и не малые. Конечно, пользователи могут найти и обходной путь, особенно если это заказ клиента. Но если бы это была реализация или другой более критичный документ? Проблемы были бы в любом случае, но масштаб, конечно всегда разный.
Даже если героя найдут по данным журнала регистрации или полю "Ответственный" в документе, то это ничего не изменит. Кто-то другой может также изменить номер в будущем и не только в заказах клиента. Да и текущую проблему нужно решать. Перед редактированием номера появляется предупреждение, но кто его читает!
Ситуация может ещё более плачевной, если вручную номер изменят не сразу на максимальный, а близкий к максимальному номер. Тогда ошибка появится через некоторое время. А если старые документы будут уже в закрытом периоде, то и перенумеровать их для исправления ошибки уже будет не так просто (тут может влиять еще периодичность нумерации, но смысл думаю понятен).
Выводы:
- Сломать нумерацию в документах 1С просто, если разрешено ручное изменение номера. А в большинстве случаев это именно так.
- Аналогичные проблемы распространяются на все объектные сущности: документы, справочники и т.д.
- Необходимо серьезно подходить к вопросу ручного изменения номеров и кодов объектов, даже если таких проблем у Вас еще не возникало.
- Будьте бдительны, возможно такая бомба уже есть в Вашей системе. Ведь она есть во многих типовых и отраслевых решениях.
Проблема может быть решена запретом редактирования номеров и кодов объектов. Как это сделать именно в Вашей конфигурации зависит от многих факторов, так что универсального ответа давать не буду. Можно посмотреть готовые решения здесь на Инфостарт, инновационного здесь ничего нет.
Отфильтруй мне это
Представьте, с теми же заказами клиентов работает менеджер, у которого свои собственные задачи. Например, руководство поставило ему задачу найти все заказы со статусом "Ожидается согласование", у которых сумма заказа в диапазоне от 10 тыс. руб. до 50 тыс. рублей или более 500 тысяч. Не важно почему такие условия, просто нужно и все тут. При этом попросили исключить нескольких клиентов из этого списка. Исполнительный менеджер идет в список заказов, далее "Еще -> Настроить список". Тут задает условия точно так, как нужно.
Если количество заказов не большое, то все будет хорошо и система обработает такой запрос. Но если их сотни тысяч, миллионы? Ну, Вы понимаете о чем я? ;-)
Подобный отбор в списке еще не самый изощренный с которым можно столкнуться. В результате применения подобных отборов на большой базе могут появиться серьезные тормоза не только в работе сеанса этого пользователя, но и всей информационной базы. Ситуация может усложниться еще и тем, что они могут быть установлены несколькими сотрудниками. Что на это скажет Ваш сервер баз данных? Правильно, ему может быть очень нехорошо и всеобщие "тормоза" в системе в таких случаях не редкость.
Еще интересный момент - это автоматическое сохранение пользовательских настроек в динамических списках. По умолчанию в новых версиях платформы эта опция включена. В конфигураторе она указывается в свойствах динамического списка.
Если пользователь поставил "тяжелый" отбор и у него "подвисла" программа на длительное время, и он дождался завершения операции, то при следующем открытии эти отборы будут восстановлены. Это значит, что подвисание появится теперь уже при открытии и коллега будет сильно удивлен, почему список стал открываться так долго.
В обычных ситуациях сотрудник, который столкнулся с таким поведением, старается таких отборов больше не ставит и даже не пишет в службу ИТ для исправления ситуации (у них и так много проблем :)). В других же случаях функционал используют далее не смотря на медленную работу, тем создавая другие проблемы производительности.
Выводы:
- Динамические списки с произвольными отборами - это тоже медленные бомбы как и нумерация.
- Чем больше возможностей, тем больше ответственность. Но пользователи программы не догадываются о ней.
- Простой вариант решения - отключить возможность гибких отборов через "Настроить список" и через Ctrl+F. Добавить ограниченный набор отборов на форму для основных вариантов поиска. Но это нужно постараться сделать, потребуются доработки конфигурации.
- Сложный вариант - полностью изменить логику поиска в списках. Можно использовать стандартный полнотекстовый поиск или реализовать свой внешний сервис. Но это другая история.
Динамические списки периодически могут становиться причиной падений и замедления работы. По опыту именно запросы в списках чаще всего попадают в ТОП по нагрузке сервера СУБД, даже обгоняя тяжёлые отчеты. Да, именно так. Ведь отчет запускают один раз, а динамический список используют постоянно. А если вспомнить отборы "По вхождению строки", то.
Отчет на все времена
Еще один вариант шикарного использования динамического списка - это замена для отчетов. Например, сотруднику понадобилось проанализировать заказы клиентов за последних два года в разных разрезах. Готовых отчетов в системе не нашлось, а просить у разработчиков новый отчет дело долгое, да еще и тестировать придется. А там еще и аналитика надо найти. Есть ведь путь проще!
Решение простое - в динамический список добавить нужные колонки через "Изменить форму", поставить нужные фильтры через "Еще -> Настроить список" и выгрузить весь сформированный список в Excel, предварительно нажав Ctrl+A. Profit!
Добавляем поля от ссылки через "Еще -> Изменить форму" от ссылки (если такое доступно, конечно).
Далее нажимаем Ctrl+A (выделяя все записи) и выгружаем все что подготовили.
Что может пойти не так? Да очень многое:
- При выделении записей в списке платформа выполнит огромное количество служебных запросов, особенно если записей в базе очень много.
- Если установлены "тяжелые" отборы как в предыдущем примере, то это может создать значительную нагрузку на сервер баз данных.
- Выгрузка списка в Excel может значительно увеличить размер сеансовых данных на сервере 1С. Вплоть до использования всего свободного пространства на диске.
- Подобная выгрузка может выполняться очень долго. В том числе и не завершиться никогда.
Выводы:
- Это еще одна пасхалка от динамических списков.
- Встретить подобное использование списков можно во многих компаниях. Многие разработчики даже не подозревают, что вытворяют их коллеги от бизнеса.
- Решить проблему можно либо запретом гибких настроек списков и отборов, либо реализацией выгрузки данных специализированными отчетами со строго ограниченными настройками.
Как умеем, так и выгружаем :)
Мой справочник, мой!
Еще забавный кейс. Сотрудник сформировал печатную форму, в шапке которой фигурирует организация. Все бы ничего, но ему название не понравилось и необходимо было поменять на более подходящее. В самой печатной форме прав на изменение содержимого не оказалось, но есть и другой путь! Изменить название организации в самой элементе справочника!
Например, вот сформированная печатная форма заказа клиента.
Тут выяснилось, что "ЗАО "Торговый дом Комплексный" - не то что нужно для заказа клиента. Но у пользователя были закрыты права на редактирование содержимого печатной формы, а вот, о чудо, изменять справочник "Организации" было разрешено. Ответ очевиден! Нужно изменить наименование организации.
После этого в печатной форме все сформируется как надо.
Все было бы хорошо, но:
- Это же многопользовательская система. Все кто формировал печатные формы после этой манипуляции тоже получат это название. Всех ли оно устроит? Будет ли кто-то опять переименовывать справочник?
- Даже если исходное наименование вернут обратно, ошибок и вопросов в системе за короткий промежуток времени может накопиться порядочно.
- Также могу сломаться большое число "костылей", если Вы их практикуете в работе. Речь идет о поиске по наименованию, синхронизации организаций в конвертации по наименованию и прочее.
- Риск нарушения работы будет присутствовать постоянно. А если пользователи будут менять не наименование, а ИНН, КПП, платежные реквизиты?
В общем, права доступа вещь серьезная.
Вывод: проверьте, нет ли таких "пасхалок" в Вашей системе. Только грамотная настройка прав доступа сможет от такого защитить.
Нужно больше сеансов
Еще одним особенным случаем является множественный запуск сеансов 1С одним пользователем. Причин может быть несколько:
- Есть тяжелые операции, которые проще запускать сразу в нескольких сеансах, чтобы ускорить работу с программой:
- Тяжелые отчеты, которые не выполняются в фоновом режиме.
- Проведение некоторых документов занимает очень много времени.
- Поиск в динамических списках не отличается быстрым откликом. Почему бы тоже не запустить несколько сеансов.
К чему это может привести:
- Дополнительная нагрузка на сервер 1С и СУБД, если тяжелый отчет запускается многократно в разных сеансах. Даже если отчет выполнится, и пользователь его просто не дождался, то все равно излишняя нагрузка будет присутствовать.
- Бесконтрольное выполнение тяжелых алгоритмов в информационной базе.
- Излишнее использование лицензий при определенной конфигурации сервера и настроек лицензирования.
- Ошибки прикладного решения, которые может никогда бы и не всплыли в обычной работе. Все ли в порядке с установкой блокировок при параллельной работе сеансов / пользователей?
Иногда решением может быть контроль запуска нескольких сеансов одним пользователем, но такой подход не всегда рабочий. Нужно разбираться с конкретной ситуацией.
Вывод: запуск нескольких сеансов одним пользователем удобный подход, но с некоторыми рисками.
А как обстоят дела у Вас?
Перепровести все!
Еще немного про динамический список. Может случиться так, что пользователь через Ctrl+A выделит большое количество документов и нажмет "Провести" (или отмена проведения, или пометка на удаление - не важно). Что в этом случае будет? Правильно - на сервере начнется настоящее "веселье", ведь эта операция явно не самая легкая по использованию ресурсов. А если были выделены все документы за месяц?
Замедление работы системы и появление таймаутов на блокировках - это только одна беда. Еще могут появиться расхождения в данных отчетов и прочие непредсказуемые последствия.
Какое может быть решение по запрету таких действий? Тут тоже все зависит от контекста, свою систему Вы знаете лучше. Но можно предложить:
- Запрет проведения документов предыдущих дней в зависимости от прав доступа.
- Сделать мониторинг массовых операций пользователями. В случае появления любой большой операции отправлять уведомление администратору.
- Организационные решения вопроса :)
В любом случае, такое поведение возможно во всех решения на платформе 1С. Лишь в некоторых мне встречались защиты от подобных действий.
Вывод: динамические списки вещь особая как и права доступа. Нужно внимательно относится к их возможностям.
Я скачал с Инфостарта!
В некоторых компаниях никто не беспокоится о том, что у пользователей программы есть доступ к открытию внешних отчетов и обработок из файлов. Это хорошо, доверие штука классная. Но что, если пользователь скачает, например, вот такую обработку и запустит, не предупредив доблестных воинов ИТ-отдела. Да любую другую обработку, которая может сделать самые непредсказуемых действий в руках пользователя.
Повезет, если права доступа все же остановят работу неизвестного инструмента. Но всегда ли такое будет? А сгенерированные ошибки в данных могут "всплыть" только спустя пару месяцев.
Тут можно сразу и закончить.
Вывод: закрывайте доступ на открытие внешних отчетов и обработок из файлов. Альтернативы просто нет.
Я у мамы программист
Еще один хардкорный случай - это когда с правами доступа совсем беда, а главный бухгалтер - бывший программист или консультант. Даже если с правами все ОК, то для такого высокопоставленного сотрудника они могут быть полные. Что может пойти не так? Правильно! Сотрудник для решения своих проблем зайдет в конфигуратор и запрограммирует все что ему нужно. Или выгонит всех пользователей по середине рабочего дня и начнет формировать выгрузку DT'шника, чтобы с ней работать отдельно. Что Вы говорите, база 1 ТБ? Ну на выходных запущу.
Какое здесь решение? Даже говорить об этом не хочется :)
Вне закона
И на последок крайний случай, который, что удивительно, можно часто встретить на этапах внедрения или в небольших компаниях. Суть его проста - у всех в системе выданы полные права. Все, кто там работает могут делать все что угодно. Из этого вытекают и предыдущие проблемы с внешними отчетами и обработка, а также другие проблемы с изменением данных. Тут уже не только изменение ключевых справочников, но и произвольное изменение учетной политики, изменение данных прошлых периодов и прочее "веселье". В любой момент времени может случиться все что угодно!
Решается это построением продуманных прав доступа всем пользователям системы. Добавить тут нечего.
Вы в безопасности
Конечно, часть информации выше имеет шуточный характер. Но в шутке есть только доля шутки. Часть случаев, но в некотором измененном виде, встречал на практике. Иногда хотелось смеяться, иногда плакать.
Поделитесь своими историями и забавными случаями в работе. Поделитесь щепоткой трэша и угара!
Другие ссылки
- В целях цензуры и здравого смысла другие ссылки не стал добавлять, но Вы можете оставить их в комментариях.
Авторские разработки
Транслятор запросов 1С в SQL - инструмент для трансляции запросов платформы 1С в SQL, а также их диагностики.
Просмотр и анализ структуры базы данных (отчет на СКД) - отчет для просмотра и анализа структуры базы данных с поддержкой файловых баз (ограниченный режим), а также баз на SQL Server и PostgreSQL.
Просмотр и анализ журнала регистрации (отчет на СКД) - отчет на базе системы компоновки данных (СКД) для просмотра записей журнала регистрации.
История работы пользователей (отчет на СКД) - отчет для просмотра истории работы пользователей (СКД, просмотр для любого пользователя).
Экспорт журнала регистрации. Набор инструментов (приложения + исходный код) - набор инструментов для экспорта данных журнала регистрации во внешние хранилища для Windows и Linux. Готовые приложения и исходный код.
Путеводитель по истории релизов - отчет по истории выпуска релизов продуктов фирмы "1С" и анализа информации по обновлениям.
-
Помощник работы с идентификаторами объектов - инструмент для расширенного анализа идентификаторов объектов.
Анализ производительности APDEX (бесплатный) - отчет для просмотра и анализа замеров производительности в конфигурациях на базе БСП.
Обозреватель криптографии - отчет для просмотра доступных провайдеров и сертификатов криптографии на сервере и клиенте.
Пакетная выгрузка / загрузка внешних отчетов и обработок - пакетная выгрузка / загрузка внешних отчетов и обработок для массовый манипуляций с ними.
Мастер полнотекстового поиска - набор инструментов для работы с полнотекстовым индексом платформы 1С. Стандартные и расширенные возможности.
Командный интерпретатор для 1С - инструмент для выполнения команд CMD / PowerShell из 1С
Ни один разговор о взломе и модификации приложений не обходится без упоминания дизассемблера, дебаггера, формата исполняемых файлов и вездесущей IDA Pro. Однако в случае с Android все намного проще, и здесь для вскрытия и даже внедрения кода в приложение совсем не обязательно использовать все эти инструменты. Код можно легко декомпилировать обратно в Java и модифицировать, используя пару простых инструментов и текстовый редактор.
Этой статьей мы начинаем цикл, посвященный вскрытию и модификации приложений для Android. Первая часть — вводная, поэтому никакого хардкора: мы разберемся в устройстве пакетов APK, научимся разбирать APK на части, декомпилировать его код, вносить правки и собирать обратно, и в качестве примера взломаем одно популярное приложение из маркета. Вторая статья будет целиком посвящена внедрению бэкдора/вируса в чужое приложение. Это уже не просто правка нескольких строк, а глубокая модификация. Третья статья — методы обфускации и их обхода. Все больше разработчиков используют нетривиальную обфускацию, чтобы осложнить жизнь реверсерам. Мы распутаем их код и опять же внесем правки в приложение.
WARNING
Это ознакомительная статья, призванная всего лишь показать процесс взлома приложений. Она не призывает тебя заниматься варезом и лишать доходов людей, потративших многие недели на создание приложений. ASAP Launcher — великолепное приложение без навязчивой рекламы, почти вся полезная функциональность доступна бесплатно. Поэтому вместо того, чтобы использовать крякнутую версию, лучше купи полное приложение и поддержи разработчика. Оно обойдется тебе всего в 100 рублей.Снаряжаемся
Для выполнения описанных в статье действий понадобится ряд инструментов, и главный инструмент — это Linux. Да, многие из названных далее программ могут работать и в Windows, но в любых операциях, связанных с Android и его приложениями, лучше не полагаться на детище Билли. В Linux практически все сделать проще, командная строка здесь в разы удобнее (она нам ох как понадобится), а некоторые инструменты просто недоступны для других ОС.
После установки Linux в виртуалку или второй системой сразу устанавливаем средства разработки на Java и виртуальную машину. В Ubuntu это можно сделать с помощью одной команды:
Также нам нужны четыре инструмента для распаковки и декомпиляции приложений:
-
— швейцарский армейский нож для распаковки и запаковки приложений; — декомпилятор байт-кода Dalvik в код на Java; — дизассемблер кода Dalvik (не пугайся, с настоящим ассемблером он имеет мало общего); — утилита для подписи пакетов.
Для удобства создадим в домашнем каталоге подкаталог Android и скачаем эти инструменты в него:
Добавим в конец файла ~/.bashrc следующие строки:
Они нужны для того, чтобы вместо длинных и неудобных команд вроде java -jar ~/Android/sign.jar можно было набрать просто sign.
Вскрываем подопытного
Теперь нам нужно найти приложение, которое, во-первых, нетрудно расковырять, а во-вторых, которое несет какую-то пользу и достаточно известно. То есть брать простейшую софтину только для того, чтобы было не очень сложно разобраться в ее коде, мы не будем, а вместо этого устремим свой взор на топ Play Store. Практически идеальный кандидат на эту роль — выпущенный два месяца назад ASAP Launcher, удобнейший домашний экран с массой полезных и неординарных функций.
Другие статьи в выпуске:
Для удобства переименуем пакет в asap.apk:
Разархивируем с помощью unzip:
Да, APK — это обычный архив ZIP, но тем не менее он имеет четкую структуру:
- META-INF — каталог, содержащий файлы MANIFEST.MF, CERT.MF и CERT.RSA. Первые два — список всех файлов пакета и их контрольных сумм, последний содержит открытый ключ разработчика и созданную с помощью закрытого ключа цифровую подпись файла CERT.MF. Эти данные нужны, чтобы при установке пакета система смогла выяснить, что пакет не был модифицирован и действительно создан его автором. Это важно, так как, поскольку нет возможности подделать цифровую подпись пакета (для этого нужен закрытый ключ), модифицированный пакет придется подписывать другим ключом;
- res — ресурсы приложения. Здесь находятся иконка (mipmap), переводы строк (values), изображения (drawable), а также описания интерфейса приложения (layout). Все их можно модифицировать, чтобы изменить внешний вид приложения. Правда, файлы XML придется сначала «разжать» — для улучшения производительности они хранятся в бинарном формате;
- classes.dex — код приложения в форме байт-кода виртуальной машины Dalvik. Обычно приложения содержат только один такой файл, но, используя директиву multiDex, разработчик может заставить среду разработки разбить его на множество более мелких для улучшения производительности или преодоления ограничения на 65 536 методов в одном dex-файле;
- AndroidManifest.xml — манифест приложения, описывающий его структуру, включая активности, сервисы, обработчики интентов и так далее. Опять же в формате бинарного XML.
Также пакет может содержать другие каталоги, например assets (любые файлы, включенные разработчиком, в данном случае — шрифты и база данных) и lib (нативные библиотеки, созданные с использованием Android NDK).
Изучаем код
Само собой разумеется, просто разархивировать пакет недостаточно. Чтобы разобраться в работе приложения, необходимо декомпилировать файл classes.dex.
Для этого мы воспользуемся jadx-gui. Запускаем, выбираем asap.apk и видим слева список пакетов Java, включенных в APK. В данном случае это пакеты android.support — официальная библиотека Google, реализующая поддержку функций новых версий Android в старых (например, чтобы получить Material Design в Android 4.1), com.google.android.gms — Google Mobile Services, com.nispok.snakbar — реализация GUI-элемента snakbar, а также несколько других.
Основной код приложения содержится в пакете com.citc.asap, именно такое имя носит и само приложение в Google Store и на устройстве. Открываем его и видим больше десятка каталогов и множество исходников Java. Наша задача — сделать приложение «оплаченным», не платя за него. Но как найти нужный файл, реализующий проверку на оплату? Скорее всего, он будет содержать в имени слово billing. Пробегаемся по исходникам в поисках нужного нам файла и натыкаемся на исходник BaseBillingFragment в подкаталоге (пакете) fragments:
Это очень простой класс Java, в котором есть интересный метод:
Все, что он делает, — просто возвращает значение поля mHasPrime, однако интересен он не этим, а своим именем. Дело в том, что платная (точнее, оплаченная) версия ASAP называется Prime, и очевидно, что метод hasPrime как раз и нужен для проверки оплаты приложения. Чтобы подтвердить свою догадку, сохраним декомпилированные исходники (File -> Save all) в каталог и попробуем найти в них вызовы hasPrime():
Совпадений немного, основной «пользователь» hasPrime() — это SettingsFragment, то есть исходник, отвечающий за формирование окна настроек. Учитывая, что Prime-версия отличается от бесплатной именно тем, что в ней разблокированы дополнительные поля настроек, уже сейчас мы можем быть на 90% уверены, что hasPrime() — нужный нам метод. Скорее всего, именно с его помощью приложение выясняет, куплена ли Prime-версия. Осталось только убедиться в этом окончательно, подменив код метода на свой.
Вносим правки
Метод hasPrime() очень прост: он возвращает значение поля mHasPrime, которое имеет тип boolean. Нетрудно предположить, что в случае, если приложение оплачено, hasPrime() вернет true, иначе вернет false. Наша задача — сделать так, чтобы метод всегда возвращал true и остальная часть приложения думала, что приложение оплачено, и разблокировала дополнительные опции в окне настроек.
К сожалению, сделать это с помощью прямой правки исходного кода не получится: приложение нельзя скомпилировать обратно. Однако никто не запрещает дизассемблировать код, внести правки и собрать его вновь. И как раз здесь нам понадобится apktool. Дизассемблируем APK:
В текущем каталоге появится подкаталог asap. Открываем файл asap/smali/com/citc/asap/fragments/BaseBillingFragment.smali и находим hasPrime() . Декларация метода будет выглядеть так:
Это и есть дизассемблированный листинг, и, как ты видишь, он на порядок проще, чем дизассемблированный код нативных приложений. В целом здесь все тривиально:
- .method protected hasPrime()Z — объявляет protected-метод, который возвращает значение типа boolean (Z);
- .locals 1 — говорит виртуальной машине, что метод использует в своей работе один регистр (в данном случае он будет содержать возвращаемое значение);
- .prologue и .line 167 — директивы, необходимые для отладки, на ход исполнения не влияют;
- iget-boolean v0, p0 . — получает значение поля типа boolean и записывает в регистр v0, регистр p0 — это нулевой параметр, он всегда равен имени класса (this);
- return v0 — возвращает значение регистра v0;
- .end method — закрывает тело метода.
Теперь мы должны изменить данный метод так, чтобы он возвращал true независимо от значения поля mHasPrime . Мы могли бы сделать это вручную, но проще написать новый метод на Java:
И пропустить его через компилятор и дизассемблер:
На выходе получаем следующий ассемблерный код:
Ты уже должен сам догадаться, что он объявляет константу v0 со значением 1 и возвращает ее (в Dalvik тип boolean — это int, который может иметь значение 1 — true или 0 — false). Осталось только вставить этот код вместо оригинального и собрать пакет обратно:
Пакет появится в каталоге asap/dist . Переименуем его, чтобы не запутаться:
И подпишем с помощью тестового ключа:
В результате в текущем каталоге появится файл asap-fake-hasPrime.s.apk. Остается только закинуть его на карту памяти и установить, удалив перед этим оригинальное приложение.
Выводы
Взломать приложение для Android очень и очень просто. Да, я не спорю, нам попался удобный и простой пример для модификации, но опять же повторюсь — это весьма популярное приложение, о котором рассказывали на большинстве сайтов, посвященных Android.
Большинство других приложений вскрыть так же просто, однако есть достаточное количество экземпляров, пропущенных через обфускаторы и различные системы защиты. С ними все несколько сложнее, и таким приложениям будет посвящена третья статья цикла. Во второй статье мы рассмотрим, как тот же самый метод модификации использовать для внедрения собственного кода.
Евгений Зобнин
Редактор рубрики X-Mobile. По совместительству сисадмин. Большой фанат Linux, Plan 9, гаджетов и древних видеоигр.
Как гласит народная мудрость, театр начинается с вешалки, а программа — с инсталляции. Но что делать, если инсталлятор не желает запускаться или, хуже того, не хочет устанавливать приложение? Любой читатель «Хакера» уверенно скажет: ломать! И будет прав. Сегодня мы поговорим о том, как сделать это просто, быстро и без лишних усилий.
Здравствуйте, мои юные ленивые друзья. Признайтесь честно: основная причина, по которой вы читаете этот текст, — желание научиться ломать программы форсированным методом, минуя муторную и скучную стадию освоения матчасти и всевозможных мануалов? Не нужно этого стесняться, и пусть кто-нибудь скажет, что в этом есть что-то плохое. Я и сам такой, всегда стараюсь решать задачу наиболее простым и интуитивным методом. Ибо нельзя объять необъятное, а предварительное штудирование теории (которой по каким-то вопросам вообще может не оказаться в свободном доступе) вполне способно сделать срочную задачу неактуальной. Поэтому я стараюсь следовать совету старого английского философа: сперва всегда старайся делать все наиболее простым путем, а уж если не получается — начинай грызть мануалы.
Попробую объяснить этот принцип на примере правки одного инсталляционного пакета. На днях меня попросили поковырять одну старую программу. Программа давным-давно была куплена совершенно официально и служила верой и правдой, пока не пришлось ее переустанавливать. При переустановке выяснилось, что, во-первых, она не устанавливается на современные версии Windows, а во-вторых, все имеющиеся серийные номера подходят, за исключением одного — лицензионного кода к небольшой вспомогательной библиотеке, без установки которой программа отказывается нормально функционировать. Поскольку за давностью лет связаться с разработчиком не представляется возможным, я решил поковырять установщик, чтобы разобраться, какого рожна ему надо для нормальной инсталляции.
Ну что ж, не очень-то и хотелось, зато попутно краем глаза я заприметил ресурс [0] с характерной сигнатурой InstallShield . В принципе, разбор пакетов InstallShield — распространенная задача, и решение ее хоть по понятным причинам и не документировано, но при желании находится поиском по специальным форумам. Я, возможно, запилю об этом другую статью, но в данном случае мы условились, что курение мануалов не наш метод.
Продолжение доступно только участникам
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
21 апреля пользователи Сети начали сообщать о проблемах с работой всех сервисов 1С. Недоступны обновления, невозможно зайти в личный кабинет и на сервис ИТС, не работает ЭДО и 1С:отчётность. 25 числа необходимо подавать отчёт в налоговую, но его невозможно подготовить из-за сбоя.
В официальном Telegram-канале 1C:Франчайзи появилась информация, что доступ к сервисам пропал из-за DDoS-атаки на ресурсы 1С и часть сайтов компании.
По неподтверждённой информации, кроме 1C DDoS-атаке подверглись РАР и ФСС.
Информационная служба Хабра направила 1С запрос с просьбой дать официальный комментарий по ситуации. Как указали в компании:
«С 21 апреля происходят DDoS-атаки на различные сервисы для учёта и отчётности в организациях, в том числе на ресурсы 1С. Часть наших сайтов и сервисов была временно недоступна или работали медленно и неустойчиво. На данный момент восстановлено нормальное функционирование большинства интернет-ресурсов и сервисов 1С, включая 1С:ЭДО и 1С-Отчетность. DDoS-атаки продолжаются, технические специалисты 1С отслеживают ситуацию и принимают усилия для обеспечения нормального функционирования интернет-ресурсов и сервисов 1С. Угрозы для данных пользователей не наблюдается, они не пострадали и надёжно защищены».
Несмотря на заявление компании, пользователи Сети продолжают жаловаться на полное прекращение работы 1С. В частности, пользователь Хабра @nat_young рассказал, что со вчерашнего дня в работе сервисов практически ничего не изменилось.
Читайте также: