![]() | |
![]() |
Off-line версия журнала "Sources.RU Magazine". Выпуск "Август 2005" |
· АСМ для новичков · Языковой барьер · Простые растровые операции · BWT-кодинг · Hello World · Функции DLL · Охота за шпионом (АнтиКейлоггер) · Практика создания защиты · Создание поверхностей |
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 КБ - достаточно неплохой результат! Удачи! |
![]() | |
Журнал "Исходники.RU". Copyright (c) 2004 by Исходники.RU. Designed by Mastilior. |