Маленькие кряки на Delphi или
KOL на службе зла.
В своих статьях я часто
упоминаю о библиотеке KOL для Delphi,
которая позволяет создавать очень
маленькие по размеру (от 14 кб)
программы для Windows, поэтому меня не
редко спрашивают о том, как же все-таки
установить и использовать эту
библиотеку. Сейчас я об этом расскажу
и приведу пример, который поможет вам
во всем разобраться.
УСТАНОВКА
Прежде всего,
необходимо скачать с сайта http://bonanzas.rinet.ru
(или http://xcl.cjb.net
) следующие файлы:
-
kol.zip - в этом архиве вы
найдете саму библиотеку Key Objects Library
-
mck.zip - Mirror Classes Kit (набор
зеркальных классов) - среда
визуального программирования с
использованием KOL.
-
sysdcuD6.zip (для каждой
версии Delphi - свой архив) - замена
системных библиотек для Delphi.
Позволяет уменьшить исполнимый
файл еще примерно на 10 кб. Качать не
обязательно.
Все перечисленные
файлы вместе взятые весят около 800 кб
:).
Теперь распаковываем
kol.zip и mck.zip в одну папку, например C:\KOL,
запускаем Delphi, открываем
соответствующий .dpk-файл (например,
для Delphi 6 нужно выбрать MirrorKOLPackageD6.dpk) и
жмем кнопку 'Install'. Все! На палитре
компонентов должна появиться группа
"KOL". Файлы замены
системных библиотек sysdcu для Delphi
лучше всего распаковать в папку C:\KOL\SYSDCU.
Если возникают какие-либо
проблемы с установкой, прочтите
инструкцию KOLmirrorReadme.rus которая находится в каталоге с KOL&MCK.
СОЗДАНИЕ НОВОГО ПРОЕКТА
1. Запустите Delphi и создйте новый проект. Обычно новый
проект автоматически создается при
запуске Delphi. Если у вас не так, то в
меню File выберете New->Application. 2.
Сохраните новый проект в отдельную
папку: File->Save All. Совет: сохраняйте
файлы с теми именами, что вам
предлагает Delphi. 3. Поместите на форму
компонент TKOLProject (на вкладке KOL
палитры компонентов) и измените свойство ProjectDest
так, как будет называться ваш проект,
например, MyProg. Т.е. здесь задается имя
вашего проекта. 4. Бросьте на форму компонент
TKOLForm и сохраните проект File->Save All. 5.
Теперь все закройте File->Close All и
откройте dpr-файл, который
автоматически создался в той же
директории, куда вы сохраняли проект.
Этот файл будет называться так, как
вы указали в свойстве ProjectDest
компонента TKOLProject, например, MyProg.dpr. 6.
В меню Project выберете Options... и на
вкладке Directories/Conditionals в графе Search path
укажите путь к каталогу, где
установлен KOL. Если вы скачали файлы
замены системных библиотек SysDcu, то
здесь же укажите путь к каталогу,
куда вы их распаковали. У меня строка
Search path выглядит так: C:\KOL;C:\KOL\sysdcu. 7.
Все! Теперь можно компилировать
проект, кидать на него компоненты с
вкладки KOL, настраивать их свойства. В общем,
все как в Delphi! Конечно есть небольшие
отличия в некоторых местах и о них вы
можете прочитать в файле KOLmirrorReadme.rus.
KOL В ДЕЙСТВИИ
А сейчас мы напишем
патч на Delphi с использованием
библиотеки KOL для программы Flash2X EXE
Packager v1.0 [940 KB-ZIP]. Эта небольшая
программка  позволяет
преобразовывать flash-ролики в exe-файлы
с проигрывателем и удобной навигацией.
Ролики, скомпилированные в exe-файл с
помощью незарегистрированной версии
не позволяют извлекать из себя swf-файлы,
работают 15 дней и при запуске имеется
задержка.
Чтобы зарегистрировать
программу, необходимо ввести имя
пользователя и регистрационный
пароль. Регистрационная информация
сохраняется в реестре (HKEY_CURRENT_USER\Software\Flash2X\EXE Packager)
и проверяется при запуске программы.
Можно поймать программу на
считывании рег. данных, установив
брейкпоинты на доступ к реестру или
тем способом, что я описывал в статье
про исследование
алгоритма защиты программы Gif2swf v2.1.
В любом случае мы должны оказаться
здесь:
00491B88 MOV DWORD PTR DS:[ESI+390],EAX
00491B8E LEA EAX,DWORD PTR SS:[EBP-4]
00491B91 MOV EDX,flash2ex.00491D48 ;ASCII "Software\Flash2X\EXE Packager\"
00491B96 CALL flash2ex.0040455C
;;;;;;;;;; вырезано около 20 строк кода
00491BEB MOV EDX,flash2ex.00491DB8 ;ASCII "RegName"
00491BF0 MOV EAX,EBX
00491BF2 CALL flash2ex.00463BF0
00491BF7 TEST AL,AL
00491BF9 JE SHORT flash2ex.00491C17
00491BFB LEA ECX,DWORD PTR SS:[EBP-10]
00491BFE MOV EDX,flash2ex.00491DB8 ;ASCII "RegName"
00491C03 MOV EAX,EBX
00491C05 CALL flash2ex.00463A6C ;считываем имя пользователя
00491C0A MOV EDX,DWORD PTR SS:[EBP-10]
00491C0D MOV EAX,flash2ex.00496638
00491C12 CALL flash2ex.00404518
00491C17 MOV EDX,flash2ex.00491DC8 ;ASCII "RegCode"
;;;;;;;;;;; вырезано около 20 строк кода
00491C64 CALL DWORD PTR DS:[ECX-4]
00491C67 MOV EAX,DWORD PTR DS:[496638]
00491C6C CALL flash2ex.0040477C ;определяем длину имени
00491C71 TEST EAX,EAX
00491C73 JLE SHORT flash2ex.00491CB2
00491C75 MOV DL,1
00491C77 MOV EAX,DWORD PTR DS:[490400]
00491C7C CALL flash2ex.00403728
00491C81 MOV EBX,EAX
00491C83 LEA EAX,DWORD PTR SS:[EBP-14]
00491C86 PUSH EAX
00491C87 MOV ECX,DWORD PTR SS:[EBP-8] ;в ЕСХ какой-то код
00491C8A MOV EDX,DWORD PTR DS:[496638] ;в EDX -имя юзера
00491C90 MOV EAX,EBX
00491C92 CALL flash2ex.00490458 ;здесь генерируется правильный код
00491C97 MOV EDX,DWORD PTR SS:[EBP-14] ;в EDX правильный код
00491C9A MOV EAX,DWORD PTR SS:[EBP-C] ;в EAX - наш (неправильный)
00491C9D CALL flash2ex.004048C0 ;здесь коды сравниваются между собой
00491CA2 JNZ SHORT flash2ex.00491CAB ;если равны, то в переменную по
00491CA4 MOV BYTE PTR DS:[496634],1 ;адресу 496634 запишем единицу и
;будем считать прогу зарегистрированной
;иначе прога не зарегистрирована (JNZ SHORT flash2ex.00491CAB)
Таким образом, чтобы
программа считала себя зарегистрированной
при любом введенном регистрационном коде,
нужно заменить прыжок 00491CA2 JNZ SHORT
flash2ex.00491CAB на 00491CA2 JNZ SHORT
flash2ex.00491CA4 Или можно по
адресу 00491C9A, где в ЕАХ помещается наш код,
заменить MOV EAX,DWORD PTR SS:[EBP-C] на MOV EAX,DWORD PTR
SS:[EBP-14], т.е. в ЕАХ поместить тоже
правильный код вместо неправильного.
Результат в обоих случаях будет одинаковый:
пропатчив всего один байт, мы заставим ее
работать без ограничений.
Обратите внимание на то, что
если в реестре нет записи RegName и RegCode, то даже
пропатченная прога будет считать себя
незарегистрированной. Поэтому при создании
патча учтем этот факт.
Итак, создайте новый KOL&MCK-проект
(см. пункт "Создание нового проекта") и
разместите на форме следующие компоненты: 2
кнопки, EditBox, CheckBox, OpenSaveDialog и 2 метки.
Запомните, мы можем использовать только те
визуальные компоненты, которые имеются на
вкладке KOL палитры компонентов. Примерное расположение
компонентов показано на
рис.1.
 Рис.1.
Примерное расположение компонентов на
форме.
Окончательно интерфейс
проекта может выглядеть примерно так:

Теперь запрограммируем
нажатие кнопок "Crack" и "Exit":
procedure TForm1.Button1Click(Sender: PObj);
var
Ch:Char;
F: File of Byte; //F-файловая переменная
File_size: longint; //File_size-размер файла
File_name: string; //File_name - имя файла
RegName :HKey; // переменная для работы с реестром
begin
if EditBox1.Text='' then ShowMessage('Input Name!') else
begin
if OpenSaveDialog1.Execute then //вызываем диалог открытия файла
begin
File_name:=ExtractFileName(OpenSaveDialog1.FileName); //получаем имя файла
AssignFile(F,File_name); //связываем файловую переменную с файлом
{$I-}Reset(F); {I+} // пытаемся открыть файл
if ioresult=0 then //если файл открылся, начинаем патчить
begin
File_Size:=filesize(File_name); // проверяем размер файла
if File_Size<>986624 then // и если он неправильный
ShowMessage('wrong file size') // сообщаем об этом
else // если всё ОК начинаем править файл
begin
if Checkbox1.Checked=true // при необходимости
then CopyFile(PChar(File_name),PChar(File_name+'.bak'), true ); // сохраняем BackUp
Seek(F,$0009109C); // находим адрес байта в файле
Ch:=Char($EC); // Ch-новое значение байта
BlockWrite(F,Ch,1); // правим байт
CloseFile(F); // закрываем файл
RegName:=RegKeyOpenWrite(HKEY_CURRENT_USER, 'software\Flash2X\EXE Packager');
RegKeySetStr(RegName, 'RegName', EditBox1.Text); //записываем в реестр имя пользователя
RegKeyClose(RegName);
Label2.Text:='Cracked ;)';
end;
end;
end;
end;
end;
procedure TForm1.Button2Click(Sender: PObj);
begin
Form.Close; //закрываем программу
end;
Вот и весь кряк (исходники здесь
;). У меня он весил около 22 кб в несжатом
виде. Теперь можно добавить графику,
фоновую музыку ну и что там еще
добавляют... Все это делается очень
просто и быстро.
Это все, что я хотел
рассказать о библиотеке Key Object Library и Mirror Classes Kit.
Возможно, вам что-то показалось не
совсем понятным. На самом деле, в одной
небольшой статье невозможно
рассказать о всех возможностях и
особенностях библиотеки KOL, поэтому
рекомендую почитать вот эту подборку
статей, посвященных
программированию на Delphi с
использованием KOL.
Информация
приведена в образовательных целях. Повторение
описанных в статье действий
запрещается.
© BioCyborG, 2005
|