Взлом программ для чайников
Время на прочтение5 мин
Количество просмотров490K
Disclaimer: всё ниженаписанное написано исключительно с просветительскими и исследовательскими целями, а также понимания механизмов защиты от взлома. Автор ни в коем случае не рекомендует использовать данную информацию для взлома программ.
В данной статье я хочу рассказать про три с половиной основных способа взлома программ на .NET, цель, которую я преследую — помочь разработчикам лучше понять механизмы защиты своих программ, т.е. выяснить наиболее очевидные угрозы и предпринять соответствующие меры (или не принимать).
Я не буду углубляться в детали и использовать сложные инструменты для взлома. Всё будет расписано «для чайников», т.е. все инструменты будут простыми, легкодоступными и бесплатными. А основным будет Reflector, декомпилятор программ под .NET
В качестве подопытного кролика я выбрал Expresso — анализатор регулярных выражений. Данная программа бесплатная, в лицензии вроде бы ничего не указано про взлом, но при этом без регистрации она будет работать всего 60 дней. Другими словами, вред от взлома данной программы минимальный, к тому же внутреннее её устройство очень уж хорошо подходит для тренировки. Буду надеяться, что автор данной программы не обидится на меня.
Для начала краткий ликбез по структуре .NET программы, для тех кто не знаком с разработкой под данный Framework: весь код, написанный на любом .NET языке (C#, Visual Basic, F#, Delphi.NET) компилируется в особый Intermediate Language, называемый обычно IL или MSIL. Это что-то типа ассемблера, только весьма умного и обладающего весьма мощными инструкциями. И это, в принципе, такой же равноправный язык как и C#, только синтаксис похуже (а возможности больше). Кроме того, в программе на .NET активно используются метаданные, т.е. вся информация о классах, метода, пропертях, атрибутах и всём остальном сохранена в исполняемом файле.
Т.е. на самом деле, декомпиляция программы не очень верное понятие в данном случае. Она и так вся в открытом виде лежит, а инструменты в виде Reflector’а занимаются тем, что приводят конструкции MSIL к соответствующим конструкциям C# или другого языка, повышая читабельность кода.
Перейдём, собственно, к взлому.
0. Обнуление триала
Собственно, это даже не взлом, а полулегальный способ продлить срок использования неактивированной программы. Заключается он в том, что находится место, где хранится дата первого запуска и меняется/уничтожается. После этого всё можно пользоваться программой до следующего срока.
Посмотрим на нашего подопытного рефлектором. Немного погуляв по коду, находим интересную строчку в конструкторе MainForm:
Открываем редактор реестра, идём в HKEY_CURRENT_USER\Software\Ultrapico\Expresso и видим следующие ключи:
Удаляем их и получаем ещё 60 дней работы.
Данный вариант, конечно, прост и очевиден, но если он даже был бы сложнее — потребовалось бы чуть больше времени провести в рефлекторе, чтобы выяснить все места, куда пишется информация и зачистить их.
Совет разработчикам, которые будут пытаться записать данные в потаённое место: пишите аккуратнее, а то всё может обернуться проблемами обычным пользователям, у которых почему-то не окажется данного места, или не хватит на него прав.
1. Написание keygen’а
Самый ужасный для разработчика вариант, и самый приятный для конечного злобного пользователя. Программа считает себя лицензионной, никаких страшных телодвижений не нужно делать.
Открываем рефлектор и ищем код на предмет классов содержащих License или Registration, видим:
При вводе имени и кода по имени вычисляется некий хеш, который и сравнивается с кодом.
Данный хеш использует DES и всякие префиксы
Байты конвертятся в строку с помощью данного метода.
Теперь всё выяснилось, открываем IDE и копируем все необходимые куски кода (или сами реализовываем). Осталось только выяснить, какие значения у Prefix, Suffix и параметры реализации MyDES. Я их приводить не буду, это уже технические детали.
В результате генерируем ключ на любое имя и видим:
Бинго!
Защита от кейгенов проста и очевида: использовать в каком либо виде ассиметричное шифрование. Т.е. сделать так, чтобы без знания приватного ключа сгенерировать код было бы невозможно, а данный ключ находится только в одном месте — у автора программы.
2. Использование враппера
Проверка корректности лицензии, достаточно хлопотное дело, и небыстрое. Поэтому разработчики программ обычно проверяют лицензию один раз, и дальше используют полученный флажок — валидна/невалидна (как вариант насколько валидна, если допускается несколько типов лицензии, отличающихся возможностями). Тут можно на этом сыграть, использовав следующий алгоритм:
- Указать программе, что лицензия уже проверена
- Указать программе, что лицензия корректна
Как это сделать? Я уже упоминал о наличии метаданных в исполняемых файлах в начале, этим и воспользуемся. Посмотрим как запускается программа и как проверяется лицензия:
С запуском ничего интересного, а в проверке видно, что если уже программа зарегистрирована, то она считает, что всё хорошо и не делает дальнейшую работы по выяснению корректности лицензии.
Воспользуемся этим. Сделаем новый проект, добавим Reference на Expresso.exe и запустим его через себя:
Смотрим, что получилось:
Ну кто бы сомневался.
В данном случае всё оказалось просто, но если бы автор программы заменил публичные свойства на приватные, то всего-лишь пришлось бы использовать Reflection для доступа и всё бы свелось к исходной задаче.
Думаю понятно, как можно пробовать защититься от этого — проверять лицензию периодически, смотреть окружение из которого запущена программа, сделать невозможным установку нужной переменной.
Но все эти защиты приведут к тому, что злоумышленник будет использовать
3. Физический взлом программы
Тут уже всё серьёзно. Программа целиком декомилируется в MSIL а из него уже собирается обратно (помните, я писал, что MSIL это такой же язык как и C#?). Для декомпиляции нам понадобится утилита из SDK под названием ildasm, а для компиляции компилятор из .NET Framework ilasm.
Запускаем ildasm, открываем Expresso.exe и сохраняем дамп в .il файл. Находим уже рассмотренный метод IsRegistered и добавляем немножко своего кода (без меток):
Потом берём ilasm и собираем всё назад (не забыв подключить ресурсы).
Что делает данный код: устанавливает нужное имя для регистрации (не обязательно), и возвращает статус, что всё хорошо.
Чтобы было понятнее, так это выглядит в рефлекторе, в C#
Т.е. вполне очевидно, что теперь всё будет хорошо:
Немного про код в MSIL: это стековая машина, у которой нет регистров, все операции имеют вид: засунуть в стек нужное количество параметров, выполнить функцию, которая заберёт нужное количество параметров и положит результат. Ну и обратно: установить значение переменной тем, что лежит в стеке. Чтобы лучше понять работу всего этого рекомендую простой приём: пишите маленькую программу на привычном языке, компилируете, смотрите что получилось в MSILe и разбираетесь в конструкциях языка.
При этом некоторые вещи в MSIL можно сделать очень красиво, например поменять две переменные местами — 4 симпатичных строчки (на C# меньше, но некрасиво).
Чем жертвует злоумышленник: подписью программы, теперь она уже не автора, а его. В некоторых случаях это проблема, если в программе используется множество библиотек. Тогда злобному хакеру придётся разбирать их все и собирать их заново, но если он с этим справится, то у него будет «своя» версия программы подписанная его ключом.
Защиты от всего этого безобразия собственно немного: проводить обфускацию или выносить часть логики/проверки защиты в нативный код.
Заключение
Думаю я рассказал, как просто всё можно разломать на .NET, если создатель не приложил усилий для защиты своей программы. А вы уж решайте, стоит ли делать защиту и тратить на это время и ресурсы. А может просто сделать web-систему, или же бесплатную ограниченную версию. Решать разработчикам.
Загрузить PDF
Загрузить PDF
Вам когда-нибудь хотелось узнать, как программы защищаются от копирования? С помощью нужных инструментов вы сможете разобраться, как программа устроена изнутри, и поэкспериментировать с процессом обратной разработки. Чтобы начать, вам нужно хорошее знание программирования на языке ассемблера и шестнадцатиричного кода, а также программа-дизассемблер. С помощью кода вы сможете изменить DLL-файлы так, чтобы убрать потребность в регистрации или покупке программы.
-
Научитесь программировать на языке ассемблера и работать с шестнадцатиричным кодом. Для взлома большинства пробных версий программ необходимо хорошо знать язык ассемблера, который является языком программирования низкого уровня.[1]
Он является производным от машинного языка, и каждая разновидность языка ассемблера будет зависеть от типа используемого компьютера. Большинство языков ассемблера работают с двоичными и шестнадцатеричными кодами. -
Чтобы изучить и изменить файлы DLL, вам понадобится несколько инструментов, включая дизассемблер. Отличным выбором будет IDA Pro — дизассемблер и отладчик. Его бесплатная версия доступна на https://www.hex-rays.com/products/ida/support/download_freeware, хотя ее возможности существенно ограничены по сравнению с Pro-версией. Также можно попробовать dotPeek — поддерживающий DLL декомпилятор, который транслирует код ассемблера .NET в C#.[2]
Еще один вариант — OllyDBG, позволяющий бесплатно открывать DLL-файлы. -
Откройте программу, которую вы хотите взломать с помощью дизассемблера. Процесс будет немного разным в зависимости от того, какой дизассемблер вы используете. Вы увидите, какие файлы DLL загружает программа. Используйте отладчик, чтобы определить, какие функции вызывают файлы DLL.[3]
-
Во многих программах для защиты от копирования используется таймер, и когда он обнуляется, доступ к программе для пользователя закрывается. Ваша задача заключается в том, чтобы найти и обойти этот счетчик.
- Если в выбранной программе используется иная форма защиты, вам нужно найте ее вместо счетчика.
-
Когда вы выделите функцию счетчика, используйте дизассемблер, чтобы восстановить код в этой контрольной точке. Это позволит изучить код, который используется во время вызова функции счетчика.
-
Теперь, когда вы нашли код для функции счетчика, вы сможете изменить его таким образом, чтобы счетчик никогда не достиг финальной точки отсчета. Например, можно сделать так, чтобы счетчик не смог дойти до конечной точки или перепрыгивал ее.
-
После использования дизассемблера и редактирования вам нужно скомпилировать новую версию программы, чтобы ваши изменения распространились на файлы DLL и другие зависимости.[4]
Реклама
Предупреждения
- Компьютерное пиратство незаконно, так что действуйте на свой страх и риск.
- Взлом большинства программ является незаконным.
Реклама
Об этой статье
Эту страницу просматривали 32 659 раз.
Была ли эта статья полезной?
Ломаем программу с помощью IDA и здравого смысла
@camshiftДисклеймер: статья написана по фану от профанов для профанов.
Вступление
Привет! Некоторое время назад мы обещали написать интересный пост на тему вскрытия, исследования и патчинга активации платного сканера с использованием дизассемблера IDA. И настал тот момент!
В статье будет много и рассуждений о безопасности и логике хакера, и технических подробностей, рассказанных простым языком. Если что-то выглядит слишком простым или слишком сложным — смело пропускай и возвращайся к пропущенному когда будешь готов.
Скучно было бы писать статью на старом материале, но тут в руки нам попал «новый» брутер камер SWC Foscam. Напомню, что это программа для получения доступа и скриншотов из камер, открытых в интернет. Принцип её работы до боли прост: подбираются стандартные логин и пароль, а затем специфичными для внутренностей камеры способами формируется и сохраняется картинка. Мы уже писали о том, что проблема дефолтных паролей очень распространена, и ты можешь не подозревать, что за тобой следят с неясными целями непонятные люди.
Более того, некоторые монетизируют этот доступ, продавая адреса и пароли камер другим. Или продавая инструменты. Наш случай как раз такой: программист начинающего уровня начал штамповать утилиты для взломов чужих камер. Мы негативно относимся к такого рода заработку, тем более когда софт без открытых исходных кодов, глючный, работает по своей особой логике, реализует простейшие и общедоступные вещи.
Итак, к нам в Camshift в руки попал архив с очередной новой программой вышеупомянутого барыги. Этот архив тебе нужен будет далее по тексту, если ты хочешь попробовать себя в хакерстве, следуя этой статье. Ищи его в первоисточнике в нашем канале Telegram, с названием SWC_Foscam_v2_1_original.zip
Мыслить как хакер
У меня для тебя есть две новости, хорошая и плохая. Первая: необязательно знать ассемблер и стопятьсот технических вещей, чтобы уметь заставлять программы работать как тебе нужно. Вторая: нужно уметь настраивать своё мышление и иметь эрудицию, чтобы понимать суть вещей. Быть, своего рода, Шерлоком Холмсом. Это не настолько сложно, как кажется, и мы это покажем ниже.
Автор программы — тоже хакер? Вовсе нет, он барыга, наловчившийся продавать публичные уязвимости камер и даже не заботящийся о последствиях. У него группа в неанонимном ВК, где он продаёт камеры, выкладывает рекламные ролики: записи с рабочего стола, на которых можно разглядеть его имя. На официальных форумах производителей камер мы видели жалобы от специалистов, столкнувшихся с атакой этого софта — в логах соединений на шлюзах оседают все попытки подключения, и по ним при желании можно отследить брутящего.
Лишний раз напоминаем: не стоит слепо использовать эту и подобные программы со своего домашнего компьютера, не подумав о последствиях. Make netstalking, not crack.
Шаг 0: рекогносцировка
Очень сложное и вычурное слово, означающее разведку местности перед боем. В информационной безопасности в обиходе слово «рекон» — изучение инфраструктуры перед попыткой ее взломать. В нашем случае всё куда проще. Хочешь разобраться, как взломать программу? Сначала посмотри на неё внимательно и подумай!
Итак, распаковываем архив и смотрим на содержимое. Если хочешь сперва подумать сам, то поизучай и потом пролистай до следующего абзаца.
Давай по порядку, сверху вниз. Мы видим три папки. Первая при пристальном изучении оказывается папкой со «сторонним софтом» — это утилиты, которые нужны для поиска IP-адресов, которые мы потом должны брутить нашей программой. Они запускаются и используются отдельно, так что, не обращаем больше на эту папку внимания.
Вторая и третья папка похожи на настройки программы и место для хранения картинок. Если раньше ты сталкивался с такими программами, то поймешь это сразу.
Далее давай разберем файлы по типам. Есть большое количество файлов dll. Наверняка ты знаешь, что это так называемые библиотеки. Если по-человечески, это большое количество программ, записанных в отдельный неисполняемый файл. К примеру, libssl32.dll содержит функции для работы с защищенным интернет-соединением. Как это можно понять? lib — стандартный префикс для подобных файлов, ssl — общеиспользуемая аббревиатура, 32 — архитектура библиотеки. Это очевидно, когда знаешь, но когда не знаешь, то нужно посидеть, погуглить всё название или его части.
Итак, большая часть из этих библиотек относится к работе с сетью. Есть ещё две специфические библиотеки с больших букв H. Похоже, что они относятся к камерам Hikvision и их внутренней кухне. Нам это пока ни к чему, но запомним.
Exe-файлы. Запускаемые программы. Видим несколько: hfs.exe оказывается программой wget при ближайшем рассмотрении (открыть свойства файла). Что такое Wget? Это unix-утилита для скачивания файлов. Опять же, возьмём на заметку, что в составе архива есть явно не написанная автором программа. addition.exe и SWC(Foscam)v2.1.exe не содержат никакой информации в свойствах. Предположим, что это и есть две написанные автором программы, причем основная это вторая (она же так круто по-фирменному названа!), а первая — дополнение (можно догадаться, переведя название). Запомним и это неочевидное разделение.
Наконец, текстовые файлы. ERROR_PASSWORD.txt содержит пары IP:порт. Видимо, от камер, где не подошли пароли, как можно догадаться.
И, наконец, ReadME!!!.txt. Мы бы могли прочитать его с самого начала, но мы же не ищем лёгких путей, да? Нет, читайте всегда ридми первым делом. Серьёзно.
Не будем здесь приводить полное содержание файла, только выводы из него. Можешь прочитать его сам и подумать, затем сравнить с нашими выводами.
Итак, мы поняли следующее:
1) В архиве должен был быть исполняемый файл First_start.exe, который выдаёт ключ для активации программы. Но его нет!
2) Исполняемый файл SWC(Foscam)v2.1.exe собран под чей-то ключ. То есть, у нас чужая копия программы, неизвестно каким ключом активированная.
3) Наши догадки по поводу настроек верны, мы теперь знаем точно, как и для чего используются файлы из папки options.
4) Самое важное: должен быть файл key.dll, где содержится личный ключ! У нас его тоже нет.
Еще пару не таких важных моментов. Автор не несет ответственности за использование на «других регистраторах» (то есть, на всех вообще, ведь он сам подбивает на это программами из папки masscan_&_corrector), но с радостью готов принять отзыв. Там ссылка на группу в ВК, к сожалению, неработающая.
На всякий случай напомню, что лучший способ получить доступ — спросить его у знающего человека. Был не один случай, когда логины и пароли с листочков, накленных на стены, попадали прямо в репортажи телевидения (особенно это обидно для военных). Но нет, мы не будем использовать СИ и ломиться в личку к автору узнать ключ, хотя кто его знает, можем и прокатило бы. Если есть источники информации о программе, то почему бы ими не воспользоваться?
Напрягаем нетсталкерские навыки, и после недолгих поисков группы ВК автора заходим в неё и смотрим информацию о программе.
Наконец, мы получили начальные сведения и более-менее представляем, что это чудо должно представлять. Давайте перейдём к движухе.
Шаг 1: запуск
Да-да, уже можно. Хотя стой. Напоминаю, что любую программу из недоверенного источника как минимум нельзя запускать с правами администратора. А лучше — запускай вообще в виртуальной машине, и чтобы была возможность откатиться на состояние до запуска программы (скажем, чтобы малварь убрать, если она зароется в систему). На самом деле, мы тоже не отвечаем за то, что в программе из архива нет ничего такого. Хотя по уровню программирования автор явно никогда не дотянет до самостоятельного написания опасных вирусов, но об этом мы узнаем чуть позже.
Итак, первый запуск! Не спеши кликать левой кнопкой мыши два раза, сделай по-умному. Запусти командную строку, перейди в папку с программой и запускай там, набрав начало названия программы, нажав Tab и Enter. Во-первых, после закрытия программы окошко не пропадёт, и ты увидишь всё то, что программа написала. Во-вторых, с консолью надо начинать когда-нибудь работать, если хочешь быть хакером
Запускаем программу, которую мы посчитали основной, SWC(Foscam)v2.1.exe
Что ты видишь? Ничего. Программа запустилась и закрылась. Кажется, она не заработала! Возможно, это защита от несанкционированного запуска, программа проверила, что она не активирована, и закрылась. Но как нам узнать точно, если она ничего не сказала?
Небольшое лирическое отступление: чтобы что-то проверить, нужно знать где проверять. Чтобы программа проверила активацию, она эту активацию должна где-то хранить. Понимаешь о чём я? Да, о файле с ключом, про который мы прочитали выше. Возможно, программа не увидела его и закрылась… Но мало ли, вдруг есть другие файлы, которые хранят состояние активации?
Не будем здесь рассматривать все варианты, упомяну, что в идеале поведение программы при запуске нужно было бы изучить всесторонне: к каким файлам она обращается, к каким разделам реестра, может стучит на какой-то IP. Можем посоветовать для этого утилиты от Sysinternals типа Procmon: с их помощью можно отследить абсолютно любые контакты нашего объекта препарирования с «внешним миром» операционной системы.
Здесь же мы будем работать глазами и мышкой. Давай откроем папку и посмотрим на дату изменения файлов, может где-нибудь она изменилась, и файл обновился?
Посмотрел? Да, мы тоже посмотрели и ничего не увидели. Но зато мы заметили, что исчез файл addition.exe! Удивительно, ничего не скажешь! И мы бы не поняли этого, если бы не посмотрели заранее на файлы. Надеюсь, ты не удаляешь архивы после распаковки? Можешь заново извлечь этот файл и повторно запустить программу.
Итак, второстепенная программа удаляется. Похоже на меру защиты, довольно глупую, учитывая, что всегда можно скопировать файл заново. А давай запустим сам этот файл, а?
Что мы видим? Программа сразу крашится, завершая выполнение неожиданным для операционной системы образом. Ну, это показатель двух вещей: автор не умеет обрабатывать ошибки и, скорее всего, эта программа и не предназначена для прямого запуска.
Итак, попробовали очевидные варианты. Вернёмся к отсутствующему файлу key.dll. Давай попробуем создать его и запустить программу, вдруг прокатит? Напиши туда всё что угодно, мы написали camshift. Если ты не понял — мы создали текстовый файл, записали туда текст, а потом переименовали. Готово? Запускаем?
Ого, это определённо успех! Хоть и не полный. Программа сказала нам, что логин не удался, и посоветовала связаться с автором (ха). После нажатия любой клавиши она закрывается. Но не спеши, давай посмотрим, что изменилось в папке.
Так, addition.exe не удалился. Зато появился новый файл, error_key.dll! Его размер не очень большой, значит, попытаемся открыть блокнотом и посмотреть содержание. У нас записалась странная чепуха вида 000$^$-333169$010$^$1422094464$. Штош, возьмём на заметку.
Что, сдаёмся? Нет, если подумать логически, то у нас опять изменился состав папки. Как добавление файла key.dll изменило работу программы, там и добавление нового файла может её изменить ещё раз. Давай проверим?
Кажется, повторяется первый запуск? Отнюдь, посмотри в папку: файл addition.exe остался цел. Значит, программа не удаляет его, когда есть файл ключа, но есть и файл «ошибка_ключ». И если файл ошибки удалить, то программа опять его сгенерирует, в чем ты можешь убедиться сам.
Для чего мы всё это делали? Для того, чтобы понять внутреннюю логику регистрации. Сейчас она для нас чёрный ящик, и мы не можем как-то залезть внутрь, но уже поверхностно знаем, что есть несколько сценариев работы при активации. К сожалению, обходного пути мы не нашли, так что… we need to go deeper!
Шаг 2: всматриваемся в IDA
Прежде чем погружаться в хардкор дизассемблирования, поговорим об условных операторах.
Это довольно очевидно тому, кто знаком с программированием, но может быть непонятно остальным. Что такое условие и какая его роль в программе?
Отвечаем: роль краеугольная. По сути своей, современные компьютеры выполняют последовательности команд. Не те, которые им хочется, а читают подряд записанные сообщения и поступают как там написано! Но современного IT не было бы, если бы люди не научились переиспользовать кусочки программ. Когда надо — выполняем один кусок, когда надо — другой. Выше мы уже видели такое в файлах архива — это библиотеки, они для того и предназначены. Но мы сейчас говорим о более тонкой материи — о блоках ассемблерных инструкций, языка компьютера. Даже в одной маленькой программе может быть много связанных блоков, и порядок их исполнения зависит от соблюдения условий.
Проверка условия — такая же команда, как и любая другая. И самое интересное, что если данные для проверки может быть трудно изменить, то изменить команду труда не составляет. Пример: пи > 5 никогда не будет верным, потому что пи = 3.14…. Что делать в этой ситуации? Если ты хакер, то просто измени знак неравенства на противоположный, пи < 5 будет исполняться всегда!
Надеюсь, ты понял, к чему мы. Суммируем с исследованием поведения программы выше: мы знаем, что программа закрывалась, когда не было файла ключа. Знаем, что она запускается, но не работает, когда файл ключа есть, но неправильный. Стало быть, где-то мы можем заменить проверку на правильный ключ проверкой на неправильный ключ? Мысль неочевидная, но такая же простая и верная, как и пример выше.
И мы это сделаем с помощью дизассемблера.
Итак, качай IDA Freeware с официального сайта (ниже будем использовать версию 7.0). Можешь найти и скачать Pro версию, если хочешь запустить дебаггер и посмотреть, как пошагово выполняется программа, что происходить внутри и почему. Если дальше по тексту ты не будешь понимать, как мы пришли к каким-то выводам, то так и сделай. Лучше один раз пощелкать мышкой, чем сто раз прочесть.
Надеюсь, ты уже установил, иначе придётся смотреть на скриншоты! Окей, мы предупреждали. Запускаем девчачью голову и нажимаем первую кнопку «New» в появившемся окне, затем выбираем наш файл SWC(Foscam)v2.1.exe. После этого должно возникнуть окно настроек загрузки.
Посмотрел? На самом деле, ничего менять не надо, просто нажимай «ОК».
Должно появиться ещё одно окно, с интересным, на самом деле содержанием.
Поясняем: наш невнимательный автор распространяет программу скомпилированную в дебаг-режиме. Что это значит? По умолчанию, в этом режиме сохраняется больше информации для возможности устранения всяких ошибок прямо в процессе разработки. Отладочная информация при этом хранится в .pdb файле, а путь к нему указывается полный прямо в исполняемом файле!
Прошу ещё раз обратить внимание: IDA спросила нас, загрузить ли отладочный файл по пути D:\Projects_VS\Processes_main\Release\Processes_main.pdb. Если бы непутёвый разработчик прогал прямо в домашней директории, то здесь в пути мы увидели бы папку с именем пользования. Нельзя быть таким невнимательным!
Впрочем, файла всё равно у нас нет, так что нажимаем «No» и двигаемся дальше. Теперь файл должен загрузиться.
С непривычки происходит информационная перегрузка и мозг отключается. Не будем разбирать всё что есть, укажем тебе, что понадобится в дальнейшем, и постепенно всё станет на свои места.
Активная вкладка «IDA View-A» будет нужна нам и дальше. Это граф потока управления, те самые ассемблерные инструкции, нарисованные блоками и соединённые стрелочками. Похоже на блок-схемы в программировании, исполнение идёт от одного блока к другому, но может идти в разных направлениях, в зависимости от условных операторов (мы поговорили про них выше).
Ещё одна особенность, она даже есть на скриншоте выше — это команда call sub_XXXXXX. По сути своей, это такой невидимый на текущей схеме переход к другому блоку и возврат обратно. Зачем так сделано? Потому что блоков очень много, программа обычно бьётся на модули, модули на подпрограммы и функции, а они уже на вложенные блоки… Нам не нужно сейчас вдаваться в подробности, просто представь, что есть подпрограммы-блоки большие, с названиями sub_XXXXXX (заметь, они есть в списке слева), и блоки-блоки поменьше, которые видны на схеме, с названиями loc_XXXXXX.
А теперь давай немного пустимся в свободное плавание и посмотрим всю открытую схему. Её можно передвигать мышью, уменьшать и увеличивать масштаб колёсиком с зажатой Ctrl. Лет 15 назад это никому и не снилось, и хакерам приходилось распознавать блоки кода глазами подобно операторам из фильма Матрица, которые в зелёных символах распознавали рыженьких и брюнеток.
Ниже на картинке вся схема текущего уровня, который называется start в окне слева.
Так верхнеуровнево выглядит программа от момента запуска до момента завершения. Но не будем обманывать себя полностью, в каждом блоке есть вызовы других частей программы, и в них она тоже может завершаться!
То есть, на самом деле это упрощённая схема, но нам пока больше не надо. Главное, что мы можем просматривать схему каждой подпрограммы из списка слева, когда нам это понадобится.
Шаг 3: ищем строки
Идём дальше. До сих пор глаза разбегаются, за что взяться, как найти то место, которое нужно пропатчить, изменить, чтобы программа работала как нам надо? Классический способ — причинно-следственный. Вспоминаем, что происходит при неудачном логине… Высвечивается соответствующая надпись! Давай найдём её в программе, это законно.
Открываем пункт меню «View» — «Opeb subviews» — «Strings» или нажимаем Shift+F12. Открывается новая вкладка, в которой перечислены все строки программы. Тут следует заметить, что данные программы хранятся в отдельном месте, не прямо там, где и команды. Поэтому здесь мы не видим хитрых схем, просто перечисление.
Одного взгляда достаточно, чтобы понять несколько вещей:
1) Автор программы либо недостаточно сильно жмёт на клавиши, либо очень плохо знает английский. Слова вроде star вместо start и delet вместо delete выдают его.
2) При каких-то условиях создаются (или только читаются) файлы error1.txt, error2.txt, error3.txt. Это просто ад конструктивности.
Кстати, наша догадка о том, что этот файл основной, немного неверна. Если ты понимаешь примерно, как работают такие программы, то должен понимать, что любой HTTP-запрос к камере должен формироваться при помощи специальной строки, в которой будет указан URL. Здесь подобных строк нет, значит, сам доступ к камерам происходит в addition.exe. В определённом смысле, тот файл главнее.
Здесь немного нарушим линейное повествование и покажем строки второго исполняемого файла (то есть, как бы, мы закрыли этот файл и открыли второй в IDA).
Как видишь, во втором файле полная движуха: сохранение изображений, запросы в камерам вида http://…/tmpfs/auto.jpg и http://…auto.jpg?usr=user&pwd=pass. По сути, это всё то, ради чего создавалась программа. Эти запросы можно скопировать и реализовать свой простенький скрипт на Python, который будет делать то же самое, только бесплатно и без костылей. У нас есть примеры собственных простых программ.
Кстати, в Linux достаточно команды strings <название файла>, чтобы вывести эти строки, и никакого дизассемблера не надо. На заметку молодой хозяйке!
Но вернёмся к нашему основному файлу. Находим строку с надписью вида «… Login failed …» и тыкаем два раза. Проваливаемся во вкладку «IDA View-A», перешедшую в режим отображения данных. У нас выделилась область, размеченная под эту строку.
Теперь жмём правую кнопку мыши и выбираем «Xrefs graph to…».
Нам отобразился граф использования строки: видим блок с надписью sub_4010D0. Как ты помнишь, мы можем открыть эту подпрограмму-блок в списке слева и посмотреть её схему. Можем сделать это вручную, но чтобы не терять время на пролистывание всех блоков, перескочим к нужному сразу.
Для этого на строке, где ты жал правой кнопкой мыши, выбери в главном меню пункт «Jump» — «List cross references to…» или нажми Ctrl+X. Появится та же информация, что выше, только в удобоиспользуемом виде.
Теперь всё просто: жми два раза и провалишься автоматически в нужную подпрограмму и нужный блок. При этом должна выделиться строка, в которой используется текст ошибки.
Теперь давай помедитируем. Что ты видишь? Умная IDA уже расставила нам комментарии серым цветом: вот наша строка, которую куда-то загружают (подсказка: передают в функцию для вывода в консоль), а вот непонятные нолики и доллары… которые мы уже видели. Это код ошибки, сохраняемый в error_key.dll.
Ну что же, звёзды сошлись, мы доходили до этого блока программы… Но что делать дальше? Ответ простой — идти вверх по стрелочке! Давай посмотрим, откуда передаётся управление в этот блок и что там происходит.
Для наглядности на картинке выше мы показали все блоки, которые нам будут нужны до конца статьи. Да, осталось совсем немного. Можешь проматывать сюда, чтобы взглянуть на всю композицию и почувствовать себя процессором.
Шаг 4: меняем пару символов
Итак, управление в блок вывода ошибки приходит из блока, в котором IDA заботливо упомянула файл error_key.dll и букву a. В этот файл, как ты помнишь, пишется строка странного вида с ошибкой, а буква а означает append — это режим открытия файла, при котором к текущему содержимому дополнительно что-то записывается. Для общего сведения, есть ещё режимы r — read, чтение, и w — write, когда файл полностью перезаписывается.
Ты можешь увидеть, что от блока идет и вторая стрелочка вниз, но если проследишь сам, то заметишь что уходит она туда, где программа просто заканчивается. Не наш кейс, так что давай поднимемся на ещё один блок выше.
Здесь опять две стрелки на выходе: одна идёт к сообщению об ошибке, а вторая… может привести к блоку, в котором IDA упомянула строку «Key activated»! Это успех. Давай закрепим результат и посмотрим на две последние команды блока.
cmp — команда сравнения, после неё через запятую перечислены два аргумента, значение которых сравниваются. Не будем вдаваться в подробности, для нас это два абстрактных числа, второе при этом как-то причастно к VolumeSerialNumber. Если ты хоть раз пользовался дисковыми утилитами (для диагностики, бэкапирования или разметки), то мог видеть там подобную строку — это серийный номер раздела жёсткого диска. Он довольно уникальный, поэтому часто его используют для создания уникальных ключей активации. И заметим, что для этих выводов нам не пришлось учить ассемблер, это не систематические знания. Их можно почерпнуть, просто погуглив по ключевым словам.
jz — команда условного перехода. Условие — это равенство значений, которые сравнивались перед этим. То есть, если бы те два числа выше были одинаковые, то управление перешло бы на блок loc_4012FC. Он расположен слева, значит, условие это не выполнялось, когда мы пытались запустить с некорректным ключом.
Что будем делать, Шерлок? Ответ прост: поменяем команду условного перехода. На самом деле, их очень много, все начинаются с буквы j, но есть самая крутая: команда безусловного перехода jmp. Она настолько крута, что не проверяет никаких условий и просто переходит в тот блок, в который скажут.
Патчим! Ставим указатель на команду jz, выбираем пункт меню «Edit» — «Patch program» — «Assemble». Должно появиться окно с редактированием строки ассемблерного кода.
Итак, меняем jz на jmp, нажимаем «ОК». Что-то неуловимо меняется… Может, это вы стали хакерами?
Окно не закрывается, но изменения применились, так что можем просто закрыть его. Что должно было произойти? Вместо разветвления на стрелку влево и стрелку вправо наша программа теперь всегда должна идти по правой стрелке. IDA перестроила схему и получилось следующее.
Как видим, теперь у нас только одна стрелка, она идёт к следующему блоку loc_4012FC, который уже может привести либо к успешной активации (блок слева), либо к какой-то странной развилке и работе с файлом error1.txt (блок справа). Впрочем, давайте посмотрим, что мы сделали. Запустим изменённый файл и проверим, как это повлияло на программу.
Для этого выбираем пункт меню «Edit» — «Patch program» — «Apply patches to input file…» и в появившемся окне просто нажимаем «ОК» — так мы применим патч к текущему файлу. Можно выбрать и любой другой в поле «Input file» (если мы хотим иметь несколько копий и экспериментировать, например).
Теперь запускаем, не забыв удалить error_key.dll, который где-то всё так же отслеживается (мы же ничего с этим не делали, верно?). Не будем приводить скриншот — мы увидим самый первый результат, когда в консоли не отображалось ничего и программа закрывалась. Значит ли это, что мы что-то сделали неверно? Нет-нет, просто ещё немного помедитируем.
Проследим за стрелочками, выходящими из блока справа (loc_40133D). По одного из стрелочек у нас происходит какая-то работа со строкой «Boom!» (вывод в консоль, что же ещё?), а затем вызов функции Sleep (пауза выполнения) и что-то с файлом addition.exe (IDA опять заботливо намекает нам словом remove там вызывает удаление файла). Замечаем, что к блоку удаления файла идут ещё две стрелки откуда-то сверху. Одна из них уже работала при нас — когда не было файла ключа.
Судя по тому, что сейчас второстепенный исполняемый файл не удаляется, исполнение из блока loc_40133D передаётся по другой стрелке. Она уходит вниз в функцию, которая просто завершается, и с ней завершается текущая подпрограмма. Логично — всё завершается, нигде не выводится текст в консоль, вот наш текущий поток управления. Что мы с ним можем сделать? Патчить, конечно!
Как вы уже могли догадаться, мы ещё раз изменим команду условного перехода. На этот раз ту, которая перекидывает в блок loc_40133D. Но если мы поставим там jmp, то никогда не попадём в успешную активацию… Тогда давайте просто инвертируем условие!
ja — команда условного перехода, проверяющая «строго выше», то есть «>». Для каждой подобной команды есть обратная, в нашем случае это jbe. Если тебе интересно, почему эти команды так называются и где об этом почитать, то предлагаю тебе один источник и напоминаю о всезнающем гугле, а мы тут не учить ассемблер собрались.
Итак, повторяем операции выше, меняя ja на jbe. Патчим, применяем патч. Граф останется такой же, просто поменяется команда. Ну что, запускаем?
Ура, оно работает! В который раз удивимся извращённой логике автора, который придумал запускать программу два раза: чтобы она сначала удаляла папку «pictures», а потом начинала работать. Что же, похоже на правду, но….
На самом деле рано радоваться: строчки «Upss!» выводятся бесконечно, как будто при каждой попытке залогиниться. Если ты был внимателен, то видел эту строку выше на картинках.
Нашёл? Не искал? Ладно, соль в том, что это выдаёт нам уже не основная программа, а программа-брут, addition.exe. Если ты откроешь её в IDA и повторишь всё то, что мы делали выше, только для этой строки, то увидишь там до боли знакомый блок… Практически тот же, что и loc_40133D. Автор не смог придумать хорошую защиту и просто сделал одну и ту же проверку в двух местах.
Если ты следовал статье и патчил всё по шагам, то пропатчить отдельно этот файл у тебя не составит труда. Считай это домашним заданием! После третьего патча программа будет работать как надо (кроме случаев, когда она зависает или крашится, но это уже чьи-то кривые руки :)).
Для тех, кому этого ДЗ мало, предлагаем самостоятельно:
- убрать вообще какие-либо проверки файлов активации;
- сделать так, чтобы после удаления папки изображений программа работала дальше;
- изучить, что происходит с файлами errorX.txt;
- выяснить, зачем нужен wget;
- исследовать способы получения скриншотов в addition.exe;
- поменять текст в консоли на HACKED BY VASYAN
Выводы
Патчить активацию не так уж и сложно. Если этой статьи тебе всё равно не хватило для вдохновения или понимания, то на полном серьёзе предлагаю почитать старые выпуски ][akep, а именно статьи про реверс и крэкинг.
Разбираться во внутренностях программ очень интересно. Не всегда этично, но когда ты нарушаешь права разработчика программы, с помощью которой нарушают права миллионов человек по всему миру, то твоя совесть чиста.
Проприетарный софт — зло. И если со сканером камер ты не можешь быть уверен в наличии малвари и в глюках работы, то для ПО самих камер это оборачивается миллионами необновляемых устройств с дефолтным паролем. После чего барыги продают доступ к камере твоей спальни по всему Рунету.
Остались вопросы, нашёл ошибку или хочешь поделиться чем-то? Пиши нам в бота. Также напоминаем, что есть площадки Asleep Cams и Точка Сбора, где ты можешь пообщаться с другими людьми на тему сетевого поиска камер или просто о нетсталкинге.
Бонус
Как менять строки в IDA? Байты символов можно менять в окне «IDA View-A», когда переходишь туда с вкладки «Strings». Удобнее всего перевести разметку строки в последовательность байт (нажав D или выбрав из меню по правой кнопке мыши «Data»), а затем поменять байты строки в меню «Edit» — «Patch program» — «Change byte», откроется окно редактирования с позиции курсора. Перевести байты в текст и обратно можно с помощью онлайн-конвертеров, например такого.
-
Вид работы:
Реферат
-
Предмет:
Информатика, ВТ, телекоммуникации
-
Язык:
Русский
,
Формат файла:
MS Word
13,18 kb
-
Опубликовано:
2009-01-12
Вы можете узнать стоимость помощи в написании студенческой работы.
Как ломать программы Windows (C) ED!SON [UCF], перевод Mr.Boco/TCP
Как ломать программы Windows (C) ED!SON [UCF], перевод Mr.Boco/TCP
СОДЕРЖАНИЕ
1. Введение в ломание Windows-программ
2. Обзор SoftICE/Win 2.oo
3. Поиск регистрационных кодов
3.1 Task Lock 3.00 — простая защита на основе серийного номера
3.2 Command Line 95 — простая регситрация «имя-код»
4. Создание генератора ключей для Command Line 95
5. Как работают инструкции PUSH и CALL когда программа вызывает функцию
6. О программах, написанных на Visual Basic
ПРИЛОЖЕНИЯ
A. Как в SoftICE загружать символьные имена (имена функций etc)
B. Синтаксис функций GetWindowText, GetDlgItemText и GetDlgItemInt
C. Где найти программы
D. Как связаться с автором
1. ВВЕДЕНИЕ В ЛОМАНИЕ WINDOWS-ПРОГРАММ
Ломать программы Windows в большинстве случаев даже проще, чем ломать программы Dos. В Windows сложно что-нибудь скрыть от того,
кто ищет, особенно если программа использует стандартные функции Windows.
Первая (и часто единственная) вещь, которая Вам потребуется — это SoftICE/Win 2.oo, мощный отладчик от фирмы NuMega. Некоторым
людям он кажется очень сложным в использовании, но я расскажу Вам, как с ним управляться и, я надеюсь, Вы поверите мне. =) В приложении A я привел некоторую
информацию, которую Вам следует прочитать.
URL всех программ, которые Вам понадобятся, приведены в приложении C.
— ED!SON, edison@ccnux.utm.my
2. ОБЗОР SOFTICE/WIN 2.OO
#статьи
-
0
Они справлялись с утечками данных, спасали ТВ-трансляцию Олимпиады, сообщали компаниям об уязвимостях и играли на школьных компах.
Кадр: фильм «Железный человек 2» / Marvel Studios
Любитель научной фантастики и технологического прогресса. Хорошо сочетает в себе заумного технаря и утончённого гуманитария. Пишет про IT и радуется этому.
Круто быть программистом, который умеет и сайт сверстать, и сервер запустить. Но ещё круче — знать, как программы работают изнутри, чтобы уметь их подправить под свои нужды. Именно об этом и рассказали айтишники на форуме Hacker News, а мы собрали для вас лучшие истории.
Я очень много играл в Tetris Friends и в какой-то момент начал ловить дежавю. Иногда, когда я начинал новую игру и размещал 10–20 кубиков, мне казалось, что эту расстановку я уже видел в одной из прошлых игр. Я решил протестировать мою теорию с помощью брутфорса — начинал новую игру, записывал первые 10 кубиков, а затем перезапускал. Делал это снова и снова, пока наконец-то не увидел в игре комбинацию, идентичную прошлой.
По всей видимости, в Tetris Friends использовали ограниченный набор сидов (возможно, 256) чтобы генерировать комбинации кубиков. И получается, что если ты начинаешь игру с одним и тем же сидом, то тебе выпадают одни и те же кубики.
В Tetris Friends можно было соревноваться с другими игроками по всему миру. Там даже была доска лучших игроков, в которую можно попасть, если быстрее всех собрать 40 линий. Я решил использовать AutoHotkey, чтобы занять первое место.
Я перезапускал игру снова и снова, пока не получал хороший сид, а потом аккуратно играл и записывал мои действия в скрипт AutoHotkey. Ещё нужно учитывать, что Tetris Friends был флеш-игрой, а значит, нужно было делать небольшую задержку перед каждым движением.
Тестирование и отладка программы были просто ужасными: приходилось постоянно перезапускать уровень, пока я не находил тот же самый сид. Но через несколько часов упорного труда мой скрипт наконец-то заработал, и я занял первое место в мире. Ходил гордый целую неделю, пока разработчики не обновили доску.
Я жил в Сиднее и работал в телекоммуникационной компании, которая запускала прямые эфиры. Мне никак не удавалось пофиксить ужасный баг, не позволявший нормально передавать транслирующий сигнал с церемонии открытия Олимпийских игр в Лондоне. До финальной репетиции оставалось меньше суток, и компания была готова менять все радиостанции в студии.
Изображение: olympics.com
В конце концов я психанул и взломал прошивку радиостанции, обошёл процесс обработки сигнала и начал транслировать сырые данные из Лондона прямо в студию в Сиднее. Клиент был настолько доволен результатом, что через два года решил использовать наши радиостанции для трансляции зимних Олимпийских игр в Сочи.
На моей первой работе мне поставили задачу исправить базу данных, которая медленно, но верно жрала память, что приводило к крашам системы после нескольких часов использования. Софт был написан на С, а среди инструментов ещё не было никаких Purify и Valgrind, чтобы быстро решить проблему. Это была неприятная задача, которую не хотели решать.
Изображение: Public Domain
Я заглянул в код и увидел, что аллокация памяти использовала функции malloc и free. Решил заменить их на собственные объявленные в хедере функции — my_malloc и my_free, которым передавались как параметры __FILE__ и __LINE__. Затем перекомпилировал всю программу с этими макросами, которые перенаправляли все вызовы malloc и free к моим функциям.
Мои функции записывали в отдельный файл все вызовы с адресами аллоцированной памяти, именами файлов и номерами строк. Когда набралось достаточно данных из тестовых запусков, я отсортировал их по адресам. У каждого такого адреса должна быть пара — malloc и free. Если пары нет — есть проблема. Так я нашёл все проблемные имена файлов и быстро всё исправил.
Я подал резюме в одну медицинскую компанию, которая занималась выращиванием лечебной марихуаны в Канаде ещё до её легализации.
Мне было интересно, открывали ли они веб-страницу с моим портфолио. Решил проверить сам: взял логи моего веб-сервера, нашёл публичный IP-адрес той компании и проверил его на shodan.io. Обнаружил интересную вещь — один из портов был открыт по BACnet-протоколу. Тогда я не знал, что это, но быстро нашёл программу, которая умела общаться по нему.
Изображение: shodan.io
И вот подключаюсь я к IP-адресу по открытому порту и нахожу огромный список доступной информации — показатели уровня воды, температуры, света и многое другое. Мне не хотелось делать что-то противозаконное с этим, хотя я, вероятно, мог включать и выключать свет, менять температуру в комнатах, где находятся растения, и так далее.
В итоге я сообщил об этой уязвимости рекрутеру компании. Это было рискованное решение, но оно сработало — меня взяли на работу. И первым делом поручили пофиксить этот открытый порт.
Не уверен, что это «хакинг», но я был горд, что смог обнаружить такую уязвимость в системе.
Начальная школа, эпоха операционных систем Windows 3.x.
Во всех классах были жёсткие правила: никаких игр на уроках. Преподаватели даже закрыли доступ ко всем встроенным в ОС играм. Но они только так думали.
Мы нашли хитрость: если открыть любую программу — например, Wordpad, можно были зайти в FILE → OPEN, чтобы найти и запустить «Сапёра». Очень просто и быстро. И никакие ограничения не могли нас остановить.
Ничто так не заставляет восьмилетнего ребёнка чувствовать себя крутым «хакером», как эффектный обход школьных запретов.
Я пытался найти квартиру в аренду на сайтах Craigslist и Kijiji. В то время, в 2010-е, у них был очень неудобный интерфейс — не было даже карты с расположением квартир. Если появлялась новая, нужно было действовать максимально быстро, чтобы забронировать её раньше других.
Я написал скрипт, который парсил данные с обоих сайтов и отображал квартиры прямо на карте. У меня получилось даже реализовать фильтр, чтобы быстро находить подходящее для меня жильё. Система автоматически связывалась с арендодателями, которые указывали свой email, узнавала, свободна ли ещё квартира, а затем присылала мне уведомление со ссылкой.
Изображение: btbuildem
Парсер оказался настолько неплохим, что я решил масштабировать систему на ещё несколько городов. И как только я находил подходящее для меня место, делал сайт с парсером доступным и делился им с моими друзьями. Позже мой сайт даже выиграл награду на cira.ca.
Я решил закрыть свой проект, когда узнал, что Craigslist начал судиться с PadMapper за то же самое, чем занимался я. Хотя это не было основной причиной. Главная — мой сайт не приносил прибыли.
Одно время в начальной школе использовали ноутбуки Chromebook, которые пришли на замену нетбукам. В ними у меня произошла интересная история.
Изображение: arstechnica.com
В школе заблокировали все популярные сайты с флеш-играми. Поэтому мы с друзьями решили скачать кучу таких игр и загрузили их на собственный сайт, используя самый простой веб-сервер. На нём была гора ужасного HTML- и CSS‑кода, но всё работало!
Школа не могла его заблокировать, потому что он находился в локальной сети. А мы, в свою очередь, пользовались этим и раздавали нашим друзьям его IP-адрес, чтобы подключиться к серверу.
Много лет назад я работал в компании, которая занималась производством машин премиум-класса. Мы хотели презентовать новый продукт, чтобы убедить клиентов из главного офиса, что наш проект выгоден для инвестиций. Идея состояла в том, что машину можно открыть не только обычным ключом, но и с помощью, например, смарт-часов.
Главный разработчик нашей команды нашёл гениальное решение: поставить Arduino-контроллер удалённого открытия. В день презентации, когда пришли клиенты, демоверсия работала идеально, все были довольны, и мы получили финансирование.
Изображение: Wikimedia Commons
Научитесь: Профессия Специалист по кибербезопасности
Узнать больше