Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Операционные системы > Софт
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.10.2007, 13:17   #1
execom
Редкий тунеядец
Форумчанин
 
Аватар для execom
 
Регистрация: 29.10.2006
Сообщений: 595
Лампочка Микросайзовый кодинг в делфи

Господа, предлагаю эту тему занять обсуждение темы разработки микроразмерных приложений в Delphi... Я понимаю конечно, что многим эти методики кажутся избыточными в отношении зло*бистости кода, но многим, кто хочет, не сходя с любимой платформы, писать такие приложения как: Трояны, Черви, Вирусы, Стабы джоинеров, Креки или просто не хочется отставать от любителей более компактного кода.. Методика в общем-то не является секретной.. и понять её суть просто...

Суть метода в следующем:
Пишем программу на чистом WinApi не применяя тип string и не используя паскальных функций из модулей SYSTEM, SYSINIT переносим все типы и объявляем импорт процедур и функций..
Далее есть два направления:
1)Избавляемся от RTL из модулей SYSTEM, SYSINIT компилируем модули кидаем их в каталог с программой (pas,dcu)... После этого несложного действия программа весит начиная от 3584 байт))), причём прирост размера с написанием кода незначительный и ехе-ники очень капитально пакуются пакером (например FSG) и размер ехе становится примерно от 1Кб... Содержание модулей SYSTEM, SYSINIT можете найти в интернете или взять из статьи МС-РЕМа в 8 номере журнала ][акер за 2005 -статья "Делфи всемогущий"... Но те модули имеют недостаток... - ехе еонечно получаются но завершаются они с ошибками... я предлагаю свой вариант этих модулей..

SYSTEM.PAS
Код:
unit System;
interface
procedure _HandleFinally;
type
TGUID = record
D1: LongWord;
D2: Word;
D3: Word;
D4: array [0..7] of Byte;
end;
PInitContext = ^TInitContext;
TInitContext = record
OuterContext: PInitContext; 
ExcFrame: Pointer; 
InitTable: pointer; 
InitCount: Integer; 
Module: pointer; 
DLLSaveEBP: Pointer; 
DLLSaveEBX: Pointer; 
DLLSaveESI: Pointer; 
DLLSaveEDI: Pointer; 
ExitProcessTLS: procedure; 
DLLInitState: Byte; 
end;
implementation
procedure _HandleFinally;
asm
end;
end.
SYSINIT.PAS
Код:
unit SysInit;
interface
procedure _InitExe;
procedure _halt0;  
procedure halt;  
function RandInt(rCount:integer):integer;
var
  ModuleIsLib  : Boolean; 
  TlsIndex     : Integer = -1; 
  TlsLast      : Byte; 
const
  PtrToNil     : Pointer = nil; 
implementation
procedure _InitExe;
asm
end;
function rdtsc:Integer; asm rdtsc end;
function RandInt(rCount:integer):integer;
begin
result:=rdtsc mod rCount;
end;
procedure ExitProcess(uExitCode: INTEGER); stdcall; external 'kernel32.dll' name 'ExitProcess';
procedure halt;
begin
ExitProcess(0);
end;
procedure _halt0;
begin
Halt
end;
end.
Random и Halt пришлось сделать такими))))

2)Размещаем программу в модуль (*.pas) и делаем одну глобальную процедуру в которую кидаем основную часть (процедура не должна иметь локальных переменных и параметров), после этого делаем вызов процедур апишных такого типа:
function GetCommandLine: PChar; stdcall; external kernel32 name '_GetCommandLineA@0';
Компилируем модуль в объектный файл C++ и собираем из этого файла exe с назначением точки входа на глобальную процедуру...
При этом методе упаковка невозможна, да в общем-то в ней нет необходимости, т.к. сайз получается от 532 байт...


Все инструменты и подробные мануалы с исходниками на эту тему я буду выкладывать в этом топике... Я очень надеюсь, что заинтересованные в этом вопросе будут...
execom вне форума Ответить с цитированием
Старый 06.10.2007, 13:38   #2
execom
Редкий тунеядец
Форумчанин
 
Аватар для execom
 
Регистрация: 29.10.2006
Сообщений: 595
По умолчанию

Вот исходники простейших пустых приложений написанных таким образом:
1 Метод
Код:
Program MinApp;
begin
end.
2 Метод
Код:
unit MinApp;
interface
Procedure Run;
implementation
Procedure Run;
begin
end;
end.
Так же некоторую информацию вы можете почеркнуть из моих публикаций в блоге: http://pblog.ru/?p=90 , http://pblog.ru/?p=94

Инструментарий по первому методу с исходниками и ВАТ-никами для компиляции вы найдёте тут: http://virusoff.pisem.su/WithoutRTL.rar

Последний раз редактировалось execom; 06.10.2007 в 15:21.
execom вне форума Ответить с цитированием
Старый 06.10.2007, 13:51   #3
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Цитата:
Random и Halt пришлось сделать такими))))
А что вполне нормальные, не то ... м... что было
Ждём любых материалов.
zetrix вне форума Ответить с цитированием
Старый 06.10.2007, 16:46   #4
Virtson
Владимир М.
Участник клуба
 
Аватар для Virtson
 
Регистрация: 30.10.2006
Сообщений: 1,289
По умолчанию

может примеры исходников приложений, которые что-нить делают )
Берегите друг друга!
Virtson вне форума Ответить с цитированием
Старый 06.10.2007, 17:35   #5
execom
Редкий тунеядец
Форумчанин
 
Аватар для execom
 
Регистрация: 29.10.2006
Сообщений: 595
Лампочка

Примеры в блоге и в том архиве что я дал.. Это программа предназначена для добавление в буфер обмена содержимого командной строки... это может пригодится тем кто часто использует какую-то строку (например линки ftp, или пароли), что бы не копировать просто даблклик по ярлыку на прогу... В ярлыке надо будет в качестве командной строки указать то что нужно добавить в буфер, согласитесь нет смысла писать такую прогу весом 300кб?))) а так её размер получается 1300 первым методом и 1100 вторым:
1 метод
Код:
program ClyPast;
const
  kernel32       = 'kernel32.dll';
  user32         = 'user32.dll';
  GMEM_MOVEABLE  = 2;
  GMEM_DDESHARE  = $2000;
  CF_TEXT        = 1;
  MAX_PATCH      = 260;
function OpenClipboard(hWndNewOwner: INTEGER): BOOLEAN; stdcall; external user32 name 'OpenClipboard';
function GlobalLock(hMem: INTEGER): Pointer; stdcall; external kernel32 name 'GlobalLock';
function GlobalUnlock(hMem: INTEGER): BOOLEAN; stdcall; external kernel32 name 'GlobalUnlock';
function CloseClipboard: BOOLEAN; stdcall; external user32 name 'CloseClipboard';
function GlobalAlloc(uFlags: INTEGER; dwBytes: INTEGER): INTEGER; stdcall; external kernel32 name 'GlobalAlloc';
function SetClipboardData(uFormat: INTEGER; hMem: INTEGER): INTEGER; stdcall; external user32 name 'SetClipboardData';
function GlobalFree(hMem: INTEGER): INTEGER; stdcall; external kernel32 name 'GlobalFree';
function EmptyClipboard: BOOLEAN; stdcall; external user32 name 'EmptyClipboard';
function GetCommandLine: PChar; stdcall; external kernel32 name 'GetCommandLineA';
procedure  Move( const Source; var Dest; count : Integer );
asm
       PUSH    ESI
       PUSH    EDI
       MOV     ESI,EAX
       MOV     EDI,EDX
       MOV     EAX,ECX
       CMP     EDI,ESI
       LEA     ESI,[ESI+ECX-4]
       LEA     EDI,[EDI+ECX-4]
       SAR     ECX,2
       STD
       REP     MOVSD
       MOV     ECX,EAX
       AND     ECX,03H
       ADD     ESI,4-1
       ADD     EDI,4-1
       REP     MOVSB
       CLD
       POP     EDI
       POP     ESI
end;
procedure SetClipboardText(Value: PChar; Len : INTEGER);
var
  hData: INTEGER;
  pData: pointer;
begin
  OpenClipboard(0);
  hData := GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, Len);
  pData := GlobalLock(hData);
  Move(Value^, pData^, Len);
  EmptyClipboard;
  SetClipboardData(CF_Text, hData);
  GlobalUnlock(hData);
  GlobalFree(hData);
  CloseClipboard;
end;
var
  i : INTEGER;
  P : PChar;
begin
P:=GetCommandLine;
for i:=2 to MAX_PATCH do
if P[i]='"' then break;
SetClipboardText(@P[i+2],MAX_PATCH);
end.
execom вне форума Ответить с цитированием
Старый 06.10.2007, 17:42   #6
execom
Редкий тунеядец
Форумчанин
 
Аватар для execom
 
Регистрация: 29.10.2006
Сообщений: 595
По умолчанию

Вот этот же пример но вторым способом:
Код:
unit ClyPast;
interface
procedure Run;
implementation
const
  kernel32       = 'kernel32.dll';
  user32         = 'user32.dll';
  GMEM_MOVEABLE  = 2;
  GMEM_DDESHARE  = $2000;
  CF_TEXT        = 1;
  MAX_PATCH      = 260;
function OpenClipboard(hWndNewOwner: INTEGER): BOOLEAN; stdcall; external user32 name '_OpenClipboard@4';
function GlobalLock(hMem: INTEGER): Pointer; stdcall; external kernel32 name '_GlobalLock@4';
function GlobalUnlock(hMem: INTEGER): BOOLEAN; stdcall; external kernel32 name '_GlobalUnlock@4';
function CloseClipboard: BOOLEAN; stdcall; external user32 name '_CloseClipboard@0';
function GlobalAlloc(uFlags: INTEGER; dwBytes: INTEGER): INTEGER; stdcall; external kernel32 name '_GlobalAlloc@8';
function SetClipboardData(uFormat: INTEGER; hMem: INTEGER): INTEGER; stdcall; external user32 name '_SetClipboardData@8';
function GlobalFree(hMem: INTEGER): INTEGER; stdcall; external kernel32 name '_GlobalFree@4';
function EmptyClipboard: BOOLEAN; stdcall; external user32 name '_EmptyClipboard@0';
function GetCommandLine: PChar; stdcall; external kernel32 name '_GetCommandLineA@0';
procedure  Move( const Source; var Dest; count : Integer );
asm
        PUSH    ESI
        PUSH    EDI
        MOV     ESI,EAX
        MOV     EDI,EDX
        MOV     EAX,ECX
        CMP     EDI,ESI
        LEA     ESI,[ESI+ECX-4]
        LEA     EDI,[EDI+ECX-4]
        SAR     ECX,2
        STD
        REP     MOVSD
        MOV     ECX,EAX
        AND     ECX,03H
        ADD     ESI,4-1
        ADD     EDI,4-1
        REP     MOVSB
        CLD
        POP     EDI
        POP     ESI
end;
procedure SetClipboardText(Value: PChar; Len : INTEGER);
var
  hData: INTEGER;
  pData: pointer;
begin
  OpenClipboard(0);
  hData := GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, Len);
  pData := GlobalLock(hData);
  Move(Value^, pData^, Len);
  EmptyClipboard;
  SetClipboardData(CF_Text, hData);
  GlobalUnlock(hData);
  GlobalFree(hData);
  CloseClipboard;
end;
var
  i : INTEGER;
  P : PChar;
Procedure Run;
begin
P:=GetCommandLine;
for i:=2 to MAX_PATCH do
if P[i]='"' then break;
SetClipboardText(@P[i+2],MAX_PATCH);
end;
end.
Извиняюсь, зато что много постов, просто больше 5000 символов в пост форум не пускает((
execom вне форума Ответить с цитированием
Старый 08.10.2007, 11:56   #7
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Для фанатов делфи конечно супер, но в плане удобства - ужас, особенно импорт по именам типа _GetCommandLineA@0, я уж лучше чёта мелкое на FASM писать буду
пыщь
JTG вне форума Ответить с цитированием
Старый 08.10.2007, 12:26   #8
execom
Редкий тунеядец
Форумчанин
 
Аватар для execom
 
Регистрация: 29.10.2006
Сообщений: 595
По умолчанию

Цитата:
Для фанатов делфи конечно супер, но в плане удобства - ужас, особенно импорт по именам типа _GetCommandLineA@0, я уж лучше чёта мелкое на FASM писать буду
В общем-то и в асме можно таким же импортом пользоваться... т.б. в fasm win32 ехе получаются размером достаточно немаленькие... от 3кб)))) Про com-ки и dos-приложения я молчу...
execom вне форума Ответить с цитированием
Старый 08.10.2007, 12:59   #9
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

"Стандартно" = от 1536 байт (data, code, import)
в одну секцию =1024 байт
PE NATIVE вместо PE GUI (подправить subsystem=windows GUI в любом редакторе) = ~600 байт
ручками = ~500 байт
ручками извращенец = <500 байт
пыщь
JTG вне форума Ответить с цитированием
Старый 08.10.2007, 13:31   #10
execom
Редкий тунеядец
Форумчанин
 
Аватар для execom
 
Регистрация: 29.10.2006
Сообщений: 595
По умолчанию

а сдесь без извращений.. от 532 байт... Пишем не волшебными символами асм, а нормальный паскалем, а на перенос всего что нужно в проге и импорта занимает времени совсем не много... т.е. в общем-то пишем как в паскале токо без стринг.. а на выхлопе реальный результат...
execom вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С Делфи На Си++ MAKEDON Свободное общение 3 22.07.2008 14:39
Из с++ в Делфи Andre1723 Общие вопросы Delphi 4 02.06.2008 17:50
USB и Делфи StartMis Общие вопросы Delphi 2 01.06.2008 14:22
не создается таблица в Interbase, вот кодинг... Алёна БД в Delphi 3 19.02.2008 18:21