· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Сделать минимальное приложение

Посл.отвђт Сообщенiе


Дата: Янв 30, 2004 13:20:59

Помогите плиззз решить проблему:

Читал статью о минимальном приложении на АСМе там размер получившегося ехе-файла 1.5 кб ... когда сам пишу минимальное приложение (просто выход в винду), которое компелю пакетом Tasm 5.0 получившийся ехе-файл все время одного размера 4096 байт (хоть в программе только выход или еще несколько вызовов апи-функций).

Возможно ли создать приложение меньшего размера (если да то покажите на примере с компиляцией)
С уважением Guest777


Дата: Янв 30, 2004 17:20:57

Минимальный размер нормально собранного файла - 1кб, если обточить руками - примерно 600 байт.


Дата: Янв 31, 2004 20:42:35

guest777
Выложи свой екзэшник. Поглядим, что с секциями.
А вообще, Dr. Golova прав. Размер может быть до 600 байт, но для этого существуют некоторые уловки.


Дата: Фев 1, 2004 23:45:03

Привет всем... Была как-то давненько такая тема. Ветку эту уже прибили... Для получения 1Кб
надо просто обьявить одну секцию записываемую\выполняемую\импортируемую и т.д. и запихнуть туда все. Вот пример на фасме. Советую в данном случае тасмом не пользоваться - не удобно... он вроде импорты через джампы лепит и секции выравнивает по 1024 байт, поэтому получается большой размер

;+++++++++++++++++++++++++++++++++++++++++
format PE GUI 4.0
entry START
include 'include\win32a.inc'

;+++++++++++++++++++++++++++++++++++++++++
section '.idata' import data readable writeable executable

;+++++++++++++++++++++++++++++++++++++++++
library kernel, 'kernel32.dll',\
user, 'user32.dll'

import kernel,\
ExitProcess, 'ExitProcess'

import user,\
RegisterClass, 'RegisterClassA',\
CreateWindow, 'CreateWindowExA',\
GetMessage, 'GetMessageA',\
DispatchMessage, 'DispatchMessageA',\
LoadIcon, 'LoadIconA',\
LoadCursor, 'LoadCursorA',\
DefWindowProc, 'DefWindowProcA',\
PostQuitMessage, 'PostQuitMessage'

;+++++++++++++++++++++++++++++++++++++++++
WindowClass db 'small', 0
WindowStruct dd CS_HREDRAW + CS_VREDRAW
dd WindowProcedure
dd $00000000
dd $00000000
dd $00400000
dd $00000000
dd $00000000
dd COLOR_WINDOW
dd $00000000
dd WindowClass
START:
invoke LoadIcon, 0, IDI_APPLICATION
mov [WindowStruct + $14], eax
invoke LoadCursor, 0, IDC_ARROW
mov [WindowStruct + $18], eax
invoke RegisterClass, WindowStruct
invoke CreateWindow, 0,\
WindowClass,\
WindowClass,\
WS_VISIBLE + WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
0,\
0,\
$00400000,\
0
NEXT_MESSAGE:
invoke GetMessage, WindowStruct, 0, 0, 0
or eax, eax
jz EXIT
invoke DispatchMessage, WindowStruct
jmp NEXT_MESSAGE
EXIT:
invoke ExitProcess, 0

;+++++++++++++++++++++++++++++++++++++++++
proc WindowProcedure, hwnd, hmsg, wparam, lparam
enter
push esi ebx edi
cmp [hmsg], WM_DESTROY
je POST_MESSAGE
DEF_PROC:
invoke DefWindowProc, [hwnd], [hmsg], [wparam], [lparam]
jmp BACK_TO_SYSTEM
POST_MESSAGE:
invoke PostQuitMessage, 0
xor eax, eax
pop edi ebx esi
BACK_TO_SYSTEM:
return

;+++++++++++++++++++++++++++++++++++++++++


Получается 1Kb. А для меньшего размера надо удалить досовскую заглушку, сдвинув PE заголовок на место MZ заголовка, освободив тем самым дополнительное место в заголовке, ну и перенести в последнюю часть кода. Вот пример... Копирайты не мои, а загадочного Духа дзена. Корректировать коментарии меня подхарило, поэтому оставил все как бУл0... кстати, для ясности - все поучительно-вопросительно-восклицательные коментарии принадлежат Духу дзена, остальные (типа "гы-гы", "ерунда", "обойдемся" и просто содранные с хер знает какого тутора) - мои :)


Дата: Фев 1, 2004 23:48:40 · Поправил: Godness

super_small copyright (c) Дух дзена

типа вот он, наш велосипед, это если для и для 98 и 2k
итого - 552 байта :)

под 2k можно еще меньше сделать, если поставить align-ы по 1 байту, nofdirs=2, ну еще в паре мест поправить...

include 'include\win32a.inc'

macro align value { rb (value-1)-($+value-1) mod value }
macro orgalign value { org ($+value-1)/value*value }

use32

base=0x400000
filealign=0x200
sectionalign=0x1000
nofdirs=10

org base

;DOS header
db 'MZ'

USER_NAME_DLL:
db 'user32.dll',0
align 16
_PE_HEADER:
db 'PE',0,0
;-файловый заголовок------------------------------------;
dw 0x014C ;тип процессора
dw 1 ;количество секций
dd ? ;дата создания
dd 0 ;указатель на отладочную таблицу
dd 0 ;колличество символов в последней
dw _END_OP_HEADER-_BEG_OP_HEADER ;размер опционального заголовка
dw 0x010F ;какие-то флаги для загрузки

;-опциональный заголовок--------------------------------;
_BEG_OP_HEADER:
dw 0x010B ;ерунда
dw ? ;версия компилятора
dd _DATA_END-_TEXT
dd ? ;размер секции данных - не используется
dd ? ;тоже самое
dd START-base ;RVA точки входа
dd _PE_HEADER-base ;RVA PE заголовка :)
dd 0 ;RVA секции ??, аналогично предыдущему
dd base ;адресс загрузки
dd sectionalign ;выравнивание секций в памяти
dd filealign ;выравнивание секций в файле

dd 0x00000004 ;версия системы, подсистемы,
dd 0x00000000 ;под-под-подсистемы ... гы..гы
dd 0x00000004 ;короче, ерунда
dd 0x00000000 ;анннналогично

dd (_SECTION_END-base+sectionalign-1)/sectionalign*sectionalign ;размер файла в памяти согласно выравниванию секций
dd _HEADER_END-base ;размер РЕ заголовка, вместе с таблицей секций
dd 0x00000000 ;контрольная сумма
dw 0x0002 ;GUI, консоль или ешо шо
dw 0 ;устарело и не используется

dd 0x00001000 ;размер заказываемого стека
dd 0x00001000 ;размер выделенного стека
dd 0x00010000 ;максимальный размер кучи (?!?!)
dd 0x00000000 ;размер выделенной кучи-тучи-бучи-дучи (~|:/)
dd 0x00000000 ;хрен знает какие флаги
dd nofdirs ;колличество элементов в директории данных

;-директория данных-------------------------------------;
dd 0 ;RVA таблицы экспорта
dd 0 ;размер

dd IMPORTS-base ;RVA таблицы импорта
dd 0x28 ;размер

repeat nofdirs-2
dd 0 ;остальное в данном случае не используется
dd 0
end repeat
_END_OP_HEADER:

;-таблица секций----------------------------------------;
db 'flat! ;)'
;??? как его правильно заполнить ???
;чтобы файл исполнялся с любым filealign ???
dd _DATA_END-_TEXT ;размер секции в памяти
dd _TEXT-base ;RVA секции
dd _DATA_END-_TEXT ;размер в файле
dd _HEADER_END-base ;смещение в файле
dd 0 ;что это такое -
dd 0 ;я не знаю,
dw 0 ;кроме названий
dw 0
dd 0xE0000060 ;import data readable writeable executable
;-конец заголовка---------------------------------------;

; остальная часть заголовка доступна для чтения и исполнения !!!

F0:
dw $0000
db 'RegisterClassA', 0
F1:
dw $0000
db 'CreateWindowExA', 0
F2:
dw $0000
db 'GetMessageA', 0
F3:
dw $0000
db 'DispatchMessageA', 0
F4:
dw $0000
db 'PostQuitMessage', 0
F5:
dw $0000
db 'DefWindowProcA', 0

WindowClass db 'Little window', 0

WindowProcedure:
cmp dword [esp+0x08],WM_DESTROY
jne _default
push eax
call [PostQuitMessage]
_default:
jmp dword [DefWindowProcA]

START:
xor edi,edi
mov esi,base
push WindowClass
push edi
push COLOR_WINDOW
push edi
push edi
push esi
push edi
push edi
push WindowProcedure
push edi
push esp
call [RegisterClassA]
push edi ;push $00000000
push esi ;push $00400000
push edi ;push $00000000
push edi ;push $00000000
shr esi, 7
push esi ;push CW_USEDEFAULT
push esi ;push CW_USEDEFAULT
push esi ;push CW_USEDEFAULT
push esi ;push CW_USEDEFAULT
push WS_VISIBLE + WS_OVERLAPPEDWINDOW
mov eax,WindowClass
push eax ;push $00400000 + WindowClass
push eax ;push $00400000 + WindowClass
push edi ;push $00000000
call [CreateWindowExA]
mov ebp,esp
NEXT_MESSAGE:
push edi ;push $00000000
push edi ;push $00000000
push edi ;push $00000000
push ebp
call [GetMessageA] ;invoke GetMessage
xchg eax, ecx
jecxz EXIT
push ebp
call [DispatchMessageA] ;invoke DispatchMessage
jmp NEXT_MESSAGE
EXIT:
add esp,10*4
ret

align filealign
_HEADER_END:

orgalign sectionalign
_TEXT:
;весь код в заголовке - здесь только импорты

;-таблица импорта---------------------------------------;
USER_IMAGE_THUNK_DATA:
RegisterClassA dd F0-base
CreateWindowExA dd F1-base
GetMessageA dd F2-base
DispatchMessageA dd F3-base
PostQuitMessage dd F4-base
DefWindowProcA dw F5-base ; dw !!!
;dd $00000000

IMPORTS:
dd $00000000 ;RVA первой таблицы адресов (обойдемся)
dd $00000000 ;не знаю
dd $00000000 ;как оказалось - адресс загрузки kernel-а
dd USER_NAME_DLL-base ;RVA строки 'user32.dll'
dw USER_IMAGE_THUNK_DATA-base ;RVA второй таблицы ;dw !!!

_DATA_END:

;тут нада 22 нуля

org _DATA_END+22
orgalign sectionalign
_SECTION_END:


Так кто меньше ???


Дата: Фев 1, 2004 23:51:05

Интересно, витает ли еще в здешних краях загадочный Дух дзена... :)))


Дата: Мар 13, 2004 01:34:05

Видел на board.win32asmcommunity.net влезли в 300 байт , но только под 2k и XP .


Дата: Мар 13, 2004 01:43:42

153 байта... http://www.xakep.ru/post/21399/default.htm
Читайте, господа, научно популярные журналы...:)))


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.075