всем привет понадобилась вдруг маленькая прожка, которая бы паковала данные, переданные ей параметром из командной строки и слала их пингом на заданный ип. в силу обстоятельств прога должна быть совсем небольшого размера -примерно 1.5к. порыскав по инету, нашел почти что нужный мне код, неного подправил и получил следующее: Код (Text): .586 .model flat,stdcall option casemap:none ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\masm32.inc include \masm32\include\ws2_32.inc include \masm32\include\iphlpapi.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\masm32.lib includelib \masm32\lib\ws2_32.lib includelib \masm32\lib\iphlpapi.lib ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ICMP_ECHO_REPLYTA STRUCT Address DWORD ? Status DWORD ? RoundTripTime DWORD ? DataSize WORD ? Reserved WORD ? DataPointer DWORD ? Options ICMP_OPTIONS <?> zData BYTE 250 dup (?) ICMP_ECHO_REPLYTA ENDS ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .data CRLF db 13,10,0 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .data? hIcmp HANDLE ? hLib HANDLE ? dwAddress DWORD ? nHops DWORD ? HostBuffer db 256 dup(?) OutBuffer db 256 dup(?) DataBuffer db 512 dup(?) wsadata WSADATA <?> icmpOptions ICMP_OPTIONS <?> icmpReply ICMP_ECHO_REPLYTA <?> ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .code Start: invoke WSAStartup,202h,ADDR wsadata .if eax!=0 jmp @Exit .endif invoke GetCL,1,ADDR HostBuffer .if (eax!=1) jmp @Exit .endif invoke GetCL,2,ADDR DataBuffer .if (eax!=1) jmp @Exit .endif invoke inet_addr,ADDR HostBuffer .if eax==INADDR_NONE invoke gethostbyname,ADDR HostBuffer .if eax==0 jmp @Exit .endif mov eax,[eax+12] mov eax,[eax] mov eax,[eax] .endif mov dwAddress,eax invoke IcmpCreateFile mov hIcmp,eax mov icmpOptions.Ttl,255 mov icmpOptions.Tos,0 mov icmpOptions.Flags,0 mov icmpOptions.OptionsSize,0 mov icmpOptions.OptionsData,0 invoke IcmpSendEcho,hIcmp,dwAddress,ADDR DataBuffer,SIZEOF DataBuffer,ADDR icmpOptions,ADDR icmpReply,SIZEOF ICMP_ECHO_REPLYTA+SIZEOF ICMP_OPTIONS,5000 invoke IcmpCloseHandle,hIcmp @Exit: invoke WSACleanup invoke ExitProcess,0 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> end Start откомпилирована masm32, программа весит 3кб, но все равно для моего случая это слишком много. пробовал удалять ненужный код (читать ответ пинга мне вобщем-то не надо), но все равно размер 3072 байта, в асме я совсем не силец. посмотрев хекс редактором, обнаружил в ехе множество нулей, наверное все это дело можно как-то еще свернуть! спасибо!
1.4кб Код (Text): .586 .model flat,stdcall option casemap:none ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\masm32.inc include \masm32\include\ws2_32.inc include \masm32\include\iphlpapi.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\masm32.lib includelib \masm32\lib\ws2_32.lib includelib \masm32\lib\iphlpapi.lib ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ICMP_ECHO_REPLYTA STRUCT Address DWORD ? Status DWORD ? RoundTripTime DWORD ? DataSize WORD ? Reserved WORD ? DataPointer DWORD ? Options ICMP_OPTIONS <?> zData BYTE 250 dup (?) ICMP_ECHO_REPLYTA ENDS ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .code CRLF db 13,10,0 hIcmp HANDLE ? hLib HANDLE ? dwAddress DWORD ? nHops DWORD ? Start proc LOCAL HostBuffer[256]: byte LOCAL OutBuffer[256]: byte LOCAL DataBuffer[512]: byte LOCAL wsadata: WSADATA LOCAL icmpOptions: ICMP_OPTIONS LOCAL icmpReply: ICMP_ECHO_REPLYTA invoke WSAStartup,202h,ADDR wsadata .if eax!=0 jmp @Exit .endif invoke GetCL,1,ADDR HostBuffer .if (eax!=1) jmp @Exit .endif invoke GetCL,2,ADDR DataBuffer .if (eax!=1) jmp @Exit .endif invoke inet_addr,ADDR HostBuffer .if eax==INADDR_NONE invoke gethostbyname,ADDR HostBuffer .if eax==0 jmp @Exit .endif mov eax,[eax+12] mov eax,[eax] mov eax,[eax] .endif mov dwAddress,eax invoke IcmpCreateFile mov hIcmp,eax mov icmpOptions.Ttl,255 mov icmpOptions.Tos,0 mov icmpOptions.Flags,0 mov icmpOptions.OptionsSize,0 mov icmpOptions.OptionsData,0 invoke IcmpSendEcho,hIcmp,dwAddress,ADDR DataBuffer,SIZEOF DataBuffer,ADDR icmpOptions,ADDR icmpReply,SIZEOF ICMP_ECHO_REPLYTA+SIZEOF ICMP_OPTIONS,5000 invoke IcmpCloseHandle,hIcmp @Exit: invoke WSACleanup invoke ExitProcess,0 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Start endp end Start \masm32\bin\ml /c /coff /Cp %file%.asm \masm32\bin\Link /SUBSYSTEM:WINDOWS /SECTION:.text,EWR /align:16 %file%.obj
fsg2 очень здорово упаковал, но прога в нужном месте работать отказалась, хотя на моем компе и на другом, подобном первому все было хорошо. воспользовавшсь инструкциями litrovith"а ужал прогу без упаковщика и все ништяяк)) спасибо) слава асму и людям его изучающим!
ola_la прикрепи к сообщению свой не сжатый exe-файл, наверное его можно еще уменьшить .if eax!=0 jmp @Exit .endif можно заменить на test eax,eax / jnz @Exit .if (eax!=1) jmp @Exit .endif можно заменить на dec eax / jnz @Exit /inc eax
попробовал чтото накодить в фасме - там гдето 0x100 байт импорта и 0x100 байт кода. Ну и заголовок тоже гдето 0x100 байт. 150 байт никак не получится)
GoldFinch + прилепить туда 4-х байтовый досстюб, + выравнивание == 4... и твои триста можно уменьшить. На самом деле, про 150 байт - это я с потолка взял.
я ж говорю, секция кода 256 байт, секция импорта 256 байт, и весь заголовок 256 байт уменьшить можно только перемешивая код с заголовком и заменив статический импорт на динамический с хешами
размер exe 897 GoldFinch как всегда прав -- заголовок - 196 байт (0C4h), код - 431 байт (1AFh), импорт 270 байт (10Eh) -- сорц и ехе в аттаче. Увы, под руками не было рабочего экзешника ola_la (автор к сожалению не откликнулся) написано по его тексту без осмысления как это все должно работать, поэтому не судите строго, можно еще уменьшить процедуру GetCl или затолкать ее в dll.
Под XP вроде бы работает KeSqueer, загляните пожалуйста в Сам себе Iczelion, там начиная с #121 по той же технологии переделаные уроки Iczelion'a -- будут ли они работать под Вистой?