Что ж, внесу и я свои пять копеек. И сразу дисклеймер данный взлом от начала и до конца проделан в образовательных целях и не имеет целью нести убытки компании Pop. Cap Games. Итак, гуглим дистрибутив Зумы, скачиваем его, приводим в боеготовность Olly. DBG, и начинаем разбор. Впрочем, забегая вперд, отмечу, что для данной задачи в этом есть свои плюсы, такие как, например, простота редактирования записей и отслеживания изменений в WINEовском реестре, в силу его хранения в обычном текстовом файле. Часть 1 коварный Flash. Sandboxie скачать тут http Группа в ВК httpsvk. Sandboxie Песочница как взломать и пользоваться ею Название песни. Взлом Sandboxie v5. ПЕСОЧНИЦА ключи Инструкция Duration 618. Из песочницы. На Хабре написано. Генераторы ключей. Второй полезной функцией является генератор ключей. Конечно же речь. Sandboxie так называемая песочница, которая позволяет обезопасить запуск и выполнение. Из песочницы. Как видим, в системе уже есть ключ 3V66T, а точнее. Миф 2 Windows 10 можно активировать без ключа мы уже. В общем, запускаем игру, играем дольше положенного или сразу же лезем в ветку реестра HKLMSoftwarePop. CapZuma и выставляем нули в ключах Times. Executed и Times. Played и вуаля Отлично, выбираем Buy Now, закрываем вылезшее окошко браузера с предложением купить такую то игру за жалкие 1. Enter the Registration Key Manually. Так с, поле ввода. Уже от чего то можно плясать. Пробуем ввести какую нибудь абракадабру, ожидаемо получаем Please enter a valid key, и идм разбираться, что к чему. MrS_N_WSqvhwCKOeRmiLMQ/orig' alt='Генератор Ключей Для Песочницы' title='Генератор Ключей Для Песочницы' />
Первое, что настораживает при вдумчивом осмотре наличие в папке, прямо рядом с бинарм игры, двух файлов, намекающих на использование в программе технологии Flash собственно, Flash. Ладно, открываем этот самый drm. Вся гламурненькая оболочка для регистрации ключа, как оказалось, выполнена в том самом. SWF файле. Может быть, и сам код проверки находится там же Давайте посмотрим. Берм любой декомпилятор Action. Script я, например, использовал Flare и вынимаем из drm. Смотрим, что же у нас там надекомпилировалось. Рано ли, поздно ли натыкаемся на вот такую интересную строчку g. Frame. Labels. Правильный ключ имеет в длину 2. На то, что в этом же блоке кода происходит инициализация таких страшных значений как g. Reg. Failed. Message, можно не обращать внимания, т. Вот она целиком function validate. Надо, наверное, запостить это на govnokod. Главное, что эта функция дала нам структуру лицензионного ключа где символ из алфавита 0. ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz . Ровно 2. 3 символа. Опять забегая вперд, скажу что набор верных символов внутри самой программы будет несколько сокращн. Но пока что нам без разницы. Запускаем Olly. DBG и загружаем в него нашу подопытную. Запускаем на выполнение F9 и дожидаемся момента прорисовки главного окна. Куда копать дальшеА помните найденный нами вызов fscommand с первым параметром, равным строке Register Поэтому открываем Memory Map AltM и ищем вхождение этой строки CtrlB. А вот и она, лежит себе по адресу 0x. D0 Ставим на не точку останова по чтению выделение. Далее, в окне проверки, идм по ссылке внизу Already purchased this game. Жмм Register. Часть 2 we need to go deeper. Вот мы и попали, наконец, внутрь алгоритма проверки. Идм в список контрольных точек на память и удаляем 0x. D0 AltY. Опять пропускаем вс до конца функции и возвращаемся в вызывавшую Ага А вот теперь мы в сердце анализатора лицензионного ключа. Чтобы не забыть это место, поставим F2 контрольную точку на 0x. CA и осмотримся вокруг. Чуть ниже 0x. 40. A8 видны вызовы функций с очень интересными строковыми параметрами Reg. Succeeded и Reg. Failed. А повыше 0x. Это ветвление завязано на сравнение 0x. D регистров AL и BL. Похоже, что функция 0x. Самая Важная Функция Проверки. Сначала, проверим свою догадку изменим сравнение так, чтобы оно оказывалось верным при некорректных исходных данных. Наведм выделение на 0x. Откроется окно Assemble. Заменим переход по равенству, JE, на переход по неравенству JNE. Запустим на выполнение F9. А это значит, что на достигнутом останавливаться рано, и придтся перезапустить программу CtrlF2 и углубиться в недра функции 0x. Сейчас наша задача понять, как себя ведут внутри этой функции регистры AL и BL, и где именно расположен кусок кода, ответственный за их равенство либо неравенство. Перейдм в хвост функции, поближе к точке выхода, RETN, и включим подсветку регистра BL контекстное меню. Первое генерируется, когда строка байт, указатель на структуру с которой передан как параметр функции, не совпадает со строкой, чей указатель лежит по адресу. Второе же то самое, которое нам нужно при обратной ситуации, т. Для разных конфигураций машин и операционных систем данные адреса, скорее всего, будут различаться. Так, в мом случае это 0x. E6. 24 и 0x. 33. E6. ESP, как на картинке. Пока что эти точки нужно сделать неактивными контекстное меню. Поставим туда контрольную точку и начнм трассировать функцию построчно F8, следя за состоянием двух наших аппаратных точек останова. Трассировка показывает, что до строки 0x. А вот дальше уже любопытнее. Функция, непосредственно вызываемая из 0x. E3. 20, так что в ней нет ничего интересного. Ставим точку останова на 0x. E3. 20 и жмм F9. На данный момент, в стэке можно заметить строку, состоящую из странных, но тем не менее печатных символов к примеру, у меня это A. O6. NBBO. E4. GXF3. O0., символа перевода строки и постфикса ZUMA. Трассируем далее, и набредаем на 0x. E3. 7F Так так так. Так то лучше. Теперь анализ остального кода функции проходит легко и беззаботно 0x. E3. 200x. 41. E3. E3. 9B0x. 41. E3. C3 вычисление MD5 хэша от вышеупомянутой строки и подготовка структуры далее по тексту я буду называть е фреймом, которая будет содержать в себе ссылку на результат. E3. C50x. 41. E4. E4. 0A0x. 41. E4. E всегда оказывается истинной. E4. 260x. 41. E4. E4. 760x. 41. E4. B5 функции обрезки 1. MD5 хэша до 9. 6 бит выход из функции. Теперь давайте посмотрим на первую из наших аппаратных контрольных точек Такая структура из пяти значений, как я уже говорил, впоследствии будет называться фрейм. Первый DWORD никогда не изменяется, и всегда равен 0x. CВторой DWORD имеет неясное назначение да в общем то и не особо важен, как далее покажет практикаТретий DWORD равен адресу в памяти, где хранится строка байт. Четвртый DWORD задат е эффективную длину в WORDах т. Т. е., у нас уже есть одна из строк, назовм е условно эталонной, которая подвергнется сравнению с той, которую нам ещ только предстоит вычислить в 0x. F0x. 40. 45. 8C. Теперь взглянем попристальнее на строку 0x. E5. A0. Функция очень длинная и очень страшная, однако мы для того и здесь, чтобы сделать длинное и страшное простым и понятным. Эта функция обрабатывает введнную нами строку регистрационного ключа, и пересчитывает е в число. E5. A00x. 41. E6. E6. 0B0x. 41. E6. EF цикл, преобразующий буквы строки в верхний регистр, и заменяющий символы 1 на L, а O и 0 на Q0x. E6. F50x. 41. E7. A подготовка ко второму циклу. E7. 100x. 41. E7. Твир Опыс Осени. E4 второй цикл, строящий из строки число по принципу преобразования его из 2. ACDEFGHJKLMNPQRTUVWXYZ, игнорируя дефисы, и выдающий ошибку при отсутствии текущего символа в наборе. E7. EA0x. 41. E8. E8. 450x. 41. E8. Отлично, строка пересчитана в число, и теперь мы что то с нею делаем. До заветного момента, когда можно сказать, что реверс произведн, осталась одна функция, 0x. E1. 00 вызов из 0x. C. Ну тут уж я не буду вас мучать прочтением и расшифровкой ассемблерных листингов, поскольку один хороший товарищ, к тому моменту как я только начал е разбирать, подкинул мне очень вовремя уткший в Сеть кусок исходника Pop. Capовского фреймворка, содержащий в себе пусть не реализацию указанной функции, но хотя бы е название. В общем, барабанная дробь. Единственное, что осталось сделать это факторизовать публичный модуль 0x. BF9. 40. 23. BBA6. D0. 40. C8. B8. 1D9 и вычислить приватную экспоненту. Ну что ж, берм в руки MSieve TMG RSA Tool, и получаем на выходе 0x. AE5. 46. 5C5. 2D0. C4. C0. A8. FE3. 03. D. Сам же алгоритм для генерации ключа у нас есть посчитать MD5 от строки ИМЯПОЛЬЗОВАТЕЛЯ,0. Ah,ZUMAвыкинуть последний DWORD, и записать оставшееся в обратном порядке байтовпо WORD ово пройтись по результату, и применить чит. D2. 80снова поменять порядок байтоввычислить от полученного функцию Mod. PowD, N, где D 0x. AE5. 46. 5C5. 2D0. C4. C0. A8. FE3. 03.