Вообще-то технология взлома программного обеспечения (а если по-крэкерски - то просто  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 (C)onditional Jump at Address:  |:0045BAD3(C)  |  :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, в качестве имени крэкера - мой алиас и  краткую информацию о программе в соответствующем окне.