[CRACKING] [MISC.] [DOWNLOADS] [LINKS] [CONTACTS]

Взлом и защита программного обеспечения

 

Маленькие кряки на 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

 © BioCyborG
www.biocyborg.narod.ru

Hosted by uCoz