Новости

Підкорюємо games.mail.ru: злом всіх іграшок за 3 хвилини

  1. Зміст статті Проект games.mail.ru «кришує» багато умовно-безкоштовні ігри, які працюють лише 1 годину,...
  2. Перші експерименти, або артобстріл перед боєм
  3. На підступах до злому
  4. починаємо ламати
  5. Битва за LSA
  6. техніка злому
  7. висновок
  8. Опасненько

Зміст статті

Проект games.mail.ru «кришує» багато умовно-безкоштовні ігри, які працюють лише 1 годину, а потім вимагають грошей (або розплати натурою). Народ розриваючись б'ється в істериці: платити за софт у нас не прийнято і принизливо, а грати-то хочеться! Причому серійні номери змінюються мало не щодня, і кряки, знайдені в Мережі, не спрацьовують. Тим часом існує простий, елегантний і універсальний спосіб злому, доступний навіть просунутим користувачам, не розуміються ні в дизассемблера, ні в секретах хакерства!

Постановка задачі

Ми будемо потрошити симпатичну гейму Age of Japan від компанії LoLo Games. Решта гри ламаються аналогічним чином, оскільки побудовані на тому ж самому движку. Може бути, не всі ігри, але переважна більшість точно. Я перевіряв " таємниці Єгипту »,« бульбашкової асорті »І ще кілька інших ігор, узятих навмання з сайту games.mail.ru.

Після Age of Japan гри розкриваються на автоматі, без всяких розумових зусиль, причому стратегія злому така, що розробникам навряд чи вдасться виправити захист після виходу цієї статті. Навіть якщо вони перепишуть її з чистого аркуша, це все одно нічого не змінить. Я поставив перед собою завдання не просто хакнуть конкретно взяту іграшку, а знайти універсальний спосіб злому, відповідний не тільки для games.mail.ru, але і для багатьох інших тріальних додатків, написаних сторонніми розробниками. І, уяви собі, вирішив!

Age of Japan
Age of Japan

На жаль, з незрозумілих причин Age of Japan зникла з games.mail.ru. Більш того, вона зникла і з офіційного сайту її безпосередніх розробників. Проте вона вже встигла розповзтися по інтернету, але, щоб не давати посилання на потенційно ненадійні ресурси, ми вирішили викласти інсталяційний файл на DVD , А також на http://nezumi.org.ru/souriz/hacksetupageofjapan.exe (Природно, в оригінальному, неломающіеся варіанті).

До речі кажучи, сам злом який суперечить КК, тому що не модифікує жодного байта, безпосередньо відноситься до гри, оскільки хачіть програми це, по-перше, недобре, а по-друге, не універсально.

Кращі ігри з games
Кращі ігри з games.mail.ru

Перші експерименти, або артобстріл перед боєм

Запускаємо setupageofjapan.exe і встановлюємо гру на свій комп'ютер (зрозуміло, це може бути не тільки «Століття Японії», а й будь-яка інша гра, адже принцип злому універсальний аж до найдрібніших деталей). Установка проходить успішно, і на робочому столі з'являється гарний червоний віяло, за яким потрібно клацнути мишею. Двічі.

Відразу ж після запуску на екран вистрибує противне діалогове вікно з незмінним логотипом «игры@mail.ru» і повідомленням про те, що у нас залишилося 60 хвилин. Внизу знаходяться кнопки: «Грати», «Купити», «Ще ігри» і «Ввести ключ».

При першому запуску Age of Japan з'являється неприємний NAG-Screen, який повідомляє, що гравцеві дається всього 60 хвилин
При першому запуску Age of Japan з'являється неприємний NAG-Screen, який повідомляє, що гравцеві дається всього 60 хвилин

Натискаємо «Грати» і ганяємо миша по всьому екрану поки не набридне, після чого виходимо з <Esc> і бачимо, що кількість ігрового часу скоротилося до 47 хвилин. Але ми ж навіть не почали грати!

Спроба зареєструвати гру випадковим ключем
Спроба зареєструвати гру випадковим ключем

Віддаємося експериментів: натискаємо «Ввести ключ» і вводимо будь-яке число від балди, наприклад «123456», спостерігаючи за реакцією програми, яка після секундної затримки, повідомляє нам, що ми помилилися і ввели невірний номер реєстраційного ключа. Активність персонального брандмауера при цьому нульова, тобто захист не ломиться в мережу і перевірка здійснюється локально, що істотно полегшує злом. Досить аналізувати код програму, видерти з неї перевірочний код і написати свій власний генератор серійних номерів.

Ось тільки ніяких гарантій, що в інших програмах використовується той же самий алгоритм, у нас немає!

Випадково обраний ключ не підходить, і реєстрація обламується
Випадково обраний ключ не підходить, і реєстрація обламується

Нам потрібно знайти універсальний спосіб, що підходить для всіх ігор відразу (в тому числі і тих, які ще не вийшли) і бажано не суперечить закону, оскільки за поширення кряков, генераторів і серійних номерів легко заробити по мізках. Що поробиш, програмісти не люблять, коли ламають їх програми.

На підступах до злому

Грі відповідає виконуваний файл showcase.exe. Завантажуємо його в будь-який hex-редактор, наприклад, hiew або FAR) і дивимося в початок файлу, де слідом за магічному словом PE слідують секції з іменами UPX0 і UPX1, що видають ім'я пакувальника. Викачуємо UPX свіжіше з upx.sourceforge.net (Благо він безкоштовний) і розпаковуємо файл за допомогою самого пакувальника, запущеного з ключем '-d' (скорочення від decompress).

Після цього гра збільшується в розмірі з 500 Кб до 3,7 Мб, і все текстові рядки, що виводяться захистом на екран, стають візуально видимими, зокрема, натиснувши <ALT-F7>, ми можемо знайти: «У Вас залишилося <...> хвилин гри »,« Вітаємо Вас! Гра успішно зареєстрована! »,« Помилка - невірний реєстраційний ключ ».

Перегляд текстових рядків у файлі showcase
Перегляд текстових рядків у файлі showcase.exe, розпакованому пакувальником UPX, запущеним з ключем '-d'

Діємо за стандартною і роками відпрацьованою схемою. Вантажимо розпакований файл в IDA Pro (якщо вона є), знаходимо зазначені текстові рядки, по перехресним посиланнях, що згенерував Ідой, піднімається «наверх», до того коду, який їх виводить, і аналізуємо його околиці на предмет пошуку умовного переходу, що визначає правильність реєстрації . З одного боку до нього примикає код валідації серійних номерів, з іншого - лічильник ігрових тиків, оновлюваний інструкцією MOV. Очевидно, якщо замінити MOV (копіювання даних) командою NOP (немає операції), то ігровий час назавжди застигне на позначці в 60 секунд.

Дизасемблювання захисного механізму в IDA Pro
Дизасемблювання захисного механізму в IDA Pro

Однак запропонований спосіб страждає рядом недоліків. Перш за все, він не універсальний, і з кожною грою доводиться розбиратися індивідуально, що не є добре, особливо якщо хочеться грати в усі ігри і відразу! Також непідготовленим користувачам дуже складно пояснити, які саме дії вони повинні зробити для досягнення бажаного результату. Вид дизассемблера більшість початківців хакерів приводить в жах, і вони вважають за краще користуватися готовими кряками, а не писати кряки для всіх ігор.

В принципі можливо розшифрувати алгоритм генерації серійних номерів, який повинен бути загальним для всіх ігор, але ніяких гарантій тут у нас немає, тим більше що змінити алгоритм (маючи вихідні тексти гри на руках) - хвилинна справа, і хакерські генератори тут же відмовлять в роботі , а постійно допрацьовувати їх ні у кого бажання немає.

починаємо ламати

Очевидно, щоб знати, скільки залишилося часу, захист повинен десь в тій чи іншій формі зберігати це значення. Почнемо з простого. Копіюємо гру в інший каталог, запускаємо, граємо. Повертаємося до оригіналу. І що ж ми бачимо! Оригінал прекрасно обізнаний, скільки часу ми грали! Отже, ігровий час всередині каталогу Age of Japan не зберігається, і його потрібно шукати зовсім в іншому місці (що, до речі сказати, цілком логічно, інакше б гру вже давно зламали).

Для звуження району пошуку проведемо наступний експеримент: запустимо штатну утиліту MS Backup (викликається з командного рядка за ntbackup.exe) і збережемо образ операційної системи в bkf-файл, потім пограємо (хоч до повного закінчення ігрового часу), після чого виконаємо процедуру відновлення з bkf-файлу.

Архівація стану системи (разом з даними про минуле ігровому часу)
Архівація стану системи (разом з даними про минуле ігровому часу)

Ну і що? Час «чарівним чином» повертається назад! Цю операцію можна проробляти скільки завгодно раз (поки не набридне), вона цілком легальна, але архівація і відновлення виконуються досить повільно і до того ж вимагають прав адміністратора і перезавантаження. Крім того, образ системи повинен бути створений до закінчення тріалу, а не після нього.

Добре, припустимо, що дані про час зберігаються в реєстрі (дійсно, ховати їх в файлах було б нерозумно і занадто помітно). Беремо безкоштовний Registry Monitor від Марка Руссиновича і дивимося, до яких гілкам реєстру звертається програма.

Спостерігаємо, до яких гілкам реєстру звертається захист
Спостерігаємо, до яких гілкам реєстру звертається захист

Таких гілок насправді дуже багато, але при ретельному розборі балки звертають на себе увагу два ключа, назви яких говорять самі за себе: HKCU \ Software \ ITTGames \ 58 \ RemainTime і HKCU \ Software \ ITTGames \ 58 \ TotalTime, тобто скільки часу залишилося і скільки його всього відповідно.

Спробуємо їх змінити? Від передчуття близької перемоги у нас пересихає в роті і ми ледь потрапляємо по клавішах. Однак всі наші дії дають нульовий ефект, що впливає тільки на «градусник» (лінійку прогресу), але гра все одно завершується в покладений термін, незважаючи на захаченний реєстр.

Власне, цього і слід було очікувати. MS Backup не зберігається HKEY_CURRENT_USER, отже, значення, що містяться в цій галузі, використовуються захистом виключно в якості допоміжних даних (наприклад, для швидкої відтворення «градусника» без актуального запуску захисного механізму). Втім, такий трюк нітрохи не ускладнює злом (у всякому разі, для тих, хто крім монітора реєстру володіє технікою налагодження і знає асемблер як свій хвіст рідної).

Але, перш ніж кидатися в обійми дизассемблера, не зайве запустити API-шпигун, щоб дізнатися, з якими системними функціями працює захист і в якому напрямку нам взагалі копати. API-шпигунів багато. Особисто я віддаю перевагу безкоштовний Kerberos від Рустема Фасіхова .

Kerberos - один з кращих API-шпигунів, який ми будемо використовувати
Kerberos - один з кращих API-шпигунів, який ми будемо використовувати

Однак, якщо просто згодувати йому ім'я виконуваного файлу (в даному випадку showcase.exe), нічого доброго не вийде і програма завершиться, не встигнувши ще початися, з повідомленням про помилкове встановлення. Створюється таке враження, що вона містить потужні антіотладочние прийоми, які чинять спротив шпигунству, але насправді все набагато простіше!

У командному рядку гра очікує отримання певного параметра, рівного (в разі Age of Japan) числу 97, що легко з'ясувати, клацнувши правою клавішею миші по ярлику з віялом і як слід вивчивши його властивості. Від очей досвідченого хакера ніщо не сховається!

Перегляд властивостей ярлика - програмі передається ідентифікатор 97 в командному рядку
Перегляд властивостей ярлика - програмі передається ідентифікатор 97 в командному рядку

Запускаємо Kerberos ще раз, явно прописавши аргумент 97 в параметрах командного рядка (зрозуміло, в твоєму випадку це значення може бути іншим), тиснемо на Inject і даємо йому попрацювати до появи основного ігрового поля на екрані. Після цього виходимо з програми і приступаємо до аналізу звіту, збереженого у файлі showcase.rep і містить сотні тисяч рядків, що переважно складаються з повторюваних функцій, так що пара банок пива нам не завадить.

Переважна більшість API-функцій абсолютно звичайні за своєю природою і зберігати значення в реєстрі (або за його межами) не можуть. Однак нашу увагу привертає серія функцій з префіксом LSA (Local Security Authority), що використовуються для зберігання секретних криптографічних ключів (та іншої конфіденційної інформації) в захищеному сховище, доступу до якого не має навіть адміністратор!

Так Так Так! Вже тепло, якщо не сказати жарко! Пахне чимось смаленим, напевно, захист горить, точніше, догорає. Ще трохи - і ми її виламаємо!

Битва за LSA

За задумом розробників NT, доступ до секретної інформації повинна отримувати тільки ту програму, яка її туди поклала. Тим часом функції LsaRetrievePrivateData / LsaStorePrivateData, що дають доступ до всіх секретних даних, існують ще з часів NT 4.0, хоч і залишаються недокументованими (типу для внутрішніх потреб системи). Однак зараз про них знає кожен (або майже кожен) хакер. Фізично вони зосереджені в файлі \ WINNT \ system32 \ config \ SAM, монтується на гілку системного реєстру HKLM \ SECURITY \ Policy \ Secrets, доступ до якого має тільки System, але, на жаль, не адміністратор!

Проте ми можемо написати нескладну утиліту, що читає і записує секретні дані за допомогою API-функцій LsaRetrievePrivateData / LsaStorePrivateData, що дозволить нам отримати необмежений тріал. Вся проблема в тому, що ми не знаємо, в який саме слот гра записує свої дані. Більш того, перш ніж правити ці дані (а вони зашифровані), в них як мінімум слід розібратися, аналізуючи мегабайти дізассемблерного тексту, що утомливо, непродуктивно і знову-таки не універсально (а адже наша мета - універсальний злом!).

На щастя, існує безліч безкоштовних LSA-шпигунів, наприклад « Каїн і Авель »(Cain-n-Abel), послугами якого ми і скористаємося. Запускаємо його на стерильній машині (тобто до установки будь-який з тих ігор, що представлені на games.mail.ru), переходимо в розділ LSA Secrets, натискаємо кнопку «+» на панелі інструментів і отримуємо дамп секретів в шістнадцятковій формі.

Потім встановлюємо Age of Japan (або будь-яку іншу іграшку), повторюємо сканування знову і ... ага! У дампі з'являється пара слотів виду L $ DTnn, L $ DTnn_, де nn - деяке число, наприклад, рівне 22. Пограємо трохи і повторимо сканування LSA ще один раз. Слоти L $ DTnn, L $ DTnn_ змінилися, в той час як інші залишилися без змін.

Шпигунство за вмістом LSA-слотів за допомогою утиліти «Каїн і Авель»
Шпигунство за вмістом LSA-слотів за допомогою утиліти «Каїн і Авель»

Таким чином, ми знайшли, де захист ховає свої дані, і тепер залишається придумати, як умовити її продовжити роботу навіть після закінчення тріалу.

техніка злому

Ми знаходимося на фінальній стадії злому, але від самого злому нас відділяє вибір з безлічі шляхів. Можна, наприклад, написати перехоплювач, що підміняє виклики LSA-функцій своїми власними процедурами, лише імітують запис в Захищене сховище, але не здійснюють її фізично. Це досить універсальний спосіб, який працює з безліччю тріальних програм (а не тільки з тими, що з games.mail.ru), але йому притаманні щонайменше два серйозні недоліки. По-перше, це ж сидіти і писати треба, тобто витрачати час, ворушити мозком і стукати по клавіатурі :). По-друге, деякі програми дійсно потребують LSA і з подібним перехватчиком працювати не будуть, тому нам
доведеться винаходити складний евристичний механізм, що дозволяє відрізнити «захисні дані» від чесних криптографічних ключів. LSA інтенсивно використовується системою (особливо Server 2003), і тому автоматичний перехоплення призводить до розвалу Windows, в чому я вже встиг переконатися.

Насправді для злому нічого свого писати не потрібно - цілком вистачить і штатних засобів у вигляді редактора реєстру. Ось тільки заглянути в потрібну гілку, навіть з правами адміністратора, ніяк не вийде. Нас просто туди не пустять! Адже це все-таки Захищене сховище, а не прохідний двір! Але ж не писати ж через це цілий драйвер?

Зрозуміло, немає! Досить скористатися штатним планувальником, що запускає додатки з привілеями System, дозволяючи нам переглядати і модифікувати всі гілки реєстру без винятку (в тому числі і захищені).

Запускаємо regedit32 (повноцінний 32-бітний редактор реєстру), вказавши час, на хвилину або дві випереджальний поточний, і терпляче чекаємо. Якщо редактор не з'явиться, значить ми забули поставити ключ / interactive »або служба планувальника відключена. Зайди в розділ «Служби» і включи.

Робота з LSA-слотами в редакторі реєстру
Робота з LSA-слотами в редакторі реєстру

Ідея - експортуємо пару гілок L $ DTnn / L $ DTnn_ в reg-файли, а коли ігровий час закінчиться, просто імпортуємо їх звідти (увага: просто навести курсор на reg-файл і натиснути на <ENTER> явно недостатньо - у нас просто не вистачить прав, і тому необхідно запустити редактор реєстру через команду at.exe і виконати імпорт вже в ньому з привілеями System).

Діючи таким чином, ми можемо продовжувати ігровий час нескінченну кількість разів (як вручну, так і за розкладом, благо планувальник під рукою, а редактор реєстру ще не розучився розуміти ключі командного рядка). Цей трюк особливо корисний для ігор типу «бродилка», які не дозволяють зберігати стан гравця, а бродити по ним можна годинами, і так прикро, коли відпущений час закінчується на найцікавішому місці, буквально за два кроки від перемоги! Так що планувальник рулит!

А як бути, якщо ми схаменулися надто пізно і відпущений нам ігровий час уже минув? Експорт та імпорт в цьому випадку нічого не дадуть, але! Якщо набратися сміливості і видалити пару гілок L $ DTnn / L $ DTnn_, при наступному запуску гра повідомить, що вона неправильно встановлена ​​і зажадає переустановки, після якої ... Правильно! Ми отримаємо цілу годину законного ігрового часу!

висновок

Ось ми і поламали Age of Japan, а разом з нею і всі інші ігри з games.mail.ru, включаючи численні тріальні захисту, що приховують дані в LSA. При цьому назвати ці дії «зломом» язик не повертається! Адже код та дані гри залишаються недоторканими, ну а зі свого власного захищеного сховища ми маємо право викидати всяке сміття, який туди записується без нашого відома.

Опасненько

Захисний метод, який використовується games.mail.ru, порочне і небезпечний. Обсяг LSA Policy обмежений 4096 слотами, і приблизно половина з них вже зайнята і активно використовується системою (тут, зокрема, зберігаються паролі служб Windows). Причому при видаленні програм з games.mail.ru використовувана ними пара слотів залишається в реєстрі (на той випадок, якщо раптом користувач вирішить перевстановити програму, раніше встановлену в системі). Таким чином, ми можемо встановлювати не більше 1 024 програм з games.mail.ru (4096/2/2 = 1024), а на практиці і того менше, після чого Windows увійде в штопор і станеться загальносистемний крах.

Кому-то 1 024 програми может здати дуже великою, но це не так. Если система не встановлюваті заново рокамі, но кожен день встановлюється / відаляється нове програмне забезпечення, то такими темпами відведеній ліміт вічерпується дуже Швидко. І що найцікавіше, з Windows 2000 функції LsaStorePrivateData / LsaRetrievePrivateData офіційно задокументовані, і існує безліч утиліт, що відображають вміст захищеного сховища.

Microsoft взагалі не рекомендує використовувати LSA, а вже тим більше такими варварськими методами без видалення слотів при деінсталяції програми.

Повну версію статті   читай в   листопадовому номері   Хакера
Повну версію статті
читай в листопадовому номері Хакера. На нашому диску ти знайдеш популярні утиліти для моніторингу LSA, а також оригінал гри «Століття Японії».

Спробуємо їх змінити?
Але ж не писати ж через це цілий драйвер?
А як бути, якщо ми схаменулися надто пізно і відпущений нам ігровий час уже минув?

Уважаемые партнеры, если Вас заинтересовала наша продукция, мы готовы с Вами сотрудничать. Вам необходимо заполнить эту форму и отправить нам. Наши менеджеры в оперативном режиме обработают Вашу заявку, свяжутся с Вами и ответят на все интересующее Вас вопросы.

Или позвоните нам по телефонам: (048) 823-25-64

Организация (обязательно) *

Адрес доставки

Объем

Как с вами связаться:

Имя

Телефон (обязательно) *

Мобильный телефон

Ваш E-Mail

Дополнительная информация: