Delphi всемогущий Ms-Rem Хакер, номер #080, стр. 080-112-5 function MessageBoxA(hWnd: cardinal; lpText, lpCaption: PChar; uType: Cardinal): Integer; stdcall; external 'user32.dll' name '_MessageBoxA@16'; Попробуем теперь написать HelloWorld как можно меньшего размера. Для этого создаем проект такого типа: unit HelloWorld; interface Procedure Start; implementation function MessageBoxA(hWnd: cardinal; lpText, lpCaption: PChar; uType: Cardinal): Integer; stdcall; external 'user32.dll' name '_MessageBoxA@16'; Procedure Start; begin MessageBoxA(0, 'Hello world!', nil, 0); end; end. Тип модуля UNIT нужен для того, чтобы компилятор генерировал в объектном файле символьные имена объявленных процедур. В нашем случае это будет процедура Start - точка входа в программу. Теперь компилируем проект следующей строкой: dcc32.exe -JP -$A-,B-,C-,D-,G-,H-,I-,J-,L-,M-,O+,P-,Q-,R-,T-,U-,V-,W+,X+,Y- HelloWorld.pas Новый файл HelloWorld.obj открываем в HEX-редакторе и смотрим, во что превратилась наша точка входа. У меня получилось Start$qqrv. Это имя нужно указать как точку входа при сборке исполнимого файла. И наконец, выполним сборку: link.exe /ALIGN:32 /FORCE:UNRESOLVED /SUBSYSTEM:WINDOWS /ENTRY:Start$qqrv HelloWorld.obj user32.lib /out:Hello.exe В результате мы получаем работающий HelloWorld размером в 832 байта! Я думаю, что этот размер удовлетворит любого. Попробуем теперь дизассемблировать этот файл в IDA и поискать лишний код: ; Attributes: bp-based frame ; char Text[] Text db 'Hello world!',0 public start start proc near push 0 ; uType push 0 ; lpCaption push offset Text ; lpText push 0 ; hWnd call MessageBoxA retn start endp Ни байта лишнего кода! Покажи этот пример всем, кто любит говорить о большом размере программ, написанных на дельфи, и понаблюдай за их выражением лица - это прикольно :). Самые упорные промычат: «А... Э... Все равно дерьмо!», но уже никто ничего не скажет по существу. А самые продвинутые спорщики приведут последний аргумент - на Delphi нельзя написать драйвер режима ядра для Windows NT. Ничего... сейчас и они присоединятся к проигравшим :). [пишем драйвер на Delphi] О том, как по нашей методике сделать невозможное - написать на Delphi драйвер режима ядра, даже есть статья на RSDN, и всем интересующимся я рекомендую ее прочитать. Здесь же я приведу пример простейшего драйвера и содержимое make.bat для его сборки. Файл Driver.pas: unit Driver; interface function DriverEntry(DriverObject, RegistryPath: pointer): integer; stdcall; |