开发者社区> 问答> 正文

模拟登录163邮箱

项目要求:采用HTTP模拟系统自动登录到163邮箱,取对应主题下的邮件,打开邮件获取邮件内容

模拟登录,首先就是抓包,分析通讯数据包,并构造相应的数据包

 

登录时发现163有多个邮件登录入口,最常用提就是www.163.com和mail.163.com两个入口地址,为了抓包数量简单从mail.163.com入口开始,抓包工具(网友推荐了各种抓包工具,httpwach、HttpAnalyzer,、wireshark,其实真正的高手就像达摩过江,一苇足矣,18般武艺多来眼花,我不是达摩,是懒)直接将浏览器(chrome)设置为开发工具,在network中,刷新页面,轻松看到所有通讯数据。

 

开始吧,清除浏览器缓存,开发者工具,刷新页面http://mail.163.com

 

居然用的URS的IFRME,不用管,飘过,直接看通讯。

这是一个找似有价值的通讯,因为是叫index_dl  https://dl.reg.163.com/webzj/m163_1.0.1/pub/index_dl.html?wdaId=&pkid={0}&product=mail163

已经有数据通讯了,好像没有什么功能,有一个动态变量pkid,估计就是加载页面首页从服务器上来的吧

看前面的页面请求的返回结果,根据以往经验此值要只有两个手段携来,在response的content、response的header的cookie中,往回找,在http://mail.163.com 中的html轻松发现,用正则表式取出来

继续往下没有发现有价值的请求,尽是GET请求,先老老实完成对应的get请求,反正url地址容易构造出来

依次完成getconf,http://dl.reg.163.com/getConf?callback=URSJSONP1501213566234&pkid=CvViHzl&pd=mail163&mode=1(callback后面那个15034439875719感觉就是一个时间戳),和get.do(其中RND就是一个随机数)的请求。

居然有INI?这样的请求,根据经验有可能是初始化某种环境,管他的,先构造get请求完成对应的请求。

Ps.以上所有的GET请求的目的就是构造http的cookie环境,或者获取一些以后请求的参数,都是get请求,完成即。

 

言归正传,继续往下

输入邮箱和密码看通讯

根据惯例去找post请求吧,一定是在某个地方将我的用户名和密码传到服务器,居然没有,靠,变态,老老实实地看get和post请求,从结果入手,先找到登录成功的页面(里面可是藏着我登录后的欢迎信息的,至少有我的昵称吧,找到了不过是个get请求,且有一个sid),记住了sid,sid,sid,重要的事情说三遍,好吧,找sid值的来源,找,在response中的content中没有,header吧,往前找

http://mail.163.com/entry/cgi/ntesdoor?language=-1&net=c&from=web&df=email163&race=140_52_1_gz&module=&uid=nosi@163.com&style=-1&username=nosi

这个通讯的header有一个key为Coremail的值,好家伙,居然藏在这儿,取出来放到,构造请求访问,页面返回402错误,也没有Coremail这值,好,之前一定还有什么东东要访问,目前权限不够,而且在header发现有cookie的很多值,应该是之前访问带回来的,往上看

好大的一个怪异请求:

http://reg.163.com/httpLoginVerifyNew.jsp?product=mail163&rcode=98d9cbcf2c0aea6303a5f11fc06dc4501fd21eb3885b5803513dc83866c9ba45d4389fa6f5cd0b44bb2e98ff98a4c5f2349c581abdea59800c9e17ea65f4a4d616643b1d0a64ec3c4dacee5acfca21336a997447f1c2d43eafa36fb57eb9788c889cbadd0ed0f1e58f1ca9f7a9755c68c4161483a285105b51509462/c4445591&savelogin=0&url=http%3A%2F%2Fmail.163.com%2Fentry%2Fcgi%2Fntesdoor%3Flanguage%3D-1%26net%3Dc%26from%3Dweb%26df%3Demail163%26race%3D140_52_1_gz%26module%3D%26uid%3Dnosi%40163.com%26style%3D-1&url2=http%3A%2F%2Femail.163.com%2Ferrorpage%2Ferror163.htm&username=nosi@163.com

 

httpLoginVerifyNew这样的名字,看到都振奋,登录验证,检查了请求参数rcode是什么鸟,这么长一串,有点像加密字符串,回找看是否在reponse夹带过来的,找了个遍,conent和header都没发现,那就是本地的js加密出来,好家伙,有了js加密,那就资源文件,看JS文件吧

 

 

藏在这儿,好的,调试,一步一步地找(好辛苦,还有定时器),功夫不负有心人,将监控rcode的值,只有rcode有值时才是我们关注的事件,之前的事件rcode都是undefined,所以不用关注,左边的天书不用关注。

总算抓到狐狸的尾吧     fEnData("200\n10001\n8365DB022E04083AEBA0A1A828A216858A93B2C469462D7B497CDB4DCC636161C773B28C2D757978347500D04AA2CA8AEC9C477FFF085BF8247E780AA7D20F35992A289BA86F2C4998AB83C4C6744FF9A0F2D3020AA49E3397C95B2AF32A84C6EC1AB0B52BFBBA380C7B3371DCA46BA9FD44F14D5CC4BEBCGGE0F3914D63731D"); 现在找fEnData的执行什么的? http://mimg.127.net/index/lib/scripts/base_v6_0_6.min.js这儿找到这个了   使用这个还得有个依赖库   这个函数的返回值直接赋给了rcode。 看懂以上代码了,就测试下,构造WEB项止,编测试代码   ,那么就得找fendata的参数了           

到此基本眉目清楚了,将JS库到一个WEB项目中,写一个测试HTML,直接在js中执行alert(“result=>”+ fEnData("200\n10001\n8365DB022E04083AEBA0A1A828A216858A93B2C469462D7B497CDB4DCC636161C773B28C2D757978347500D04AA2CA8AEC9C477FFF085BF8247E780AA7D20F35992A289BA86F2C4998AB83C4C6744FF9A0F2D3020AA49E3397C95B2AF32A84C6EC1AB0B52BFBBA380C7B3371DCA46BA9FD44F14D5CC4BEBCFDE0F3914D63731D"));

亲,大大一个字符串出来了,

 

数一数长度,正好和rcode的长度一样  

开始找fendata的那参数,也就是JS代码中常量g,又从哪儿来,继续在JS搜索,未果,那就去找之前的response,这样一个请求

http://reg.163.com/services/httpLoginExchgKeyNew?rnd=bm9zaUAxNjMuY29t&jsonp=fEnData不正是刚好返回的字符串,太亲切了

 

问题又来了,这儿可是有个rnd的请,随机数可不长成这个模式的,就是穿着随机数的外衣的家伙,往前

发现这样一个通讯

 

https://dl.reg.163.com/gt?un=nosi%40163.com&pkid=CvViHzl&pd=mail163&topURL=http%3A%2F%2Fmail.163.com%2F&nocache=1501213601737,这个通讯有点意思,un:username ,返回中有一个tk的值,正则取值,tk:token,哈哈,这个tk的值不正是那个穿着随机数外衣的狼哇,抓住你了吧,看你哪里跑。

好了,到此之前的问题都解决了,我们梳理一下

(1)  构造环境,访问http://mail.163.com找到了PKID

(2)  构造访问https://dl.reg.163.com/gt取到TK

(3)  通过tk取到JS的执行fendata()js参数

(4)  构造WEB项目通过JS执行fendata执行取到rcode

(5)  通过rode完成模拟登录请求登录httpLoginVerifyNew.jsp

 

这儿有个问题,如果是个WEB项目,当然可以轻松访问js库,如果非web项目,提供两种解决方案:

1 用你熟悉的语言c#\python\php\java自己去实现两个js库的转化,我简单地看了一下就是RSA加密处理,自己写吧,或去找对应的库,在编写时要查看清楚所使用的MD5的位数(16位 32位 64位),编码格式,公私钥的内容,好像我有C#和JAVA版的的RSA加密库,N久的项目不想去翻了。

2 用WEB组件中的js引挚去实现,在windows环境下可以用webbrower控件中的IE,也可用chrome中的V8去实现;

 

本人原来有个项目做使用的使用了.NET中的JavascriptContext 类,做了一个WEB API接口,4参数(这前的JS库以及本次调用的JS代码文件),调用方式:

post url: http://localost/doscript.apsx

post data: {

“key”:”098dbs=”,

libs:[{url: mimg.127.net/index/lib/scripts/base_v6_0_6.min.js},

{url: http://mimg.127.net/index/lib/scripts/algorithm.js}

],

user_js_block,

user_js_parameter}

key:接口授权key

libs:使用的js库

user_js_block用户定值为:

functionKS_RSAEncrypt(vkey, vpassword) {

    var h = new Array();

    h = vkey.split("\n");

    var f = h[1];//10001

    var b = h[2];

    var c = MD5(vpassword); // MD5("12343545"); 

    var e = new RSAKey();

    e.setPublic(b, f);

    var d = e.encrypt(c);

    return d;

}

user_js_parameter

{

vkey:” 200\n10001\n8365DB022E04083AEBA0A00828A216858A93B2C469462D7B497CDB4DCC636161C773B28C2D757978347500D04AA2CA8AEC9C477FFF085BF8247E780AA7D20F35992A289BA86F2C4998AB83C4C6744FF9A0F2D3020AA49E3397C95B2AF32A84C6EC1AB0B52BFBBA380C7B3371DCA46BA9FD44F14D5CC4BEBCFDE0F3914D63731D”,

vpassword:””

}

返回值

[{

result:1, //返回状态

data:””//返回值,支付json对象,根据用户自定义结果,这儿data的值就是rcoce

}]

开始写程序,用以前的库HttpUtil,有get post请求,支持cookie并可读取,支持ssl

在调试状态走到第3步时,将字符串复制出来到WEB项目中进行加密,加密后取出作为http请求的rcode参数.继继访问。

 

有了sid,急不可待地去访问邮箱登录成功首页

http://hzwebmail.mail.163.com/js6/main.jsp?sid=fBBBujXgLUvtpWloaHggMQWCEbRGLxws&df=idc2email163

看是否成功,在response.content中,找一找,“收件箱”、“发件箱”,本人邮箱的昵称“刘举平”,(立不改性坐不改名,真实有效)都返回了成功的找到的信息,喜极而泣,登录成功了。

 

做模拟登录,重点是分析请求,并找到关键的登录信息,模拟出GET和POST请求的参数,并做好监控COOKIE的事。

 

 

回头再说读邮件详细内容以及126邮箱模拟登录他们可是一个家族的。

展开
收起
游客bnlxddh3fwntw 2020-04-25 14:23:37 2298 0
1 条回答
写回答
取消 提交回答
  • 代码改变世界,我们改变代码

    感谢分享,现在好多都做了返爬功能。无头请求等等。

    2020-04-30 11:23:07
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载