Как вылечить программу от серийного номера

Как вылечить программу от серийного номера thumbnail

Потеря ключей для регистрации программы иногда становится проблемой гораздо большей, чем если бы был потерян ключ от квартиры. В последнем случае можно дождаться других членов семьи и открыть входную дверь их дубликатом, или, в крайнем случае, даже выбить дверь и вставить новый замок. Но если потерян регистрационный ключ или серийный номер от какой-нибудь программы, восстановить данные лицензии бывает крайне затруднительно. Причем в потере серийного номера не обязательно виноват сам пользователь. Разработчики ПО часто приклеивают к продаваемым коробочным версиям ярлыки с указанием серийного номера, а со временем такой номер может затереться или отклеиться. Чтобы избежать потери лицензионных данных, необходимо заранее сделать резервную копию всех ключей и серийных номеров программ, установленных в системе.

О программах, которые помогают автоматизировать этот процесс, мы и расскажем в сегодняшнем обзоре.

⇡#Product Key Explorer 2.4.9

  • разработчик: Nsasoft
  • размер дистрибутива: 1,54 Мб
  • распространение: shareware
  • русский интерфейс: нет

Эта небольшая утилита – один из самых универсальных инструментов для восстановления регистрационной информации. Product Key Explorer поддерживает более тысячи различных программ. С помощью этой утилиты можно находить серийные номера к таким популярным приложениям, как Microsoft Office, VMware Workstation, CyberLink PowerDVD, Winamp, ZoneAlarm, Borland Delphi и пр.

Как вылечить программу от серийного номера 

После непродолжительного анализа системного реестра, Product Key Explorer составляет таблицу, в которой показывает приложения и серийные номера, используемые этими программами.  При этом полученную информацию о ключах к программам можно не только сохранить или вывести на печать. Product Key Explorer может использовать эти данные для составления специального файла реестра, который очень удобно использовать при последующей переустановке системы с программами. Достаточно будет выполнить импорт такого файла, и в реестр будут добавлена информация о регистрационных данных всех приложений.

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

Стоит заметить, что даже в демонстрационном режиме  некоторые приложения, которые дают возможность найти в системе серийные номера, могут оказаться полезными. Например, незарегистрированная программа Product Key Explorer показывает начало ключа, используемого приложением. Как знать, быть может, именно начало секретного набора символов заставит пользователя вспомнить весь серийный номер целиком.

⇡#Recover Keys 4.0

  • разработчик:  Nuclear Coffee
  • размер дистрибутива: 4,56 Мб
  • распространение: shareware
  • русский интерфейс: есть

Одна из особенностей программы Recover Keys – возможность сканирования как локального компьютера, так и удаленного. Эта функция программы работает лишь в том случае, если пользователь обладает соответствующими правами администратора.

Помимо серийного номера, Recover Keys идентифицирует ID программы, а также некоторую дополнительную информацию о регистрации – имя пользователя, на которого выполнена регистрация, и название компании.

В отличие от других аналогичных утилит, данная программа позволяет уточнить область поиска, указав разделы системного реестра, которые будут сканироваться – HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER, HKEY_CLASSES_ROOT и HKEY_USERS. Кроме этого, в настройках программы можно задать фильтр, выбрав из доступного списка приложений те, к которым необходимо найти серийный номер. В перечне программ, для которых данная утилита может считать из реестра ключ, продукция компаний Autodesk, Adobe, Sony, Norton и многих других. Полный список поддерживаемых приложений всегда можно просмотреть на официальном сайте.

Как вылечить программу от серийного номера

В программе Recover Keys имеется удобный поиск, с помощью которого можно быстро найти ключ к определенной программе. Результат поиска информации об установленных приложениях можно сохранить в большое количество форматов: HTML, CSV, TXT, XML, XLS, DOC, RTF и PDF.

У этой программы существует также бесплатная версия, которая называется Magical Jelly Bean Keyfinder. Она может восстановить ключи примерно для трехсот приложений (Recover Keys работает более чем с двумя тысячами), не работает с Windows 7, Office 2010 и продуктами Adobe. В ней не предусмотрены возможности сканирования удаленных компьютеров, а отчеты можно сохранять лишь в двух форматах – TXT и CSV.

⇡#KeysRecover

  • разработчик: Keys Recover
  • размер дистрибутива: 156 Кб
  • распространение: shareware
  • русский интерфейс: нет

Несмотря на схожее с предыдущей программой название, утилита KeysRecover в значительной мере уступает Recover Keys, как по качеству анализа системного реестра, так и по набору функций. Помимо сведений о том, на чье имя зарегистрирована та или иная программа, KeysRecover также предоставляет дополнительную информацию о номере версии обнаруженного приложения, а также о том, какой тип лицензии используется в конкретном случае.

Как вылечить программу от серийного номера

Программа может сохранять текстовый файл с ключами или генерировать файл-отчет FoundKeys.HTML.

Единственное достоинство программы заключается в том, что незарегистрированная версия показывает некоторые серийные номера полностью, сообщая при этом, что ключ показывается не целиком. Скорее всего, это ошибка в работе программы, но пользователям такой «баг», само собой, только на руку.

⇡#Belarc Advisor 8.1m

  • разработчик: Belarc
  • размер дистрибутива: 2,23 Мб
  • распространение: бесплатно
  • русский интерфейс: нет

Широкую известность эта программа получила после скандальной истории, произошедшей несколько лет назад. Тогда из-за неосторожности системных администраторов в Интернет попали тысячи лицензионных серийных номеров к Windows и другим различным программам. Отчет о результатах проверки системы генерируется Belarc Advisor в виде файла HTML и сохраняется на жестком диске, что и стало причиной утечки данных – поисковые системы индексировали информацию, размещенную на страницах с отчетами. Несмотря на то, что это произошло в 2007 году, по запросу «Belarc Advisor Windows» крупнейшие поисковики до сих пор выдают конфиденциальные данные.

Belarc Advisor выполняет анализ системы и выводит детальную информацию о компьютере – показывает список установленного ПО, отображает перечень установленных обновлений Windows, а также предоставляет информацию о конфигурации компьютера (включая данные о BIOS, носителях, материнской плате, контроллерах и пр.), показывает сведения о сетевых подключениях и т.д. Среди этой информации можно найти и данные о серийных номерах некоторых приложений.

Читайте также:  Как вылечить келоидные рубцы народные средства

Как вылечить программу от серийного номера

По сравнению с другими утилитами, скажем, с Product Key Explorer, список серийных номеров в Belarc Advisor гораздо меньше. Впрочем, не стоит забывать, что Belarc Advisor распространяется бесплатно и часто обновляется, что в некоторой степени оправдывает программу. Программа способна «увидеть» регистрационные данные Kaspersky Internet Security 2010,  Nero10, TechSmith Camtasia Studio, Adobe Acrobat 9, Windows (любой версии), утилиты  компании SlySoft и пр.

⇡#LicenseCrawler 0.0.42

  • разработчик: Martin Klinzmann
  • размер дистрибутива: 71 Кб
  • распространение: бесплатно
  • русский интерфейс: нет

Программа LicenseCrawler имеет минималистичный дизайн, а номер ее последней версии не достиг и единицы. Она не требует установки и распространяется бесплатно. Тем не менее, программа довольно хорошо определяет серийные номера, справляясь с некоторыми приложениями, которые «не по зубам» даже коммерческим утилитам. При запуске LicenseCrawler позволяет указать, какая область реестра будет исследоваться на предмет наличия информации о лицензии. Несмотря на небольшой размер, LicenseCrawler может также анализировать реестр удаленного компьютера, для чего в списке «Computer» следует изменить «localhost» на имя или IP-адрес тестируемого компьютера. Если вы используете программу для поиска в 64-разрядной системе, обязательно установите соответствующий флажок в настройках программы – это даст программе возможность определить большее число серийных номеров.

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

Как вылечить программу от серийного номера

Разработчик LicenseCrawler справедливо предполагает, что хранить на жестком диске такую конфиденциальную информацию, как сведения о лицензионных ключах, небезопасно. Поэтому в программу был добавлен специальный модуль для шифрования отчета. С помощью этой опции можно сохранить данные о регистрации в зашифрованный текстовый файл. Если такой файл открыть стандартным образом, например, используя для этого Блокнот, данные будут представлены хаотичным набором символов. Чтобы расшифровать информацию, нужно открыть этот файл в LicenseCrawler и ввести заранее заданный пароль.

⇡#SoftKey Revealer 2.2.4

  • разработчик: Mustafa Bugra Aktas
  • размер дистрибутива: 158 Кб
  • распространение: бесплатно
  • русский интерфейс: нет

Небольшую бесплатную утилиту SoftKey Revealer отличает, в первую очередь, высокая скорость работы – для определения всех данных программе может понадобится всего пара секунд. Данная программа очень проста в работе и не содержит никаких настроек. Достаточно просто запустить EXE-файл, после чего сразу же появится список установленных приложений с регистрационными данными.

Данные из SoftKey Revealer можно быстро импортировать в Word с помощью команды File > Copy to Word. Если нажать на кнопку Save, в директории, откуда была запущена утилита, будет сохранен текстовый файл со всей обнаруженной информацией.

Как вылечить программу от серийного номера

К сожалению, список программного обеспечения, обнаруженный программой SoftKey Revealer, не очень точный, к тому же для отдельных приложений эта утилита вообще не определяет регистрационные данные, оставляя пустое место.

⇡#Заключение

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

Если Вы заметили ошибку — выделите ее мышью и нажмите CTRL+ENTER.

Источник

Если потерян регистрационный ключ или серийный номер от какой-нибудь программы, восстановить данные лицензии бывает крайне затруднительно. Причем в потере серийного номера не обязательно виноват сам пользователь. Разработчики ПО часто приклеивают к продаваемым коробочным версиям ярлыки с указанием серийного номера, а со временем такой номер может затереться или отклеиться. Чтобы избежать потери лицензионных данных, необходимо заранее сделать резервную копию всех ключей и серийных номеров программ, установленных в системе.
Вашему вниманию представлен комплект программ, которые помогают автоматизировать этот процесс.

Состав комплекта программ для определения серийных номеров:

Product Key Explorer 2.4.9.0 Portable

Эта небольшая утилита – один из самых универсальных инструментов для восстановления регистрационной информации. Product Key Explorer поддерживает более тысячи различных программ. С помощью этой утилиты можно находить серийные номера к таким популярным приложениям, как Microsoft Office, VMware Workstation, CyberLink PowerDVD, Winamp, ZoneAlarm, Borland Delphi и пр.
После непродолжительного анализа системного реестра, Product Key Explorer составляет таблицу, в которой показывает приложения и серийные номера, используемые этими программами. При этом полученную информацию о ключах к программам можно не только сохранить или вывести на печать. Product Key Explorer может использовать эти данные для составления специального файла реестра, который очень удобно использовать при последующей переустановке системы с программами. Достаточно будет выполнить импорт такого файла, и в реестр будут добавлена информация о регистрационных данных всех приложений.

Belarc Advisor 8.1m

Широкую известность эта программа получила после скандальной истории, произошедшей несколько лет назад. Тогда из-за неосторожности системных администраторов в Интернет попали тысячи лицензионных серийных номеров к Windows и другим различным программам. Отчет о результатах проверки системы генерируется Belarc Advisor в виде файла HTML и сохраняется на жестком диске, что и стало причиной утечки данных – поисковые системы индексировали информацию, размещенную на страницах с отчетами. Несмотря на то, что это произошло в 2007 году, по запросу «Belarc Advisor Windows» крупнейшие поисковики до сих пор выдают конфиденциальные данные.
По сравнению с другими утилитами, скажем, с Product Key Explorer, список серийных номеров в Belarc Advisor гораздо меньше. Впрочем, не стоит забывать, что Belarc Advisor распространяется бесплатно и часто обновляется, что в некоторой степени оправдывает программу. Программа способна «увидеть» регистрационные данные Kaspersky Internet Security 2010, Nero10, TechSmith Camtasia Studio, Adobe Acrobat 9, Windows (любой версии), утилиты компании SlySoft и пр.

Читайте также:  Как вылечить прозрачные сопли у ребенка в домашних условиях

LicenseCrawler 0.0.42

Программа LicenseCrawler имеет минималистичный дизайн, а номер ее последней версии не достиг и единицы. Она не требует установки и распространяется бесплатно. Тем не менее, программа довольно хорошо определяет серийные номера, справляясь с некоторыми приложениями, которые «не по зубам» даже коммерческим утилитам. При запуске LicenseCrawler позволяет указать, какая область реестра будет исследоваться на предмет наличия информации о лицензии. Несмотря на небольшой размер, LicenseCrawler может также анализировать реестр удаленного компьютера, для чего в списке «Computer» следует изменить «localhost» на имя или IP-адрес тестируемого компьютера. Если вы используете программу для поиска в 64-разрядной системе, обязательно установите соответствующий флажок в настройках программы – это даст программе возможность определить большее число серийных номеров.
Разработчик LicenseCrawler справедливо предполагает, что хранить на жестком диске такую конфиденциальную информацию, как сведения о лицензионных ключах, небезопасно. Поэтому в программу был добавлен специальный модуль для шифрования отчета. С помощью этой опции можно сохранить данные о регистрации в зашифрованный текстовый файл.

SoftKey Revealer 2.2.4

Небольшую бесплатную утилиту SoftKey Revealer отличает, в первую очередь, высокая скорость работы – для определения всех данных программе может понадобится всего пара секунд. Данная программа очень проста в работе и не содержит никаких настроек. Достаточно просто запустить EXE-файл, после чего сразу же появится список установленных приложений с регистрационными данными.
Данные из SoftKey Revealer можно быстро импортировать в Word с помощью команды File > Copy to Word. Если нажать на кнопку Save, в директории, откуда была запущена утилита, будет сохранен текстовый файл со всей обнаруженной информацией.
разработчик: Mustafa Bugra Aktas

Размер архива: 6,2 Мб

Подписывайтесь на наш Дзен-канал Xrust, чтобы не пропустить новые статьи!

Пожалуйста зарегистрируйтесь или введите в Панели пользователя логин и пароль.

Если не хотите регистрироваться, то введите логин: demo пароль:demo

Нужна Помощь по установке программы Комплект программ для определения серийных номеров ?

Источник

Абсолютное большинство защит на серийных ключах построено по одному и тому же принципу. Их даже ломать становится неинтересно. Но вот crackme WhatHTML, написанный программистом c ником Chiwaka, представляет собой пример хорошей защиты на серийном ключе. Именно ее мы сегодня и разберем.

Для регистрации программ, защищенных с помощью серийных ключей, пользователю предлагается ввести уникальное имя и серийный номер (они, как правило, поставляются в закрытом конверте вместе с лицензионной копией программы). Программа как-то проверяет их и выдает свой вердикт: данная копия либо зарегистрирована, либо нет.

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

Взлом таких защит сводится к простому «выдиранию» алгоритма генерирования серийного номера на основе имени пользователя. Причем мне встречались такие crackme’сы, в которых для написания keygen’а не требовалось даже разбираться в этом самом алгоритме: все решалось тупым копированием процедур, ответственных за генерацию валидного серийного номера. Понятно, что это достаточно скучное дело, даже не требующее серьезного напряжения извилин.

Что мы будем ломать

Crackme WhatHTML — это тоже пример защиты на регистрационном ключе. Но построенный по совершенно иному принципу. Написан он программистом, известным под ником Chiwaka. Скачать сам crackme можно бесплатно по ссылке cracklab.ru/crackme/whathtml.zip. Именно это я и предлагаю тебе сделать, закрыв эту статью. Ведь ломать самому всегда намного интереснее, чем читать инструкции по взлому. Главное окно программы представлено на одноименном рисунке. Значение в поле «Machinecode» у тебя будет другим. Откуда оно берется, узнаем позже. Как нетрудно догадаться, нужно найти валидные комбинации значений полей «Name» и «Serial», а также по возможности написать keygen.

Ну что ж, со знакомством, думаю, закончили. Теперь переходим к самому интересному.

Первый взгляд

Итак, приступим. Начинается программа с получения адреса функции ShowHTMLDialog из библиотеки mshtml.dll (делается это с помощью стандартных функций LoadLibraryA и GetProcAddress).

После этого вызывается несколько процедур, которые и выполняют основную работу. Ниже приводится дизассемблерный листинг этой части программы, полученный с помощью IDA Pro,а также мои комментарии к нему:

.text:00401043 call sub_4010B2
.text:00401048 call sub_401298
.text:0040104D call sub_401169
; Если пользователь просто закрыл окно, то выходим
; из программы, иначе вызываем процедуру sub_401298
.text:00401052 cmp dword_40303B, 0
.text:00401059 jnz short loc_401060
.text:0040105B call sub_401298
; Завершаем работу приложения
.text:00401060 pop large dword ptr fs:0
.text:00401067 add esp, 4
.text:0040106A push 0 ; uExitCode
.text:0040106C call ExitProcess
.text:0040106C start endp

Из листинга видно, что программа последовательно вызывает три процедуры (sub_4010B2, sub_401298, sub_401169); в том случае, если пользователь нажал на кнопку «Register», то еще раз вызывается процедура sub_401060. Что ж, пока вроде ничего сложного. Теперь познакомимся с нашими процедурами поближе.

Таинственное поле Machinecode

Первой на очереди стоит процедура sub_4010B2. В этой процедуре вызывается функция GetSystemInfo, и на основе возвращенных ей данных по определенному алгоритму формируется значение, которое и идет в поле «Machinecode».

Читайте также:  Как вылечить у кота чесотку

Не ассемблером единым

Процедура sub_401298 ответственна за формирование и отображение окна на экране. В ней происходит вызов найденной ранее функции ShowHTMLDialog. В качестве параметра она принимает строку с html-кодом окна. В целях экономии места демонстрировать весь html-код окна я не буду, приведу лишь код обработчика нажатия на кнопку «Register», написанный на JavaScript.

Вот он:

function okButtonClick()
{
var x = 0;
var y = 0;
var z = 0;
var charx = 0;
var chary = 0;
var myName = Name.value;
var mySerial = Serial.value;
var myRandom = Random.value;

for (var i=0; i<myName.length; i++)
{
x = x + myName.charCodeAt(i);
}
for (var i=0; i <mySerial.length; i++)
{
charx = mySerial.charCodeAt(i-1);
chary = mySerial.charCodeAt(i);
if (charx != chary)
{
z = z + chary;
charx = chary;
}
}
for (var i=0; i <arrArgs.length;i++)
{
y = y + arrArgs.charCodeAt(i);
}

window.returnValue = x.toString(10)+ “?” + z.toString(16) + “?” + y.toString(10);
window.close();
}

Если ты знаком с языком JavaScript, то легко увидишь, что здесь происходит суммирование кодов символов, составляющих имя, серийный номер и код машины (поле «Machinecode»). Причем очередной символ серийного номера добавляется только в том случае, если он отличается от предыдущего символа серийного номера. Полученные значения оформляются в строку, символомразделителем служит знак «?». Эта строка возвращается приложению, создавшему окно.

Защита

Следом за вызовом процедуры sub_401298, создающей окно, идет вызов процедуры sub_401169, которая представляет для нас особый интерес, поскольку именно в ней сосредоточен защитный механизм.

Данная процедура осуществляет разбор полученной на прошлом этапе строки и формирует три числа на основе имени пользователя, серийного номера и информации о машине. Числа формируются по следующему принципу: если у нас в качестве строкового выражения было передано «725», то после преобразований будет получено значение 725h.

Полученные таким нехитрым образом числа складываются друг с другом, образуя ключ, которым расшифровывается внутренний буфер. Дизассемблерный код расшифровщика приводится ниже:

; Цикл расшифровки буфера. Алгоритм расшифровки —
; банальный xor. Ключ расшифровки лежит в регистре cx
.text:00401225 mov ebx, dword_403CF4
.text:0040122B lea eax, String ; “.b”
.text:00401231 xor edx, edx
.text:00401233 jmp short loc_40123C
.text:00401235
.text:00401235 loc_401235:
.text:00401235 xor [edx+eax], cx
.text:00401239 add edx, 2
.text:0040123C
.text:0040123C loc_40123C:
.text:0040123C cmp edx, ebx
.text:0040123E jb short loc_401235
; Проверка правильности расшифровки, осуществленная
; путем сравнения трех символов из расшифрованного
; буфера с эталонными символами. Если хотя бы
; один символ не совпадает с образцом, нас посылают
; куда подальше.
.text:00401240 lea eax, unk_403072
.text:00401246 cmp byte ptr [eax], 28h
.text:00401249 jnz short loc_401272
.text:0040124B cmp byte ptr [eax+5], 12h
.text:0040124F jnz short loc_401272
.text:00401251 cmp byte ptr [eax+0Ah], 1
.text:00401255 jnz short loc_401272
; Если мы здесь, значит, нас признали легальными
; пользователями
.text:00401257 call sub_401372

Подытожив все вышесказанное, можно описать работу программы так:

  1. На основе информации о машине формируется некоторое кодовое число «Machinecode»;
  2. У пользователя запрашивается имя и серийный номер;
  3. По значениям«Machinecode», имени и серийного номера с помощью JavaScript-кода формируется три числа;
  4. На основе полученных трех чисел формируется ключ к расшифровке буфера;
  5. Расшифровывается вшитый буфер;
  6. Правильность расшифровки проверяется по трем символам, взятым из расшифрованного буфера;
  7. Если все расшифровано верно, то пользователь признается легальным правообладателем. Если же буфер расшифрован неправильно, то пользователю сообщается об ошибке.

Теперь, когда мы разобрались с устройством защиты, давай перейдем к ее взлому.

Взлом

Вот тут-то начинается самый настоящий простор для фантазии: дело в том, что взломать программу можно не одним и даже не двумя способами. Самое простое, что приходит на ум, это исправить условные переходы в проверке правильности расшифровки так, чтобы они никогда не срабатывали. Или вообще забить эту проверку nop’ами. Но при таком подходе мы не увидим поздравительного сообщения (да-да, в расшифровываемом буфере находится именно оно). Давай думать, что нам известно об используемом шифре.

Во-первых, алгоритм шифрования — xor, а значит, имея пару «зашифрованная строка и расшифрованная строка», а затем выполнив операцию xor между ними, мы найдем ключ расшифровки. Во-вторых, ключ расшифровки находился в регистре cx, а значит, длина ключа — два байта. Помимо всего прочего, у нас есть три пары значений «зашифрованный символ и расшифрованный символ» (эталон, по которому программа определяет правильность расшифровки). Все это позволяет нам без труда определить требуемый ключ расшифровки: 04E6h.

Зная требуемый ключ, мы можем перед циклом расшифровки воткнуть либо команду «mov cx, 04E6h», либо написанный полноценный keygen.

А что, в написании keygenа для этой программы нет ничего сверхсложного. Работать keygen будет приблизительно по следующей схеме:

  1. Точно так же, как это делает ломаемая нами программа, определяем параметры компьютера пользователя и рассчитываем на их основе кодовое число;
  2. Предлагаем пользователю ввести имя, на которое он хочет сгенерировать серийный номер;
  3. На основе введенного имени вычисляем соответствующее ему число (снова так же, как это делает программа);
  4. Зная числа, основанные на имени пользователя, параметрах компа и ключе расшифровки, определяем третье число — основанное на серийном номере;
  5. Зная число, к которому должен приводить серийный номер, находим сумму символов серийного номера;
  6. Зная сумму символов серийного номера, генерируем сам номер и отдаем его пользователю.

Вот и весь keygen.

Заключение

Мы рассмотрели пример неплохой защиты, основанной на серийном номере. Как видишь, даже здесь, во вроде бы давно избитой методике защиты приложений, есть место воображению. Так что, если ты программист и хакер, то проявляй фантазию даже в тривиальных, казалось бы, вещах, и всем станет жить намного интереснее.

Источник