在做此工程之前当然也是参考了网上各位前辈的分析原理,最后实际上是分析很简单,但是代码的实现让我着实犯难,毕竟作MFC还没有实际开发过什么项目,敲代码的经验,水平都不是很好,不过最后还是花了一周的时间把这个QQ空间的登陆,留言,发表心情等,都做了出来,后来想着顺带着美化下界面的,于是发现了duilib这个东西,还上论坛发帖问了呢,结果还是不会在vc6上用它,最后的结果就是无果啦,想想还是不去钻这个牛角尖了,毕竟等了我换了这台E40后以后的IDE肯定是要换的,就不去想这些头疼的事了。
说多了,下面给出抓包分析的流程,以及最后总结出的清晰思路。好了,
直入主题:
先从抓包的参数说起:
GET /login?u="+m_qquin+"&verifycode="+m_vcode+"&pt_vcode_v1=0&pt_verifysession_v1="+verifysession+"&p="+encryptionPass+"&pt_rsa=0&u1=http%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&ptredirect=0&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=3-21-1408593390732&js_ver=10090&js_type=1&login_sig=登陆login_sig&pt_uistyle=32&aid=549000912&daid=5&pt_qzone_sig=1& HTTP/1.1\r\n";
(上面这段是我修改过的,自己定义的变量加进去的。)
参数分析:
u = 要登陆的qq号
verifycode = 验证码;
pt_verifysession_v1 = verifysession这个参数在获取验证码时返回的头文件当中
p = js文件中getEncryption()这个加密算法加密过的密码,此函数共三个参数,第一个是明文密码,第二个是转换后的16进制qq号码,以"/x"开头
login_sig = 这个参数应该不是特别重要的
其余参数保持不变即可,省略有可能会提示参数不完整
再说参数:verifysession
"GET /getimage?uin=QQ号码&aid=549000912&cap_cd="+cap_cd+"&0.7347680128262537 HTTP/1.1\r\n";
其中uin是qq号码,aid不需要改变,cap_cd是在检验账号是否需要输入验证码时得到的
再说参数:cap_cd
这个参数是在提交检验账号时的返回内容中checkVC的第二个参数,这个参数是获取验证码的重要参数。
"GET /check?regmaster=&uin=1096521157&appid=549000912&js_ver=10090&js_type=1&login_sig="+login_sig+"&u1=http%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&r=0.38423943983814745 HTTP/1.1\r\n";
在这个请求当中,自己测试过,什么都不用改就可以,至于这个login_sig,可以从打开页面时的页面中找到,但是我测试随便给个值,最后依然成功登陆。
缕清思路之后,最后的步骤应该为:
1.请求验证账号是否需要输入验证码,返回checkVC中如果第一个参数为0表示不需要,为1则表示需要
2.从返回内容中提取checkVC第二个参数,cap_cd,该参数是作为获取验证码的重要项
3.向服务器请求获取验证码,返回的头文件中取得cookie值verifysession,此项是保证当前登陆和所获取验证码保持一致
4.调用js加密文件中getEncryption(),三个参数分别为:明文密码,转换后的十六进制qq号码,验证码
5.返回文件中第一个参数为0表示登陆成功,返回头文件中保存服务器返回的各项cookie留作后期使用
返回3表示账号密码错误,返回4表示验证码错误,返回7表示提交参数错误