Sources.RU Magazine Поиск по журналу
 

TopList

Hello World

Автор: x2er0

Сегодня мы напишем программу Hello World на Delphi 6. Обыкновенную программу, которая выводит сообщение с помощью MessageBox(). Отличие в том, что её размер будет отличаться от размера "обычных" программ на Делфи.

Приступим....

Вам понадобится блокнот и компилятор dcc32.exe, поставляемый в пакете Delphi (у меня он 14-ой версии). Откройте новый проект, закройте модуль Unit1, выберите Project->View Source. В появившемся окне удалите все лишнее и сохраните результат в отдельную папку. В папке должен появиться файл следующего содержания:

program pr;
begin

end.

Чтобы скомпилировать этот файл вручную, скопируйте в эту же папку DCC32.EXE. Для автоматического компилирования создайте .BAT файл следующего содержания:

Dcc32.Exe Bin\pr.dpr
pause

Запустив этот файл, Вы соберете проект. Но для сборки программы на Делфи необходимы еще два файла (модуля). Это SysInit.pas и System.pas, которые лежат в папке Delphi6\Source\Rtl\Sys\. Мы не будем их брать оттуда, а перепишем заново. Создайте в Вашем каталоге два файла с именами SysInit.pas и System.pas. Оставьте их "пустыми", то есть, запишите следующее:

unit SysInit;
interface
implementation
end.

unit System;
interface
implementation
end.

.PAS файлы созданы, теперь создайте для них .DCU файлы. Для этого Вам понадобится следующий .BAT файл:

dcc32 -q system -m -y -z -$D-
dcc32 -q sysinit -m -y -z -$D-
pause

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

unit System;

interface
procedure _HandleFinally;

implementation

procedure _HandleFinally;
begin
end;
end.

Скомпилируйте. Файл System.dcu создан, но появилась еще одна ошибка, касающаяся TGUID. Придется сделать объявление:

unit System;

interface
procedure _HandleFinally;

type 
  TGUID = packed record
  end;

implementation

procedure _HandleFinally;
begin
end;

end.

Компиляция... Готово - появился и SysInit.dcu. Это хорошо, значит, можно компилировать и сам проект... Опять ошибка! На этот раз связанная с @InitExe. Его тоже надо объявить:

unit System;

interface
procedure _HandleFinally;
procedure _InitExe;

type 
  TGUID = packed record
  end;

implementation

procedure _HandleFinally;
begin
end;

procedure _InitExe;
begin
end;

end.

Опять сборка... Готово! Скомпилируйте проект. Снова ошибка, на этот раз виноват @halt0. Исправьте:

unit System;

interface
procedure _HandleFinally;
procedure _InitExe;
procedure _halt0;


type 
  TGUID = packed record
  end;

implementation

procedure _HandleFinally;
begin
end;

procedure _InitExe;
begin
end;

procedure _halt0;
begin
end;

end.

Сборка... Готово. Скомпилируйте пустой проект... Получился .EXE файл размером около 3,5 КБ. Попробуйте его запустить. Что такое? Программа не запускается! Чтобы узнать, в чем дело, придется немного изменить Ваши модули:

unit System;

interface
procedure _HandleFinally;
procedure _InitExe;
procedure _halt0;


type 
  TGUID = packed record
  end;

implementation

procedure _HandleFinally;
begin
 asm 
   nop
 end
end;

procedure _InitExe;
begin
 asm 
   nop
   nop
 end
end;

procedure _halt0;
begin
 asm 
   nop
   nop
   nop
 end
end;

end.

После компиляции загрузите файл в OllyDbg:


004010C4 > $55 PUSH EBP
004010C5 .8BEC MOV EBP, ESP
004010C7 .83C4 F0 ADD ESP, -10
004010CA .B8 A4104000 MOV EAX, 004010A4
004010CF .E8 30FFFFFF CALL 00401004
004010D4 .E8 2FFFFFFF CALL 00401008

Попав в 00401004, можно увидеть, что там находится _InitExe, а по адресу 00401008 - _halt0. Эти процедуры были оставлены пустыми, значит, придется либо их немного исправить, либо самостоятельно следить за выходом программы.

Вот он - Hello World!!!

program pr;
function MessageBox(hWnd: LongWord;lpText, lpCaption: PChar;uType: LongWord): Integer;stdcall;external 'user32.dll' name 'MessageBoxA';
procedure ExitProcess(uExitCode: LongWord);stdcall; external 'kernel32.dll' name 'ExitProcess';

begin
   MessageBox(0, 'Hello World', 'test', 0);
   ExitProcess(0);
end.

Hello World выводится, размер программы - 3,5 КБ. Как бы ещё её уменьшить? Урежьте файл с помощью программы PE Optimizer от Dr.Golova и запакуйте с помощью FSG. В итоге получится программа размером 1,18 КБ - достаточно неплохой результат!

Удачи!



 Design by Шишкин Алексей (Лёха)  ©2004-2008 by sources.ru