|
|
| Посл.отвђт | Сообщен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 |