日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

玩转12306之系统登录

發布時間:2023/12/9 windows 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 玩转12306之系统登录 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【申明:本文所涉及的技術和分析的目的都是為了學習和交流,任何人使用文中所提的技術或成果做出的違法事情與我無關,大家購買火車票還是去12306官網上去購買?!?/strong>

從今天起,我開始分析12306網站的Http請求,以及編寫一個客戶端工具,廢話不多說,這篇文章的重點是分析登錄。

常規的登錄思路:賬號+密碼,稍微有點防范意識的:賬號+密碼+驗證碼,高級點的:賬號+密碼+驗證碼,其中密碼加密。我們看看12306他是采用了哪些策略。

首先進入12306的官網,嘗試下登錄,然后抓包,這里有個技巧,最好登錄的時候用錯誤的密碼或者驗證碼進行登錄。

如上圖,發起了兩個Post請求(一般提交的動作,跟蹤post類的請求)

我們先不管第一個請求是干嘛的(肯定是用的~),看看第二個請求,第二個請求顯然提交登錄的動作,繼續抓包看看它到底提交了哪些參數。

?我們分析下參數的意義和來源:

longinRand:969這個目前不得而知,refundLogin:N? 這個寫死就行了,refundFlag:Y 這個不得而知,loginUser.user_name:用戶名,user.password:密碼,randCode:驗證碼,

NzYxNDgz:N2RlNzU1YWQ0ZTE5M2NiYg== 這個不得而知,動態參數。

這個時候我們回頭看看第一個請求,看他返回的是什么:

{"loginRand":"969","randError":"Y"}

至此,我們知道了longinRand,refundFlag是通過第一個請求得到的,soga...

那么動態參數我們怎么取得呢?

繼續觀察,https://dynamic.12306.cn/otsweb/loginAction.do?method=init 的源碼(這個是初始化登陸頁面,不要問我怎么知道的,觀察,你懂的)

發現里面有這么一段:

<script src="/otsweb/dynamicJsAction.do?jsversion=5022&method=loginJs"? type="text/javascript"></script>

這段腳本是干嘛的呢。。。果斷下載下來,研究下,發現了奧妙:

var inputObj=$('<input type="hidden" name="'+keyVlues[0]+'" value="'+encode32(bin216(Base32.encrypt(keyVlues[1],keyVlues[0])))+'" />');

這個type為hidden的文本框,它的name為value度是動態取值的,注意到這句腳本里面gc()的方法 里面有一句var key='MzUyNzc0NQ==';

這個顯然就是我們的key了,那么value值了,通過閱讀源碼知道 ,原來這個方法是檢測是否存在刷票插件,如果存在value=value+'0',否則value=value+'1';

那么它是如何檢測存在刷票插件的呢,接著看腳本

var cssArr=['selectSeatType',' ev_light',' ev_light? ','fishTimeRangePicker','updatesFound','tipScript','refreshButton','fish_clock','refreshStudentButton'

,'btnMoreOptions','btnAutoLogin','fish_button','defaultSafeModeTime','ticket-navigation-item'];

var idArr=['btnMoreOptions','refreshStudentButton','fishTimeRangePicker','helpertooltable','outerbox','updateInfo'

,'fish_clock','refreshStudentButton','btnAutoRefresh','btnAutoSubmit','btnRefreshPassenger'

,'autoLogin','bnAutoRefreshStu','orderCountCell','refreshStudentButton','enableAdvPanel','autoDelayInvoke','refreshButton','refreshTimesBar','chkAllSeat'];

var keywordArr=[{
???key:".enter_right",values:["親","搶票","助手"]
??}
??,{
???key:".cx_form",values:["點發車","刷票"]
??}
??,{
???key:"#gridbox",values:["只選","僅選","checkBox","checkbox"]
??}
??,{
???key:".enter_w",values:["助手"]
??}
??] ;

原來,這個腳本作用有2個,一個是檢測頁面是否掛載了刷票的腳本工具,一個是動態生成一個密鑰。看來12306的確被刷票工具搞得夠慘,不得不應對了,因為這個腳本是動態生成的,所以12306可以定期生成這些關鍵詞庫,來防止,這個對于一般的刷票工具可以起到一定得作用,但是昨天我看了下獵豹的刷票的源碼(僅舉一例):

<button class="normalButton" id="FriSep272013100801GMT08001" type="button" style="margin:0;width:97px;font-size:14px;vertical-align:middle;">? 刷  票</button>

獵豹也夠牛的,估計是上次12306更新了防刷腳本后,獵豹直接把自己的腳本上的控件ID都動態化了。。。。

言歸正傳,剛才我們看到了動態key的產生,實際就是去請求https://dynamic.12306.cn/otsweb/loginAction.do?method=init,然后得到<script src="/otsweb/dynamicJsAction.do?jsversion=5022&method=loginJs"? type="text/javascript"></script>,進一步得到那個js的地址,然后從腳本中提取到var key=的值,這個就是動態key,那么動態value呢,剛才說過value值是檢測刷票插件用的,咱直接無視,value為1111(因為它檢測了4次)。

繼續看這句,?value="'+encode32(bin216(Base32.encrypt(keyVlues[1],keyVlues[0])))+'",顯然動態密碼是經過加密的,傳進的值就是動態key,動態value。怎么調用這個加密方法呢,我的做法是直接提取它的腳本加密函數為放到一個文件,然后用C#調用(詳見:http://www.cnblogs.com/djhama/archive/2012/03/26/2418205.html)

提取到的密碼腳本如下:

function bin216(s){var i,l,o = "",n;s += "";b = "";for(i = 0,l = s.length;i < l;i ++ ){b = s.charCodeAt(i);n = b.toString(16);o += n.length < 2 ? "0" + n : n;}return o;};var Base32 = new function(){var delta = 0x9E3779B8;function longArrayToString(data,includeLength){var length = data.length;var n = (length - 1) << 2;if (includeLength){var m = data[length - 1];if((m < n - 3) || (m > n))return null;n = m;}for(var i = 0;i < length;i ++ ){data[i] = String.fromCharCode(data[i] & 0xff,data[i] >>> 8 & 0xff,data[i] >>> 16 & 0xff,data[i] >>> 24 & 0xff);}if (includeLength){return data.join('').substring(0, n);}else{return data.join('');}};function stringToLongArray(string, includeLength){var length = string.length;var result = [];for (var i = 0;i < length;i += 4){result[i >> 2] = string.charCodeAt(i) | string.charCodeAt(i + 1) << 8 | string.charCodeAt(i + 2) << 16 | string.charCodeAt(i + 3) << 24;}if (includeLength){result[result.length] = length;}return result;};this.encrypt = function(string, key){if (string == ""){return "";}var v = stringToLongArray(string, true);var k = stringToLongArray(key, false);if (k.length < 4){k.length = 4;}var n = v.length - 1;var z = v[n], y = v[0];var mx, e, p, q = Math.floor(6 + 52 / (n + 1)), sum = 0;while (0 < q -- ){sum = sum + delta & 0xffffffff;e = sum >>> 2 & 3;for (p = 0;p < n;p ++ ){y = v[p + 1];mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);z = v[p] = v[p] + mx & 0xffffffff;}y = v[0];mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);z = v[n] = v[n] + mx & 0xffffffff;}return longArrayToString(v, false);};};var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";function encode32(input){input = escape(input);var output = "";var chr1, chr2, chr3 = "";var enc1, enc2, enc3, enc4 = "";var i = 0;do{chr1 = input.charCodeAt(i ++ );chr2 = input.charCodeAt(i ++ );chr3 = input.charCodeAt(i ++ );enc1 = chr1 >> 2;enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);enc4 = chr3 & 63;if (isNaN(chr2)){enc3 = enc4 = 64;}else if (isNaN(chr3)){enc4 = 64;}output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4);chr1 = chr2 = chr3 = "";enc1 = enc2 = enc3 = enc4 = "";}while (i < input.length);return output;}; View Code

?

OK,至此,我們需要的參數都搞定了,我們就可以模擬登陸了,最后捋一下登陸用到Http請求(按照順序):

1.加載驗證碼,用于獲取圖片和cookie

https://dynamic.12306.cn/otsweb/passCodeNewAction.do?module=login&rand=sjrand(get)

2.加載https://dynamic.12306.cn/otsweb/loginAction.do?method=init?(get),用于獲取動態生成key的請求地址,得到的地址是https://dynamic.12306.cn/otsweb/dynamicJsAction.do?jsversion=123123&method=loginJs

3.請求https://dynamic.12306.cn/otsweb/dynamicJsAction.do?jsversion=123123&method=loginJs?(get),得到動態key,然后調用加密js得到動態value

4.請求https://dynamic.12306.cn/otsweb/loginAction.do?method=loginAysnSuggest(post),得到loginRand,refundfLag,

5.構造參數,請求https://dynamic.12306.cn/otsweb/loginAction.do?method=login(post),然后解析返回的html。

最后上一張我寫的登錄的圖:

敬請期待下一篇,玩轉12306之購票查詢。?

轉載于:https://www.cnblogs.com/coding1016/p/3342077.html

總結

以上是生活随笔為你收集整理的玩转12306之系统登录的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。