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

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

 

Музыка в кряках [Delphi&KOL]

  В этой статье речь пойдет о том, как прикрутить к кряку, написанному на Delphi, фоновую музыку в формате xm. Сразу должен оговориться: мы будем рассматривать примеры для KOL, так как писать кряки с использованием VCL да еще и музыку в них добавлять - это преступление в отношении dial-up'щиков и вообще против всего человечества ;)

  Для воспроизведения трекерной музыки прямо из ресурсов  будем использовать библиотеку MiniFMOD.  Изначально указанная библиотека рассчитана на C и C++. Но народные умельцы заставили ее работать и с Delphi :). На www.cobans.net  эту проблему решили путем создания внешней библиотеки minifmod.dll, а  Twis с www.delphifr.com предложил скомпилировать исходники на C  в .OBJ-файл, что избавило от необходимости использовать DLL.

 Сначала рассмотрим пример использования внешней DLL. Библиотека minifmod.dll  имеет довольно небольшой размер (20 кБ, сжимается RAR'ом до 11 кБ), что позволяет "запихнуть" ее в ресурсы программы и извлекать оттуда по мере надобности. Естественно, в этом случае нам придется подключать библиотеку к программам динамически.

  Напомню, как поместить файл в ресурсы программы. Пусть у нас имеется файл music.xm. В каталоге проекта создаем текстовый файл music.rc, в котором записываем следующую строку: MUZ RCDATA music.xm. Если файл music.xm находится не в каталоге проекта, то вместо  "music.xm" нужно написать полный путь к данному файлу, например, c:\MyMusic\music.xm. Теперь нужно скомпилировать  .rc-файл, используя компилятор ресурсов Borland Resource Compiler (brcc32.exe), который находится в подкаталоге BIN установочной директории Delphi. Для этого можно просто перетащить music.rc на значок brcc32.exe, после чего в каталоге проекта появится файл ресурсов music.res. Его-то мы и впихнем в наш exe'шник, поместив в главном модуле проекта после implementation строку такого вида: {$R music.res}.

  Итак, создадим файлы ресурсов с музыкой и библиотекой minifmod.dll  с помощью Borland Resource Compiler (для чего сначала подготовим mmu.rc и dl.rc, в которых укажем следующее:  

dl.rc должен содержать текст: MYDLL DLLFILE MiniFMOD.dll 

mmu.rc должен содержать текст: muz rcdata nf.xm

  Ниже привожу необходимую часть кода программы с комментариями:

unit muz;
{
здесь вырезана служебная информация, автоматически добавляющаяся KOL}
var
{Эти переменные и функции мы будем использовать во всех подпрограммах кряка}
 filename:string; // в этой переменной будет храниться путь к minifmod.dll
 hMod: Integer;
 Hbar: Thandle;
 {Описываем процедуры и функции, загружаемые из minifmod.dll}
 SongLoadFromResource: function(FileName: PChar):Integer; cdecl;
 SongPlay: procedure (hMod: Integer); cdecl;
 SongStop: procedure (hMod: Integer); cdecl;
 {далее идут автоматически вставляемые библиотекой KOL описания}
 Form1 {$IFDEF KOL_MCK} : PForm1 {$ELSE} : TForm1 {$ENDIF} ;
 {$IFDEF KOL_MCK}
 procedure NewForm1( var Result: PForm1; AParent: PControl );
 {$ENDIF}

 implementation

{$IFNDEF KOL_MCK} {$R *.DFM} {$ENDIF}
{$IFDEF KOL_MCK}
{$I muz_1.inc}
{$ENDIF}


{$R mmu.res} //помещаем наши файлы в программу
{$R dl.res}

 procedure splay; //процедура, управляющая воспроизведением музыки
 var
  pch: PChar; // в pch будет храниться путь к dll для загрузки из нее функций
 begin
  pch:=PChar(filename);     // преобразуем переменную в тип Char
  Hbar := LoadLibrary(pch); // загружаем библиотеку minifmod.dll
  if Hbar >= 32 then
   begin                    // из minifmod.dll загружаем необходимые процедуры и функции
    SongLoadFromResource:= GetProcAddress(HBar, 'SongLoadFromResource'); // функция загрузки треков из ресурсов
    SongPlay:= GetProcAddress(HBar, 'SongPlay'); // загружаем процедуру воспроизведения
    SongStop:= GetProcAddress(HBar, 'SongStop'); // загружаем процедуру остановки музыки
    hMod := SongLoadFromResource('muz');         // отправляем ресурс на воспроизведение
    SongPlay(hMod);                              // запуск воспроизведения музыки
   end;
 end;

 procedure TForm1.KOLForm1BeforeCreateWindow(Sender: PObj); // до отображения окна программы на экране
 var                                                        // сохраняем minifmod.dll из ресурсов на диск
  ResourceStream : pStream;
  buf: array[0..MAX_PATH - 1] of char;
  WinTmpDir : string;
 begin
  GetTempPath(SizeOf(Buf),@Buf);
  WinTmpDir:= IncludeTrailingPathDelimiter(copy(buf,1,lstrlen(@buf)));
   try
   ResourceStream := NewWriteFileStream(WinTmpDir + 'minifmod.dll');
   Resource2Stream(ResourceStream,hinstance,'mydll','dllfile');
   finally
   ResourceStream.Free;
   end;
  filename:=(WinTmpDir + 'minifmod.dll' );
  splay; //вызываем процедуру, управляющую воспроизведением музыки
 end;

 procedure TForm1.KOLForm1Destroy(Sender: PObj); //реакция на завершение программы
  begin
  songstop(hmod);        // останавливаем воспроизведение музыки
  freelibrary(Hbar);     // выгружаем библиотеку, иначе она не удалится
  DeleteFiles(filename); // удаляем minifmod.dll
 end;

end.

  Как видите, совсем не много кода :). Давайте оценим "общий вес" конечного файла: 14 кБ ("пустая" форма) + 20 кБ (minifmod.dll) + 63 кБ (xm-файл)+16 кБ (картинка в BMP) = 113 кБ. По-моему, у нас получился слон ;-). Попробуем обработать этого слона FSG v2.0 - специальным супер-пакером для кряков. Результат - 47 кБ - самое то! Исходники демонстрационного примера можно скачать здесь: http://biocyborg.narod.ru/rev/dxm.zip

  Теперь посмотрим, как решил проблему Twis. Он преобразовал C-исходник библиотеки MiniFMOD в объектный файл и подготовил модуль minifmod.pas, в котором описал процедуры и функции библиотеки, указал подключение .OBJ-файла, а также добавил необходимые функции, которые не были включены в .OBJ-файл.
   Таким образом, воспроизведение фоновой музыки прямо из ресурсов стало простейшей задачей:

unit muz;
//в uses нужно добавить minifmod (не забудьте положить minifmod.pas minifmod.obj в каталог с исходниками кряка)
{здесь пропущено описание переменных}

{$R mmu.res}   // подключаем файл с музыкой; mmu.rc должен содержать текст XMMOD  MUSIC  melody.xm

procedure TForm1.KOLForm1FormCreate(Sender: PObj); //при запуске программы начинаем воспроизведение
begin
 XMPlayFromRes('XMMOD', 'MUSIC');  
end;

procedure TForm1.KOLForm1Close(Sender: PObj; var Accept: Boolean); 
begin
 XMFree;       
end;

  Здесь Вы можете скачать архив с примерами и всеми необходимыми файлами (если возникли проблемы, попробуйте скачать с моего сайта).

  Размер minifmod.obj можно уменьшить на несколько килобайт (при этом уменьшится и конечный исполнимый файл), если перекомпилировать minifmod.c для конкретного музыкального файла. Об этом подробно написано в документации от Twis'a. 

  Если у Вас возникли какие-либо сложности с использованием библиотеки MiniFMOD, обращайтесь - обязательно постараемся помочь!

  P.S. Немного о midi. Музыка в таком формате по-разному звучит на компьютерах с разными звуковыми картами, поэтому ее лучше не использовать. Но этот формат имеет преимущества в размере файлов, которые очень хорошо сжимаются архиваторами и пакерами. Для проигрывания midi можно использовать модуль mmsystem или MediaPlayer. Если Вам это интересно, можете скачать пример, который я быстро набросал для демонстрации использования mmsystem. В нем нет ничего особенного, но, возможно, кому-нибудь пригодится.

  P.P.S. MiniFMOD позволяет проигрывать файлы только в  формате xm.  Если у Вас музыка в другом формате (.mod, s3m, it и др.p), ее можно конвертировать в xm с помощью редактора трекерной музыки, например MODPLUG TRACKER (для чего следует просто открыть файл и сохранить его с расширением .xm).

© BioCyborG, 2004

 © BioCyborG
www.biocyborg.narod.ru

Hosted by uCoz