說明:以下內容從我的個人博客 blog.zhouzhipeng.com 複製過來,兩邊同步發佈。
首先聲明一下,這裏並不是給蜘蛛網打廣告。自己平時也比較喜歡看電影,剛好蜘蛛網電影app上有一個週六建行5元搶票活動,由於活動很火爆,幾乎很少能搶到! 所以想借用程序手段,自動提交搶票接口,來試圖能搶到5元電影票。
雖然沒有技術含量的東西,主要是想記錄一下,方便自己日後來回憶一下,同時也是一個思路的整理。
好了,廢話不多說,下面開始hack之旅!
前言
和所有電影app一樣,在經過選電影-> 選場次-> 選桌位 之後,來到了確認提交頁面,如下:
可以看到上圖中活動優惠有很多,我想”破”的就是龍卡星期六 5元看電影
這個 (因爲活動時間已過,可以看到它顯示的是灰色,我是上午完成的抓包分析以及寫代碼,圖片現在補上的)
理想情況是,你選好要看的電影只有進來這個頁面,剛好上午10點整的時候,5元
這個活動就可以開始搶了! 現實情況是到了9:59 分快到10點差不多的時候,進來這個頁面你會發現被
告知已經”搶完了”!
現實很殘酷,考驗網速和手速以及運氣! 但是身爲一名小碼農,怎能像一般人一樣也在哪裏拼手氣呢!(?)
第一步:抓包分析
不出意外的話,它的這個訂單提交頁面應該是http(s) 請求的,既然如此,當時就是先來抓包分析下http請求咯!
因爲我的用的是mac電腦,所以用的Charles
來抓包,略過配置步驟,直接貼一下抓包的請求:
經過初步的分析和體驗(我自己選了一個其他可用的活動提交了一個真實訂單), 發現最終提交訂單的接口的是
https://film.spider.com.cn/huayins/lockSeatList.html?insBirthday=&insId=&token=455FBE5EF0A0ED9545231547BB3050C6&userId=5da71497b4160d20c806c0568e535e07&hallId=17&feePrice=2.0%257C2.0&cinemaId=31070901¤tVersion=4.9.0&channelId=sfVivo&appVersion=460&version=410&activityId=101511&showId=0170100000000000060598689&userName=xxxxxxxxxxx&partnerPrice=59.00&sign=e3277328f9fa9434efcec30e8259ad23&filetype=json&mobile=13080669828&insName=&filmId=201709909870&fpCount=&parorderId=610024803&seatId=6%253A9%257C6%253A8&key=huayins&fpId=
其中真實的userName
已被我和諧掉了。
用postman
工具把參數展開看一下:
憑藉這多年的web開發經驗(? 裝下b), 會發現破案的難點在於上圖紅框中的兩個參數token
sign
, 一般而已token
是登陸用的,而sign
則爲請求合法性的校驗值 (一般sign是多個參數值按照一定順序拼接之後再用md5加密得來. ? 對的,一般是)
簡化問題
上面的lockSeatList
鏈接中,有很多參數都是相對固定的,像什麼活動優惠5元看電影
這個activityId
很容從其他抓包得到的查詢接口中獲取,在此不一一追溯.
而關鍵參數token
通過我刷了幾次接口會發現,它在一段時間內也是不會變的,暫時不考慮其生成方式。
那麼剩下的最後一個難點問題在於我們怎麼能知道sign
的生成算法呢?!
對的,靠猜! (☺️) 開玩笑啦,當時是通過反編譯看代碼!!
第二步:反編譯apk
沒錯,我們先假設蜘蛛網電影安卓app沒有很變態的加固、混淆之類的。 (如果有的話,就直接放棄得了,太花時間了。。。)
先到蜘蛛網官網弄一個apk文件(這個很容易!) 這裏我不會貼任何下載鏈接,需要的實踐的朋友請自己去找。
拿到apk之後,不要慌張,善於利用一些大牛弄的反編譯工具,這裏給大家介紹一個 ,真的挺不錯的 javadecompilers.com (國外的網站,打開可能有點慢)
進去之後,基本上傻瓜式的操作,直接上傳apk文件,點一下Upload and Decompile
按鈕,剩下的就是等待了幾分鐘了。直接可以下載反編譯之後的源代碼文件!
得到源代碼之後,剩下的事情就是分析代碼,找出sign的生成算法了!!
第三步:分析代碼
用你熟悉的工具代開源代碼文件夾,這裏我用的是Intellij IDEA
,打開之後如下所示:
有沒有。。。。 很懵逼的感覺!!! 特麼這麼多的文件,從哪找起啊!!!
尋找入口很重要
在做任何事情都不能太盲目,我們要淡定、從容(? )。 先回憶下第一步:抓包分析
中發現的url https://film.spider.com.cn/huayins/lockSeatList.html?xxxx
是的,它就是入口!
找到發起該url請求的地方必定是我們要的,而這裏的關鍵字符串lockSeatList.html
如果不出意外的話肯定是在代碼中某個地方寫死的!
好的,我們先搜索一下lockSeatList.html
在哪裏出現:
如上圖所示,一共有三處地方,我們一個個的試一下。 先接着搜索第一處 ae
或 C4767f.ae
靜態字段出現的地方:
出現了很多處,但是經過簡單的分析判斷,它並不是我們要的, “第一處” 排除.
接着,看下”第二處”:
恩,很高端的樣子,android界出了很多類似這種retrofit的框架,把http調用弄得用註解搞一下就完成了。。 鑑於有點複雜,可以先放一放這個,後面如果”第三處”也不是我們
要的,再回頭來分析下這個方法的調用方。
是的 ,直接突擊”第三處”疑似點:
接着再搜索f7910W
出現的地方:
剛好只有一處地方出現(第二個是它自己本身,不算),注意看上圖紅框的地方,是不是有點像! 估計就是它了!!
水落石出
好的,我們進去看一看:
注意我標的紅箭頭的地方,這些並不是直接字符串,還得一個個的去搜索這些變量的字符串是個啥!
爲了節省點大家的閱讀時間,這裏就不一一上搜索的截圖了,搜索變量的方法與上面類似,直接曬一下我們最終要找的sign
字段的面貌:
不難發現,正如我們一開始猜想的,sign
就是多個參數值拼接起來再加密的! 重點是下面的stringBuffer2
StringBuffer stringBuffer2 = new StringBuffer();
stringBuffer2.append(str).append(str2).append(str3).append(str4).append(k).append(m).append(str5).append(str6).append(stringBuffer).append(str7).append(q).append(str8).append(str9).append(str10).append(str11).append(str13).append(str14).append(str15).append("huayins").append("0779257096").append(v);
好的,接下來的事情就很簡單了,按照上面append
的順序,它其實是每個url上的參數的值。 最終sign
的拼接順序爲:
showId cinemaId hallId filmId userName userId mobile urldecode(seatId) urldecode(feePrice) parorderId channelId partnerPrice activityId insName insBirthday insId fpId fpCount "huayins" "0779257096" token
模擬請求
有了以上過程後,我們只需要在原來的url參數上,對需要變更的activityId
活動編號等做以下更新,動態算出對應的sign
值接口。 我自己用
python
實現了一版,在此可能不方便直接公開貼出,需要的小夥伴可以 fork 一份:https://git.io/vNbMh