//此程序编译后只能在windows2000下运行,windowsXP出于安全考虑屏蔽了某些函数功能。

//此程序实现了按照指定频率向目标IP的目标端口发送指定次数的数据包。(由于设计需要,数据包内容有一部分会随发包的次数而产生变化。)

//此程序目前有一个BUG,就是无论如何修改,数据包第6位字符总是有错。

#include "stdafx.h"

#pragma   pack(1)  
   
#define   WIN32_LEAN_AND_MEAN    
   
#include   <winsock2.h>  
#include   <ws2tcpip.h>  
   
#include   <stdio.h>  
#include   <stdlib.h>  
#include   <time.h> 

#pragma comment(lib,"ws2_32.lib")
   
#define   OICQ_MAX_PACKET   1024  
#define   OICQ_MAX_MSG   512  
#define   OICQ_MSG_LEN   450  
//#define   SRC_IP   "221.179.205.196"  
//#define   SRC_PORT   5277  
//#define   DST_PORT   4000  
   
typedef   struct   ip_hdr  
{  
  unsigned   char   ip_verlen;    
  unsigned   char   ip_tos;    
  unsigned   short  ip_totallength;    
  unsigned   short  ip_id;    
  unsigned   short  ip_offset;    
  unsigned   char   ip_ttl;    
  unsigned   char   ip_protocol;    
  unsigned   short  ip_checksum;    
  unsigned   int    ip_srcaddr;    
  unsigned   int    ip_destaddr;    
}   IP_HDR;  
   
typedef   struct   udp_hdr  
{  
  unsigned   short   src_portno;    
  unsigned   short   dst_portno;    
  unsigned   short   udp_length;    
  unsigned   short   udp_checksum;    
}   UDP_HDR;  
   
   
char   strMessage[OICQ_MSG_LEN];
char str1[266]="FLAG sip:900@221.179.205.196 SIP/2.0\r\nVia: SIP/2.0/UDP 221.179.205.196:5060;branch=z9hG4bK3b2ff65c;rport\r\nFrom: <sip:1@221.179.205.196:5060>;tag=as46a944e2\r\nTo: <sip:1@221.179.205.196:5060>\r\nContact: <sip:1@221.179.205.196>\r\nCall-ID: 78a4d0584cf428da312fee";
char str3[146]="@221.179.205.196\r\nCSeq: 1 OPTIONS\r\nMax-Forwards: 70\r\nAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY\r\nContent-Length: 0\r\n";
int str2=1;
unsigned long loopid=0;


USHORT checksum(unsigned short *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);
}

void parseIPPort(char* ipAndPort,char* ipaddr,unsigned short* port,unsigned short defaultPort) {
 char sPORT[10];
 memset(sPORT,0,10);
 int portIndex=-1;
 int ipLength=strlen(ipAndPort);
 for(int i=0;i<ipLength;i++) {
  if(*(ipAndPort+i)==':') {
   portIndex=i;
  }
  if(portIndex==-1) {
   *(ipaddr+i)=*(ipAndPort+i);
  } else {
   if(i>portIndex) {
    sPORT[i-portIndex-1]=*(ipAndPort+i);
   }
  }
 }
 if(strlen(sPORT)>0) {
  *port=atoi(sPORT);
 } else {
  *port=defaultPort;
 }
}

typedef struct ProcParamType {
 SOCKET * s;
 char* buf;
 UINT     iTotalSize;
 sockaddr_in * remote;
} ProcParam;

ProcParam procParameter;

void CALLBACK TimerProc(HWND   hWnd,UINT   nMsg,UINT   nTimerid,DWORD   dwTime)
{
 loopid++;
 int ret=sendto(*(procParameter.s),
             procParameter.buf,
       procParameter.iTotalSize,0,(SOCKADDR*)&(*(procParameter.remote)),sizeof(*(procParameter.remote)));
 if(ret==SOCKET_ERROR)
  printf("sendto()   failed:   %d\n",WSAGetLastError());
 else
  printf("Message No.%d is Sent!\r\n",loopid);
}

int main(int argc, char* argv[])
{
 WSADATA   wsd;
 SOCKET   s;
 BOOL   bOpt;
 struct   sockaddr_in   remote;
 IP_HDR   ipHdr;
 UDP_HDR   udpHdr;
 int   ret;
 DWORD   i;
 unsigned   short   iTotalSize,iUdpSize,iUdpChecksumSize,iIPVersion,iIPSize,cksum=0;
 char   buf[OICQ_MAX_PACKET],*ptr   =   NULL;
 printf("IP Hacker   -   for testing\n\n");
 if(argc!=5)   {
  printf("usage: %s src_IP_Addr:port  Dest_IP_Addr:port Frequence MaxTimes",argv[0]);
  ExitProcess(1);
 }  
 double frequence=14.0;
 unsigned long maxtimes=1;
 maxtimes=atof(argv[4]);
 frequence=atof(argv[3]);
 int interval=1000/frequence;

 char SRC_IP[20];
 memset(SRC_IP,0,20);
 unsigned short SRC_PORT;
 parseIPPort(argv[1],SRC_IP,&SRC_PORT,5227);

 char DES_IP[20];
 memset(DES_IP,0,20);
 unsigned short DST_PORT;
 parseIPPort(argv[2],DES_IP,&DST_PORT,4000);
 printf("Sending IP package from %s:%d to %s:%d\r\n",SRC_IP,SRC_PORT,DES_IP,DST_PORT);
 

 ::SetTimer(NULL,666,interval,TimerProc);
 
  while(true)
    {
  str2=str2+1;
  if (str2>maxtimes+1){  ExitProcess(1);
}
  sprintf(strMessage,"%s%ld%s",str1,str2,str3);

 
 srand((unsigned)time(NULL));
 strMessage[5]=rand();
 if(WSAStartup(MAKEWORD(2,2),&wsd)!=0) {  
  printf("WSAStartup()   failed:   %d\n",   GetLastError());
  return -1;
 }
 
 s=WSASocket(AF_INET,SOCK_RAW,IPPROTO_UDP,NULL,0,0);
 if(s==INVALID_SOCKET) {
  printf("WSASocket()   failed:   %d\n",WSAGetLastError());
  return -1;
 }
 bOpt=TRUE;
 ret=setsockopt(s,IPPROTO_IP,IP_HDRINCL,(char*)&bOpt,sizeof(bOpt));
 if(ret==SOCKET_ERROR) {
  printf("setsockopt(IP_HDRINCL)   failed:   %d\n",WSAGetLastError());
  return -1;
 }
 
 iTotalSize=sizeof(ipHdr)+sizeof(udpHdr)+OICQ_MSG_LEN;
 iIPVersion=4;
 iIPSize=sizeof(ipHdr)/sizeof(unsigned long);
 
 ipHdr.ip_verlen=(iIPVersion<<4) | iIPSize;
 ipHdr.ip_tos=0;
 ipHdr.ip_totallength=htons(iTotalSize);
 ipHdr.ip_id=0;
 ipHdr.ip_offset=0;
 ipHdr.ip_ttl=128;
 ipHdr.ip_protocol=0x11;
 ipHdr.ip_checksum=0;
 ipHdr.ip_srcaddr=inet_addr(SRC_IP);
 ipHdr.ip_destaddr=inet_addr(DES_IP);
 
 iUdpSize=sizeof(udpHdr)+OICQ_MSG_LEN;
 
 udpHdr.src_portno=htons(SRC_PORT);
 udpHdr.dst_portno=htons(DST_PORT);
 udpHdr.udp_length=htons(iUdpSize);
 udpHdr.udp_checksum=0;
 
 iUdpChecksumSize=0;
 ptr=buf;
 ZeroMemory(buf,OICQ_MAX_PACKET);
 memcpy(ptr,&ipHdr.ip_srcaddr,sizeof(ipHdr.ip_srcaddr));
 ptr+=sizeof(ipHdr.ip_srcaddr);
 iUdpChecksumSize+=sizeof(ipHdr.ip_srcaddr);
 memcpy(ptr,&ipHdr.ip_destaddr,sizeof(ipHdr.ip_destaddr));
 ptr+=sizeof(ipHdr.ip_destaddr);
 iUdpChecksumSize+=sizeof(ipHdr.ip_destaddr);
 ptr++;
 iUdpChecksumSize+=1;
 memcpy(ptr,&ipHdr.ip_protocol,sizeof(ipHdr.ip_protocol));
 ptr+=sizeof(ipHdr.ip_protocol);
 iUdpChecksumSize+=sizeof(ipHdr.ip_protocol);
 memcpy(ptr,&udpHdr.udp_length,sizeof(udpHdr.udp_length));
 ptr+=sizeof(udpHdr.udp_length);
 iUdpChecksumSize+=sizeof(udpHdr.udp_length);
 memcpy(ptr,&udpHdr,sizeof(udpHdr));
 ptr+=sizeof(udpHdr);
 iUdpChecksumSize+=sizeof(udpHdr);
 
 for(i=0;i<OICQ_MSG_LEN;i++,ptr++)
  *ptr   =   strMessage[i];
 iUdpChecksumSize+=OICQ_MSG_LEN;
    cksum=checksum((USHORT*)buf,iUdpChecksumSize);
 udpHdr.udp_checksum=cksum;
 ZeroMemory(buf,OICQ_MAX_PACKET);
 ptr=buf;
 
 memcpy(ptr,&ipHdr,sizeof(ipHdr));
 ptr+=sizeof(ipHdr);
 memcpy(ptr,&udpHdr,sizeof(udpHdr));
 ptr+=sizeof(udpHdr);
 memcpy(ptr,strMessage,OICQ_MSG_LEN);
 
 remote.sin_family=AF_INET;
 remote.sin_port=htons(DST_PORT);
 remote.sin_addr.s_addr=inet_addr(DES_IP);
 
 procParameter.s=&s;
 procParameter.buf=buf;
 procParameter.iTotalSize=iTotalSize;
 procParameter.remote=&remote;
 MSG msg;
  
  GetMessage(&msg,   NULL,   0,   0);  
  DispatchMessage(&msg);                  
    }
 

 closesocket(s);
 WSACleanup();
 return 0;
}

文章版权:杜斟的个人博客 - 个人技术分享

本文链接:http://mcat.cc/index.php/archives/587/

转载请注明文章原始出处 !

添加新评论

返回顶部