slackhead Код (Text): .386 .model flat,stdcall option casemap: none include windows.inc include kernel32.inc includelib kernel32.lib include ws2_32.inc includelib ws2_32.lib include macros.asm .code szCmd db 'cmd.exe',0 start proc local wsa:WSADATA local sa:sockaddr_in local sattr:SECURITY_ATTRIBUTES local startup:STARTUPINFO local pi:PROCESS_INFORMATION local overlapped:OVERLAPPED local hSock:DWORD local StdInRead:DWORD local StdInWrite:DWORD local StdOutRead:DWORD local StdOutWrite:DWORD local buf[10]:BYTE push edi lea edi, buf xor eax, eax mov ecx, 10 + 4*5 + sizeof OVERLAPPED + sizeof PROCESS_INFORMATION + sizeof STARTUPINFO + sizeof SECURITY_ATTRIBUTES + sizeof sockaddr_in mov edx, ecx and ecx, -4 sub edx, ecx rep stosd mov ecx, edx rep stosb pop edi invoke WSAStartup,202h, addr wsa mov sa.sin_family,AF_INET invoke htons,999 mov sa.sin_port,ax invoke htonl,7f000001h mov sa.sin_addr,eax xor eax, eax invoke WSASocket,AF_INET,SOCK_STREAM,eax,eax,eax,eax ;invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP mov esi,eax invoke bind,esi,addr sa,sizeof sockaddr_in invoke listen,esi,1 mov eax,sizeof sa lea edi,hSock mov [edi],eax invoke accept,esi,addr sa,addr hSock mov hSock,eax ;invoke CreatePipe,addr StdInRead,addr StdOutWrite,0,0 ;invoke CreatePipe,addr mov ecx, hSock xor eax, eax lea edx, startup assume edx: ptr STARTUPINFO mov [edx].cb,sizeof startup mov [edx].wShowWindow,ax mov [edx].dwFlags,STARTF_USESTDHANDLES+STARTF_USESHOWWINDOW mov [edx].hStdInput,ecx mov [edx].hStdOutput,ecx mov [edx].hStdError,ecx assume edx: nothing lea ecx, sattr assume ecx: ptr SECURITY_ATTRIBUTES mov [ecx].nLength,sizeof SECURITY_ATTRIBUTES mov [ecx].lpSecurityDescriptor,eax mov [ecx].bInheritHandle,TRUE assume ecx: nothing invoke CreateProcess,0,offset szCmd,ecx,ecx,TRUE,NORMAL_PRIORITY_CLASS,0,0,edx,addr pi invoke CloseHandle, pi.hProcess invoke CloseHandle, pi.hThread invoke closesocket,hSock invoke closesocket,esi invoke WSACleanup ret start endp end start ключи ликера: /SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0 /MERGE:.rdata=.text /STUB:d:\projects\dan\stub.exe /ALIGN:16 /IGNORE:4108 stub: 4D5A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 итого 1072 байта.
koderr Такой стаб под досом не запустится. Тут есть пример корректного стаба тоже в 64 байт: Минимальная stub-программа
Quantum Сейчас во многих упаковщиках в этот stub чего только не насуют... Там он тем более нерабочий.
koderr nice точно, что то никто не подумал о том чтобы разместить данные в стеке и тем самым схалтурить на секции неинициализированных данных.. Quantum мало что из этого всего понял.. что заначит _text (IAT), вообще то я знаю что и IAT - import address table, но она ведь в секции .rdata? _idata - там например вообще нету такой секции.. вообщем, откуда такие глубокие познания как именно линкер работает с секциями или где об этом мона прочитать? ещё вопрос, так как сам я его не догнал.. /ALIGN - это: msdn Код (Text): 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 /?, насколько я понял то это выравнивание секций (и их размера) в файле?
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
slackhead А у мня давно они Попробуй не браузером, а качалкой скачать (о как). Либо выложу просто в base64 по привычке ))
Объявляю функцию так Код (Text): extern _imp__MessageBoxA@16:dword ... 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 не запустятся
ECk Выравнивание в 4 байта поставлено, чтобы stub занял 4 байта, смещение от начала файла 3Ch, где расположено смещение PE-заголовка, попадает на поле, содержащее значение FileAlign. Без доработки линковщик не дает делать выравнивание меньше 16 байт.
А вот твой же диалог в 738 байт. А можешь добавить меню не используя CreatePopupMenu, CreateMenu, AppendMenuA и пр. а только через DialogTemplate?
koderr Я так и писал под WinXP. Кстати твой apphider по Ctrl+Alt+H не прячется. Можешь выложить исходник? Заранее спасибо...
Mikl_ Он сам себя проверяет, чтоб не прятать. воть код: Код (Text): .386 .model flat, stdcall option casemap: none include windows.inc include mymacros.asm use user32 use kernel32 assume fs: nothing .code hDlgTemplate: db 01h, 00h, 0FFh, 0FFh, 00h, 00h, 00h, 00h, 80h, 00h, 00h, 00h, 0C2h, 08h, 0C8h, 10h, 01h, 00h, 00h, 00h, 00h, 00h, 70h, 00h, 12h, 00h, 00h, 00h, 00h, 00h, 41h, 00h, 70h, 00h, 70h, 00h, 48h, 00h, 69h, 00h, 64h, 00h, 65h, 00h, 72h, 00h, 00h, 00h db 08h, 00h, 00h, 00h, 00h, 0CCh, 54h, 00h, 61h, 00h, 68h, 00h, 6Fh, 00h, 6Dh, 00h, 61h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 01h, 10h, 00h, 50h, 00h, 00h, 00h, 00h, 70h, 00h, 12h, 00h, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 82h, 00h db 43h, 00h, 74h, 00h, 72h, 00h, 6Ch, 00h, 2Bh, 00h, 41h, 00h, 6Ch, 00h, 74h, 00h, 2Bh, 00h, 48h, 00h, 20h, 00h, 68h, 00h, 69h, 00h, 64h, 00h, 65h, 00h, 73h, 00h, 20h, 00h, 61h, 00h, 63h, 00h, 74h, 00h, 69h, 00h, 76h, 00h, 65h, 00h, 20h, 00h db 77h, 00h, 69h, 00h, 6Eh, 00h, 64h, 00h, 6Fh, 00h, 77h, 00h, 2Eh, 00h, 20h, 00h, 41h, 00h, 70h, 00h, 70h, 00h, 48h, 00h, 69h, 00h, 64h, 00h, 65h, 00h, 72h, 00h, 20h, 00h, 0A9h, 00h, 20h, 00h, 6Bh, 00h, 6Fh, 00h, 64h, 00h, 65h, 00h, 72h, 00h db 72h, 00h, 2Ch, 00h, 20h, 00h, 32h, 00h, 30h, 00h, 30h, 00h, 35h, 00h, 00h, 00h MainWndProc proc uses esi hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD mov eax, uMsg mov esi, hWnd cmp eax, WM_HOTKEY jnz next1 .if wParam == 0DEADC0DEh invoke GetForegroundWindow .if esi != eax invoke ShowWindow, eax, SW_HIDE .endif .endif jmp @end next1: cmp eax, WM_INITDIALOG jnz next2 invoke RegisterHotKey, esi, 0DEADC0DEh, MOD_ALT + MOD_CONTROL, VK_H jmp @ret next2: cmp eax, WM_CLOSE jnz @end invoke UnregisterHotKey, esi, 0DEADC0DEh invoke EndDialog, esi, 0 @end: xor eax, eax @ret: ret MainWndProc endp start: ; mov eax, dword ptr fs:[18h] ; mov eax, [eax + 30h] ; mov eax, [eax + 8h] invoke GetModuleHandle, 0 invoke DialogBoxIndirectParam, eax, hDlgTemplate, NULL, offset MainWndProc, 0 ret end start