題目:采集全部5頁的彩票數(shù)據(jù),計(jì)算全部中獎的總金額(包含一、二、三等獎)
地址:https://match.yuanrenxue.cn/match/6
本題比較簡單,只是容易踩坑。話不多說請看分析。
兩個(gè)參數(shù),一個(gè)m一個(gè)f,與cookie無關(guān),但是這里會遇到第一個(gè)坑,在響應(yīng)數(shù)據(jù)中。
可以發(fā)現(xiàn)只有三等獎的金額,并沒有一等獎和二等獎的金額。所以我們需要找到三者的關(guān)系。直接來到source中查看。
直接搜索value,一共17個(gè)結(jié)果,一個(gè)一個(gè)觀察。在第12個(gè)時(shí),其相關(guān)的內(nèi)容。
這里意思是總金額為三等獎的24倍,具體是不是這樣呢,我們來驗(yàn)證一下。
還真是,那么就是說總中獎金額就是總?cè)泉劷痤~的24倍。第一個(gè)坑解決。接下來開始逆向參數(shù),剛剛已經(jīng)知道了需要的參數(shù)就兩個(gè),m和q,傳書的是parmas參數(shù),所以我們直接來跟棧。
跟到請求時(shí)的棧,代碼非常簡單,如下:
找到之后直接打上斷點(diǎn),先看m的值。
這里就是入口函數(shù),可以看到當(dāng)window.o的值大于等于6的時(shí)候就會重新加載頁面,那估計(jì)這個(gè)window.o可能是會增加的,并且有可能和頁數(shù)有關(guān)。
現(xiàn)在它的值為1,訪問下一頁看看。
果然,變成2了,那也就是說我們在本地運(yùn)行的時(shí)候他不可能大于等于6,因?yàn)槲覀冏疃嗑脱h(huán)五次爬個(gè)五頁,根本不說手抖戳它這么多下。所以這里的代碼我們就可以稍微簡化一下不要r函數(shù)了,直接一步到位到z函數(shù)。
z函數(shù)其實(shí)熟悉js的話一看就知道這就是webpack的調(diào)用的方式。翻到最上方
果然,就是一個(gè)webpack,那還不簡單,模塊加載器如此的標(biāo)準(zhǔn),我都不好意思去刪刪改改了,直接全部copy。接下來就調(diào)用z函數(shù)看看會出現(xiàn)什么樣的問題了。
window沒有定義,那我們就給他定義一個(gè)window。在最開頭加上一個(gè)var window = global;
然后再執(zhí)行,就會發(fā)現(xiàn)一樣的錯(cuò)誤,這個(gè)時(shí)候大家就會發(fā)現(xiàn)了,報(bào)的是window.o = 1
這個(gè)位置的window沒有定義。那問題來了,大家ctrl+f搜索看看,這代碼里面有沒有window.o呢?答案是沒有。
所以,window.o在肯定是在代碼中,至于為什么搜不到,那當(dāng)然就是被混淆了,所以我們就來看看混淆的代碼,就在最開頭的位置,一個(gè)很明顯的AA混淆,將它還原一下,這種混淆由專門的工具還原,手動還原的話就直接去掉最后的括號然后執(zhí)行就可以了。
去掉最后的括號后可以看到這混淆的代碼就是一個(gè)匿名函數(shù),這個(gè)函數(shù)的邏輯就是給window.o進(jìn)行賦值,值為1,所以我們將這段混淆代碼替換成window.o = 1就可以了。
接下來就是下一個(gè)錯(cuò)誤了,關(guān)鍵詞ASN1,這個(gè)相當(dāng)于也是考了一下對js的熟悉程度,就看大家平時(shí)經(jīng)驗(yàn)的積累了,ASN1就是一個(gè)js的解碼器,它能夠解碼任何有效的base64的編碼或者十六進(jìn)制編碼的DER或BER結(jié)構(gòu),這個(gè)玩意兒在瀏覽器中一般都是存在的,但問題是nodejs不存在啊。所以,既然這個(gè)問題出現(xiàn)了,那肯定就是代碼中出現(xiàn)了nodejs無法解碼的存在了,那我們就來慢慢找一下這些代碼都在什么地方。一直翻一直翻。
找到了,1161行,大家和我的誤差應(yīng)該就幾行的誤差,自己找很廢時(shí)間,反正我眼睛看瞎了已經(jīng)。這很明顯又是一段混淆代碼,jsfuck的混淆,老規(guī)矩,還原一下。直接全部復(fù)制到console中執(zhí)行一下看看結(jié)果是什么。
就是一個(gè)false…那就直接替換了吧。再執(zhí)行代碼,會發(fā)現(xiàn)還是這個(gè)錯(cuò)誤。
那證明這里面可能還有,已經(jīng)找到過一次有經(jīng)驗(yàn)了,知道了是jsfuck混淆,那我們就搜一下特殊符號![
果然,又來了。直接還原替換
啥也不是,那就直接刪掉。然后再執(zhí)行,還是會報(bào)了這個(gè)錯(cuò)誤,但是這個(gè)時(shí)候代碼中已經(jīng)沒有混淆代碼了,那問題來了,什么原因?qū)е碌哪?,定位到?bào)錯(cuò)的2559行,看下能不能刪除這個(gè)邏輯?
好吧,根本刪不掉,關(guān)聯(lián)度太高。那問題來了,從這里來看的話ASN1是在本地賦值進(jìn)去的,那么就是說就算本地nodejs本身沒有的話這里應(yīng)該也賦值進(jìn)去了,為啥還會報(bào)這樣的錯(cuò)呢?那就是說window.ASN1壓根沒有去賦值,要么就是直接沒有window了。那就有點(diǎn)意思了,我們來搜索一下window。
一共是14個(gè),但是…webpack里面那個(gè)window是來搗亂的吧。前面先用了window.o要我們先賦值了,你自執(zhí)行里面又要置空?這不鬧呢嘛?直接刪掉。
完事,直接出結(jié)果。這里其實(shí)就涉及的是瀏覽器的環(huán)境和nodejs環(huán)境的不同,在瀏覽器中window是不能被重新賦值的,所以webpack中的這個(gè)置空并沒有任何意義,但是在nodejs中就不一樣了,window可以被重新賦值,因此就直接導(dǎo)致了上方我們看到的錯(cuò)誤信息了。
搞定之后我們來對比一下瀏覽器中的值和本地執(zhí)行的結(jié)果是否能夠匹配上了。將瀏覽器中傳入的參數(shù)復(fù)制下來運(yùn)行一下(刷新了下頁面重新獲取的兩個(gè)參數(shù)值)。
兩個(gè)結(jié)果完全一致,那么到這里參數(shù)m就完成了。
接下來就是q參數(shù),q參數(shù)從邏輯來看
就是其拼接出來的格式就是1-1692867522000|
這樣的,但是這里需要注意,由于我們會話并沒有保持,相當(dāng)于每一次都是一個(gè)新的請求,同時(shí)瀏覽器中window.o能夠每次執(zhí)行js代碼的時(shí)候自增,但本地可不會,所以我們就按照每次都是全新的請求來實(shí)現(xiàn)參數(shù)q,如果是瀏覽器中那樣的格式的話最終會將前面的值拼接起來,如下:
但我們本地的話就不能再拼接了,否則是會觸發(fā)這個(gè)頁面的風(fēng)控的,接下來就給大家看一下這兩種情況在本地的時(shí)候的結(jié)果,一個(gè)能夠成功獲取值,一個(gè)則觸發(fā)風(fēng)控。先來寫一個(gè)js代碼的入口函數(shù)。
function run(o) {
t = Date.parse(new Date())
res = z(t, o);
return {
'm': res,
't': t,
}
}
第一種情況,觸發(fā)風(fēng)控。
這就是按照瀏覽器模式來實(shí)現(xiàn)q值時(shí)的結(jié)果,所以直接全新請求即可,不用拼接前面的值。
最后將所有的value加起來再乘以24就獲取到正確答案了,答案為6883344
文章來源:http://www.zghlxwxcb.cn/news/detail-672769.html
完整代碼請轉(zhuǎn)https://gitee.com/shuailiuquan/spider-code/tree/master文章來源地址http://www.zghlxwxcb.cn/news/detail-672769.html
到了這里,關(guān)于Python爬蟲猿人學(xué)逆向系列——第六題的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!