Взагалі-то технологія злому програмного забезпечення (а якщо по-крэкерски — то просто warez’а) досить-таки добре описана у безлічі Cracking Tut0Ria1Z і статей на тему «How2Crack чогось там». З великою або меншою кількістю технічних подробиць. Проте жоден з цих Tut0Ria1Z не скаже, що рухало людиною, ломающим софт, заради чого він цим займався — і що стояло за сухими рядками звіту «правимо значення байта по зсуву 72035 з 75 на EB — запускаємо, працює!». Якщо Ви хочете зрозуміти, «навіщо» — Вам не допоможуть ніякі дизассемблерные оголошень і дампи пам’яті, підручники і мегабайти крэкерского вареза. Щоб відчути це потрібно влізти в шкуру крэкера, думати і відчувати, як крэкер, жити його життям — але для більшості це просто нереально. Хто зважиться вирвати зі свого життя безліч днів і ночей на вдосконалення своїх знань Асемблера, читання статей на неймовірно спаплюжений англійською і копання в кривих c0d3z — все заради того, щоб змусити таку гарну, але таку дорогу програмку працювати кілька довше відпущених їй 30 днів? Та ще щоб куплені буржуями видання у чергової раз оголосили тебе злочинцем.
Ось для того я і пишу цю статтю — щоб кожен, незалежно від віку і знань міг хоч трохи доторкнутися до світу Warez Cracking, якщо не в якості першої особи, то в якості того, хто це бачив, «дивиться з-за плеча». А вже я поведу Вас через темні безодні C0D3Z — і постараюся, щоб Ви побачили і відчули все, що варто побачити і відчути хоч один раз в житті. Від Вас не потрібно ніяких хакерських талантів, насправді важливо лише одне — бажання дізнатися і зрозуміти. І не дуже вірте тим, хто скаже: «зламувати софт — це погано, це злочин» — їм я відповім цитатою з «Совісті хакера»: “… тепер у нас свій світ — світ електрона і клавіатури, світ краси даних. Ми використовуємо існуючі системи і не хочемо платити за те, що могло б бути безкоштовним, але належить багатим жлобам — і ви називаєте нас злочинцями. Ми досліджуємо — і ви називаєте нас злочинцями. Ми шукаємо нових знань — і ви називаєте нас злочинцями. Нас не хвилює колір шкіри і національність, ми живемо без релігійної ворожнечі — і ви називаєте нас злочинцями. Ви робите ядерні бомби, розпалюєте війни, вбиваєте, брешете і хочете змусити нас повірити, що все це для нашої ж користі — так, тоді ми — злочинці. Так, я — злочинець. Мій злочин — цікавість. Мій злочин у тому, що я суджу про людей за того, що вони говорять і думають, а не по тому, як вони виглядають. Мій злочин у тому, що я — за межами вашого розуміння, і цього мені ви ніколи не пробачите.”
U r r3ADy? Тоді поїхали… Ось і наша мета: Turbo Browser 2000. SoftIce 4.05 заздалегідь завантажений, налаштований і чекає своєї години. Ну чтож, запустимо програму і з’ясуємо, у чому власне полягає проблема. З’ясували: судячи з документації (Ви читаєте документацію? А я ось читаю) — самий звичайний Time Limit, поточна дата зчитується абсолютно стандартним чином. Покрутимо туди-сюди годинник — до списку проблем додався ще й NAG Screen досить витонченого виду (але від цього він не стає менш NAG). Потім натравим на бідну програму RegMon і FileMon. Результатом всього цього будуть кілобайти логів, з яких стає очевидним лише одне — програма використовує досить оригінальний спосіб дізнаватися дату свого першого запуску.
Починаємо розбирати програму — старий, але все ще надійний і смертоносний W32Dasm 8.93 допоможе нам і в цей раз. А поки він буде перемелювати півтора мегабайта машинного коду навпіл з усяким сміттям, у нас є десять хвилин. Як раз, щоб збігати на кухню і витягнути з холодильника пляшку крижаний Крейзі-коли — а потім дивитися, як повзе індикатор прогресу, відзначаючи чергову тисячу рядків дизассемблированного коду. Ніч буде довга.
На цей раз все виявилося просто — запусти і дивися, як обсяг лістингу повільно, але вірно наближається до захмарних вершин. Але так буває не завжди, і особливо останнім часом. Виробники софта так і норовлять упакувати свій шедевр який-небудь гидотою начебто NeoLite або ASPack, навішати VBox’ів — в безглуздої надії, що це когось зупинить. Але на кожну «непробивний» захист у нас знайдеться всесокрушающее зброю — розпакувальники, PE-редактори, патчі для SoftIce домашнього виробництва. Ну і звичайно — беззмінний ProcDump, який так вдало вбудований скрипт-мова. Що-небудь з великого крэкерского архіву обов’язково підійде. Не може не підійти. Просто треба зуміти їх роздобути — всі ці маленькі милі штучки, весь сенс існування яких укладено в тому, щоб перетворювати витончені захисту в купи руїн.
Нас, крэкеров, постійно плутають з хакерами — ні, навіть не з тими, які ламають сервера або пишуть поодинці безпросвітно наворочені програми — з звичайними варезными хакерами, ломающими софт в основному заради власного задоволення і рішення витончених загадок. Але ми не такі, наша мета — результат, і результат будь — якою ціною. Для нас немає «заборонених» прийомів: серійник — відмінно, патч — добре, memory patch — теж зійде, якщо інакше не виходить. Хтось може тижнями займатися філігранною роботою — а ми видаємо вал, адже по великому рахунку всім начхати, ЯК це було зламано — лише б працювало. А працювати ми змусимо — заради того і просиджуємо ночі безперервно перед своїми 14-15-17-дюймовими амбразурами.
Ну ось, дизасемблювання завершено. Вийшов гарненький такий файл, 20 з половиною мегабайт, майже півмільйона рядків тексту — це при тому, що потрібний нам шматок захисту сосредеточен від сили сотні ассемблерних команд, які нам тепер і належить знайти. Набагато простіше, ніж голку в копиці сіна — якщо, звичайно, не знати деяких прийомів. Тепер запускаємо Symbol Loader від СофтАйса і після необхідних формальностей опиняємося на точці входу програми. Оглядаємося. Навколо — чорна безодня навпіл з написами INVALID. Тиснемо F8 — ось тепер стало трохи веселіше. «Так от ви які, c0d3z — а я думав у вас образу немає!»
Щож, немає софта без глюків і СофтАйс при всьому його безпросвітному велич — не виняток. Неглючный крэкерский софт — це щось з області мрій. Причому мрії свідомо нездійсненною — але мріяти все одно корисно. Будь-яка з цих чудових програмок запросто може в кращому випадку звалитися сама, а в гіршому — потягти за собою систему, причому КОЛИ це станеться — лише питання часу. І зазвичай часу дуже близького. І тим не менш софт нам життєво необхідний — різний і багато. По-справжньому багато, і притому самих останніх версій — якщо хочеш щось зробити швидко, добре і ефективно, потрібно мати під рукою все найновіше і найкраще. До того ж ніколи заздалегідь не знаєш, що саме тобі знадобиться завтра, і тому доводиться тягнути на свою машину все, що може хоч колись придатися. Наприклад, одних патч-генераторів у мене півтора десятка — від найпростіших до професійного інструменту легальних програмістів, за допомогою якого створюються апдейти програм.
Так, у крэкинге теж є свої базові прийоми, без знання яких нічого не досягнеш — але, на щастя, крэкинг — це не та область, де можна нескінченно використовувати готові рішення. Навпаки, крэкинг вимагає самодисципліни і постійного розширення знань — і це знання зовсім особливого роду, їх неможливо «отримати» у звичайному сенсі слова. Ці знання потрібно знайти і зробити їх частиною себе, не сподіваючись витягти з них вигоду або домогтися визнання. Більш того, сучасній крэкеру потрібна навіть певна сила духу, щоб захистити своє «право на існування» в сучасному світі, де єдиною реальною ценостью є капітал, а людина розглядається лише як джерело прибутку.
Так, що там у нас є проти Time Limit із стандартних прийомів? Є BPX GetLocalTime (70% ймовірності, що спрацює) і BPX GetSystemTime (25% відповідно). Решта 5% — екзотика, але забувати про неї теж не варто. Пробуємо найбільш ймовірне — і отримуємо результат. Негативний. Гаразд, робимо захід по другому варіанту. F12. Ось тепер щось є — нас викидає в нетрях fsutil70.dll. Хороший привід згадати, що було написано в лістингу про довантажувати DLL — їх там цілих 22 штуки, але ніякого fsutil70 там і близько не було. Інакше я б помітив і сильно здивувався. Так що ж — знову не те? Але все одно натискаю F12 — і ось я всередині процесу TURBOB.EXE. Схоже, це все-таки саме те, що я шукав. Може бути. Записую адресу, на якому я вивалився з DLL, потім на всякий випадок обвожу його на кілька разів жирною рамкою — авторучка і исписаный у кілька шарів адресами та кодами листок паперу мабуть ніколи не зникнуть з крэкерского арсеналу. Третя година ночі, вся кола випита. Хто б мені пояснив, як це виходить — випити півтора літра коли і не помітити цього. Зате тепер у мене є, з чого почати — 4 байта адреси. Так що можна спокійно йти спати.
У кожної, навіть самої потужної, захисту є своя уразлива точка — варто лише його знайти, як після єдиного отточеного і вивіреного удару захисні механізми руйнуються як картковий будиночок, звертаючись в ніщо. Я вірю в те, що для успішного злому необхідно зрозуміти, побачити, відчути ЩОСЬ — і знайти цю саму точку опори. А потім вчепитися в неї мертвою хваткою. І далі все буде просто. Звичайно, знайти цю точку не завжди легко, іноді навіть ДУЖЕ важко — але моя віра мені допоможе.
Ну ось, насувається наступна ніч — а значить пора продовжити розпочату справу. Тобто доруйнувати-таки нещасний TurboBrowser. Кола скінчилася вчора і нової більше немає, значить сьогодні будемо пити воду з-під крана. Дивимося на папірець — обведений жирною рамкою, там стоїть адресу в пам’яті: 45BAC4. Відновлюємо в пам’яті події попередньої ночі. Далі — звична ланцюжок: Symbol Loader — BPX — F12. Потім ще раз F12. І ще. Ну ось ми і вдома — перед нами розляглися такі бажані і прекрасні коди:
:0047202D E8499AFEFF call 0045BA7B
:00472032 85C0 test eax, eax
:00472034 53 push ebx
:00472035 7562 jne 00472099

Тільки не питайте, як я здогадався, що саме тут і лежить корінь проблеми — я все одно не зможу до кінця це пояснити. Вважайте, що це шосте відчуття, яке з’являється після декількох років програмування, прочитання десятків Cracking TutoRialZ і злому трьох з гаком десятків програм. Так чи інакше — але мені тут все зрозуміло. І я знаю, що з цим треба зробити.
Тепер залишилося тільки трохи пограти з прапорцем перенесення, щоб переконатися у своїй повній правоті — і можна починати патчити програму. Тобто майже можна — залишилося лише перевірити деякі дрібниці. Ну наприклад, що це таке?
* Referenced by a (U)nconditional or ©onditional Jump at Address:
|:0045BAD3©
|
:0045BADA 6AFF push FFFFFFFF
:0045BADC 6A00 push 00000000
* Possible Reference to String Resource ID=61334: «Reminder:
This copy of Turbo Browser will expire soon. Order»
|
:0045BADE 6896EF0000 push 0000EF96
:0045BAE3 E827200500 call 004ADB0F

Завжди потрібно заглядати якщо не в корінь, то хоча б на півкроку вглиб — інакше можна дуже сильно помилитися. Наприклад, як помилилися люди, ломавшие Socrat97: успішно жбурнувши 30-денний trial, вони не потрудилися поганяти програму у всіх режимах — і не помітили ще одного обмеження на використання вбудованого словника. Загалом, прикладів вистачає — і не хотілося б поповнювати їх число. І тут — як раз такий випадок: здавалося б, невеличка помилочка, так і MessageBox буде турбувати користувача всього один день, ніяк не впливаючи на роботу програми. Але все ж…
Трохи погравши з прапорцем Z ми з’ясовуємо, що в деякому випадку (а саме — безпосередньо перед закінченням 30-денного терміну) з’являється MessageBox з попередженням: «Ваш час закінчується — так що готуйте грошики на реєстрацію». Тобто там написано дещо інше — але сенс я передав досить точно. Ясна річ, подібні нагадування програму зовсім не прикрашають, а тому повинні бути ліквідовані. І це зовсім неважко зробити, — лише переправити один-єдиний перехід за адресою 45BACD. Але це буде завтра.
Забобони. Якщо б їх не було, нам жилося б набагато легше. У крэкинге теж вистачає своїх забобонів — і головне з них свідчить: «Патчити програми — це неправильно». Але я — противник забобонів. Можна навіть сказати — фанатичний супротивник. І тому буду ламати софт так, як мені подобається, а не з придуманого кимось правилами. Можливо, комусь подобається просиджувати днями перед дисплеєм, вирішуючи чергову головоломку, але це не для мене. Я вірю в швидкий і ефективний злом — будь-якою ціною, будь-якими засобами. Якщо мій слід — перетворений в руїни машинний код і знівечена до невпізнання логіка захисних процедур — нехай воно так і залишиться. Моя мета — працююча програма. Правильно і добре працює. І все, що наближає цю мету — праведно, а все, що заважає — SuXXX і MuZDiE.
Настав час рутинної роботи. З трудом знаходжу на исписанном листку (ох, не пора його викинути і взяти чистий?) потрібні адреси і відновлюю в пам’яті, що мені належить зробити. Але спочатку треба зняти з файлу програми резервну копію. Це — святе. Коли доводиться виконувати по-справжньому складний злом, такі копії робляться після кожного вдалого кроку. Немає нічого більш образливого, ніж повторювати нудну і копітку роботу виключно через власну неуважність.
Так, що там у нас: переробити умовний перехід безумовний за адресою 472035. Це просто — опкод короткого jmp я пам’ятаю напам’ять. Тепер виправити ще один перехід за адресою 45BACD. Можна, звичайно, скористатися вбудованим в HIEW ассемблером — але навіщо? Обчислюємо зміщення в розумі (FF-CF — не найскладніша задача) і шестнадцатиричным кодом пишемо EB 30. Ось тепер можна пробувати.
І ВОНО ПРАЦЮЄ!
Що я відчуваю, розколів чергову програму? Якщо в двох словах, то я відчуваю абсолютно дикий, похмурий і неземний кайф. Це майже релігійне почуття, екстаз в чистому вигляді — проникнувши своєю свідомістю в глибини чужого коду, змусити його виконати всі твої бажання. Зробити те, про що більшість людей не наважуються навіть мріяти. Якщо Ви за все своє життя не зламали ні однієї програми — Вам ніколи цього не зрозуміти. І якщо Ви думаєте, що може бути хоч щось порівнянне з цим відчуттям, а вже тим більше краще — я не буду Вас переконувати. Я просто Вам не повірю.
Залишилася дрібниця — зробити результати своїх праць загальнодоступними. Коли-то давно я писав свої креки на Borland Pascal, акуратно вбиваючи зміщення в файлі і значення байтів в заздалегідь написаний каркас тріщина-файлу. Потім я робив те ж саме з заготівлею на Форте. Але тепер все це в минулому. Патч-генератор бере всю чорнову роботу на себе — і в результаті виходить маленький і акуратний файл tb2k_crk.exe. Запустіть його — і Ви побачите логотип InqSoft, в якості імені крэкера — мій псевдонім і коротку інформацію про програму у відповідному вікні.