Blog. Just Blog

Исследование защиты программы Duplicate Image Finder

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Темная сторона Силы | Автор: ManHunter
Скриншот программы Duplicate Image Finder
Скриншот программы Duplicate Image Finder

Программа Duplicate Image Finder предназначена для поиска на вашем компьютере дубликатов графических файлов. Она способна обнаружить идентичные изображения не только по стопроцентному совпадению, но также если файлы изображений были переименованы, отконвертированы в другие графические форматы, и даже если изображения были отредактированы: изменен масштаб, изображение повернуто, зеркально отражено или растянуто по горизонтали или вертикали. Минусов у программы два: во-первых, для запуска необходим установленный .NET Framework, а во-вторых, для полноценной работы требуется купить лицензию аж за 25 баксов. Если с первым недостатком мириться можно, то второй я считаю критичным. Пациент, пройдите в пыточную.

Скачиваем дистрибутив, устанавливаем. Пусть вас не обнадеживает крохотный размер дистрибутива, ведь за каждым копеечным приложением на дотнете паровозом тянется .NET Framework на н-дцать десятков мегабайт. Таковы суровые реалии современной тенденции "программирования мышкой". Но сейчас не об этом. Основным ограничением программы является обработка только 500 файлов, после этого нам предлагают отправиться в кассу.

Сообщение незарегистрированной программы
Сообщение незарегистрированной программы

Как я уже неоднократно упомянул, программа написана на дотнете. И, следуя моему правилу, что под каждую задачу должно быть свое решение, нам нужен инструмент для работы с дотнетом. Этим инструментом является .NET Reflector. Открываем в нем наш подопытный исполняемый файл и ищем что-нибудь, связанное с вводом серийного номера. Лучше всего под это определение попадает нечто под названием frmEnterLicense.

Функция обработки нажатия на кнопку
Функция обработки нажатия на кнопку

Теперь надо посмотреть обработчики кнопок формы, которые тут задействуются. За сохранение введенного серийного номера отвечает btnSave_Click. Reflector декомпилирует код в читаемый текстовый листинг. Достаточно школьного курса информатики, чтобы понять, что и как тут работает. Вызывается некая функция License.IsLicenseValid с параметром введенной строки, дальше алгоритм ветвится на основании ее результата. Клик мышкой на название функции и Reflector любезно преподносит на блюдечке ее исходный код:

Функция проверки правильности лицензии
Функция проверки правильности лицензии

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

Регистрируем программу
Регистрируем программу

Так, для текущего 2014 года контрольное число будет (2014 - 2000) + 20 = 34. Слагаемые под него подобрать не проблема.

Программа успешно зарегистрирована
Программа успешно зарегистрирована

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

Поделиться ссылкой ВКонтакте
Просмотров: 6407 | Комментариев: 19

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
alex (06.10.2016 в 12:28):
manhunter, привет, тема хорошая будет продолжена?
ManHunter (22.10.2015 в 08:22):
Исходник кейгена на тех же Дельфях смотрелся бы логичнее :)
JokerBaD (22.10.2015 в 01:22):
ManHunter, хочется вложить небольшой вклад для тех, что начинает осваивать программирование и начинает это с Делфи/Паскаль
т.е для новичков переделанный пример для Делфи/Паскаль. Думаю, такие люди читают Ваш блок ... За Вами конечно же последнее слово на размещение данной переделки.

function IsLicenseValid(str: string): boolean;
var list: array of integer;
    num2, num3: integer;
    i,j: byte;
begin
try
  // удаляем начальные и конечные пробелы в строке ...
  str:=trim(str);
  // задаем размерность массива ...
  SetLength(list,length(str));
  // посимвольный поиск
  j:=0;
   for i:=1 to length(str) do
    begin
      // отбор цифр в серийном номере ...
      if str[i] in ['0'..'9'] then
        begin
         // добавляем найденую цифру в массив ...
         List[j]:=StrToInt(str[i]);
         j:=j+1;
end;
    end;

    // авторский алгоритм проверки на валидность серийного номера ...
    num2:=(CurrentYear-2000)+20;
    num3:=0;
    // суммируем все числа серин.номера которые отобрали проверкой ...
    for i:= 0 to j-1 do
       num3:=num3+list[i];
    // проверка на валидность ...
    if num3 = num2 then
     begin
      result:=true;// возвращяем истину из функции т.е ключ введен валидный ...
      exit;// выходи из функций проверки ...
     end;

except
  ShowMessage('IsLicenseValid');
end;
result:=false;
end;
JokerBaD (21.10.2015 в 15:18):
ФЭНКС ... хобби оставляю прежним)
ManHunter (27.02.2014 в 13:40):
Не думаю, что кто-то вообще это покупал :)
Андрей (27.02.2014 в 13:39):
Требуйте возврата денег !
:)
DICI BF (23.02.2014 в 21:55):
ManHunter, "Проверка лицензии" и "проверка серийника" это не одно и то же?
Проверка лицензии происходит при нажатии кнопки ОК (После того как мы ввели серийник), а проверка лицензии происходит при запуске проги (Нам даже не придётся вводить серийник) если хотите могу предоставить два варианта патча, с прапатченной проверкой лицензии, и прапатченой проверкой сериника(сможем вести любой серийник)!

В первой строке надо читать так
"Проверка серийника происходит"
ManHunter (23.02.2014 в 21:13):
"Проверка лицензии" и "проверка серийника" это не одно и то же?
DICI BF (23.02.2014 в 21:07):
ManHunter, я наоборот люблю .NET, поступил я проще, пропатчил функцию проверки лицензии и всё, у вас написано под скрином № 4 "Функция проверки лицензии" это не так, эта функция проверки серийника на валидность.
Olala (20.02.2014 в 21:54):
Так это что же получается, этот код поди еще скомпилировать можно назад? Уж больно исходник красивый.
Doxtup (19.02.2014 в 17:33):
Хоть файл и создается, это не отменяет переустановку системы, сдохший винчестер и прочее.
AyTkACT (19.02.2014 в 17:28):
ManHunter, аналогично. Буквально заставлял себя читать статью после сочитания букв ".NET".
Vitamin (19.02.2014 в 15:36):
При успешной регистрации создается файл license.txt с текстом "797D3FE0-3D75-45E8-A9E2-A9486FB5F6EB" (смотри скриншот 'Функция обработки нажатия на кнопку'). Именно этот файл прога ищет при запуске при проверке лицензии: DIF.License::CheckLicense(), так что каждый год новый серийник вводить не надо.
ManHunter (19.02.2014 в 14:21):
AyTkACT, не люблю я .NET :(
AyTkACT (19.02.2014 в 14:19):
.NET Reflector показал.  Давай дальше корячить .NET Framework. Публика жаждет инструкций по патчингу "мышко-клико-кода".
Anonymous (19.02.2014 в 03:17):
То есть, каждый год валидные серийник будут разными. Отсюда 2 варианта: либо программа при каждом запуске проверяет серийник на валидность, и каждый год легальные пользователи вынуждены топать к автору за новым серийником, либо после успешной проверки где-то взводится флажок "мы зарегистрированы". В первом случае, автора такой защиты нужно пожизненно отстранить от клавиатуры, а во втором - можно просто найти этот флажок и избежать даже самого нахождения серийника. На третьем скриншоте внизу, судя по всему, как раз и идет запись куда-то информации об успешном прохождении регистрации.
ManHunter (18.02.2014 в 20:21):
Это дотнет, тут все не так, как на самом деле :)
brute (18.02.2014 в 20:20):
хочется использовать "стандартные" инструменты ida\odbg и запатчить проверку, то есть пойти обычным путем. И.. не получатся!!! От этого присутствует некоторе неудовлетворение...
Михаил (18.02.2014 в 09:41):
Ну, ты, блин... Гений!)))

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.1 сек. / MySQL: 2 (0.0074 сек.) / Память: 4.5 Mb
Наверх