一、开发环境及工具准备
1、IE浏览器(其它浏览器均可,个人比较喜欢IE浏览器的开发人员工具)
2、程序开发工具(编程语言不限)
二、了解HTTP协议
HTTP协议有很多个请求方法,这里主要了解GET请求与POST请求即可
不懂HTTP协议的同学可以看看这篇博客:https://blog.csdn.net/weixin_38087538/article/details/82838762
简而言之:
GET请求一般用来获取网页不同资源页面等等。
POST请求一般用来提交数据,如账号登录信息、提交选课信息等等。
三、抢课程序原理
了解完HTTP协议内容之后就需要进行抓包,因为我们用程序进行抢课的本质就是用自己的程序模拟浏览器与服务器进行通讯。浏览器其实算一个代码解释器,浏览器一般通过GET请求向服务器请求资源,服务器返回网页源代码,然后浏览器对其进行解释,从而渲染出各种界面。对网页进行操作的同时,浏览器会执行网页前端代码,将各种操作变成一个一个的数据包发送到服务器,然后服务器会进行处理。
而我们要做的就是通过抓包分析出在我们对网页进行某个操作时,浏览器向服务器到底发出了什么数据包,这样我们才能用自己的程序将这个数据包向服务器发出,从而模拟抢课操作。
四、网页抓包
首先我们打开一个网页,按下F12,可以看到弹出了开发人员工具
然后我们点击开发人员工具上面的“清除缓存”、“清除cookie”,“清除浏览项”,接着输入一个错误的学号、密码、验证码点击登录。
可以看到我们向login_home.aspx发送了一个POST请求,也就是说我们的账号密码验证码等数据全部被发送到了这个网页,我们进行模拟登录请求就需要往这个网页发送数据包。
接着查看数据包内容
附加协议头可以视情况选择性添加,发送的数据包中必须携带cookie。
如果不懂cookie的同学可以到百度查询。
接着是POST请求发送的参数也就是“请求正文”,在模拟发包的时候我们必须搞懂每一个参数的来源和含义,弄懂参数的来源和含义有很多种方法,比如在右上角搜索参数名、多次尝试发送不同数据进行对比等操作。
而“响应正文”就是POST操作之后服务器返回的数据。
前端代码一般会对账号密码等数据进行加密操作,防止网页访问被恶意拦截导致安全问题,所以我们在发送账号和密码的时候也要先进行加密操作再发送到服务器。
我们搜索代表密码或者账号的变量名即可发现加密代码,分析加密代码的原理,我们就可以实现加密。
可以看到下面这段代码
function chkpwd(obj)
{
if(obj.value!='')
{
var s=md5(document.all.txt_asmcdefsddsd.value+md5(obj.value).substring(0,30).toUpperCase()+'113 42').substring(0,30).toUpperCase();
document.all.dsdsdsdsdxcxdfgfg.value=s;
}
else
{
document.all.dsdsdsdsdxcxdfgfg.value=obj.value;
}
}
function chkyzm(obj)
{
if(obj.value!='')
{
var s=md5(md5(obj.value.toUpperCase()).substring(0,30).toUpperCase()+'11342').substring(0,30).toUpperCase();
document.all.fgfggfdgtyuuyyuuckjg.value=s;
}
else
{
document.all.fgfggfdgtyuuyyuuckjg.value=obj.value.toUpperCase();
}
}
可以通过百度查询内部函数的名字可以知道函数的功能,如md5、substring、toUpperCase等函数的功能,其中MD5是一种很常用的加密方式,不可逆且一一映射的特点让它使用的非常普遍。或者右上角查询函数名即可查出在哪定义的。所以我们可以看到chkpwd将账号和密码混合加密,而chkyzm是将验证码加密。如果实在不能分析出函数的作用我们也可以使用浏览器的调试工具,通过下断点观察变量内容可以猜出函数作用。
POST数据包原文,每个变量之间用&隔开
__VIEWSTATE=%2FwEPDwUKMTAzNTIzMjg1NWRkCiKyz%2BDh1fIIC%2BEs1uq878poKaZtnnb0TRWb1oPaCbU%3D
&__VIEWSTATEGENERATOR=BA28A9C8
&__EVENTVALIDATION=%2FwEdAAJoEstBiTF7Y%2FUadsShywEbZ5IuKWa4Qm28BhxLxh2oFH3yjuiK8Sutd8Tp%2BER%2Fvqy6uFkquhcxd88rY7h49y7o
&pcInfo=Mozilla%2F5.0+%28Windows+NT+10.0%3B+Win64%3B+x64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F77.0.3865.120+Safari%2F537.36undefined5.0+%28Windows+NT+10.0%3B+Win64%3B+x64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F77.0.3865.120+Safari%2F537.36+SN%3ANULL
&txt_mm_expression=
&txt_mm_length=
&txt_mm_userzh=
&typeName=%D1%A7%C9%FA&dsdsdsdsdxcxdfgfg=51F692FC6E8DE4F24B7A9821995577
&fgfggfdgtyuuyyuuckjg=1F17F7BFAB49A5865B81E1E151714D
&Sel_Type=STU
&txt_asmcdefsddsd=000000000000
&txt_pewerwedsdfsdff=
&txt_psasas=%C7%EB%CA%E4%C8%EB%C3%DC%C2%EB
&txt_sdertfgsadscxcadsads=
五、代码编写
其他网页操作同理,这里就不贴出我的代码了。
抢课与爬虫类似,感兴趣的同学可以自己去研究,可以选择去B站观看爬虫教程等。。。
C++实现:https://blog.csdn.net/MASILEJFOAISEGJIAE/article/details/60575892
在实践的过程中我也遇到了很多问题
比如,因为抢课人数过多而导致服务器可能会响应各种错误,需要我们考虑到所有可能产生的问题,并且进行相应的处理,如果考虑不周到就可能错失抢课时机等等,需要很多经验才能写出能用可靠的软件。
本博客仅供技术交流,对于由此产生的其它问题本人概不负责。
由于本人技术有限,不足之处欢迎大家多多指正。