Ломаем программу с помощью 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", откроется окно редактирования с позиции курсора. Перевести байты в текст и обратно можно с помощью онлайн-конвертеров, например такого.