這篇文章將為大家詳細(xì)講解有關(guān)寫爬蟲(chóng)遇到APP的請(qǐng)求有加密參數(shù)時(shí)該怎么解決,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
創(chuàng)新互聯(lián)公司憑借在網(wǎng)站建設(shè)、網(wǎng)站推廣領(lǐng)域領(lǐng)先的技術(shù)能力和多年的行業(yè)經(jīng)驗(yàn),為客戶提供超值的營(yíng)銷型網(wǎng)站建設(shè)服務(wù),我們始終認(rèn)為:好的營(yíng)銷型網(wǎng)站就是好的業(yè)務(wù)員。我們已成功為企業(yè)單位、個(gè)人等客戶提供了成都做網(wǎng)站、網(wǎng)站建設(shè)服務(wù),以良好的商業(yè)信譽(yù),完善的服務(wù)及深厚的技術(shù)力量處于同行領(lǐng)先地位。
這里我寫了一個(gè)演示用的APP給你玩,它會(huì)像我前面所說(shuō)的一樣,發(fā)出一個(gè)請(qǐng)求并帶有一個(gè)加密參數(shù)——sign,且每次請(qǐng)求時(shí)sign都會(huì)變化。
安裝之后打開(kāi)它,并準(zhǔn)備好你的抓包工具,然后點(diǎn)擊“點(diǎn)擊發(fā)送請(qǐng)求”按鈕。
不出意外的話會(huì)出現(xiàn)一個(gè)“sign校驗(yàn)通過(guò)”的提示,然后我們看看抓到的包吧。
從抓包工具中我們可以很明顯地看出來(lái),會(huì)變動(dòng)的參數(shù)有兩個(gè),一個(gè)是ts,一個(gè)是sign。(為了看到變化建議多發(fā)兩個(gè)請(qǐng)求對(duì)比)
先分析一下參數(shù)的含義吧,ts從名字上可以看出來(lái),應(yīng)該是個(gè)時(shí)間戳,實(shí)際將ts的值格式化一下也可以確定這就是個(gè)請(qǐng)求時(shí)的時(shí)間戳;然后是sign,一眼看上去大概32位左右,而外觀長(zhǎng)這樣的一般是hash,猜測(cè)一下最有可能性的是md5之類的,但不知道實(shí)際是如何生成的,只能逆向看看了。
該正式開(kāi)始破解這個(gè)加密參數(shù)了,由于Android APP是靜態(tài)編譯的,不像JS,直接可以看到源碼,所以…我們需要對(duì)APP進(jìn)行反編譯,這里我使用的工具名為Jadx,前面的《寫APP爬蟲(chóng)會(huì)需要用到哪些工具呢?》和《當(dāng)你寫爬蟲(chóng)抓不到APP請(qǐng)求包的時(shí)候該怎么辦?【高級(jí)篇-混淆導(dǎo)致通用Hook工具失效】》文章中也有提到,這里就不再贅述了。
反編譯之后可以看到這么一堆亂七八糟的的東西,那么我們要怎么找到生成sign參數(shù)的地方呢?
看到那個(gè)像魔法棒一樣的按鈕了嗎?點(diǎn)一下它。
然后它會(huì)彈出一個(gè)“搜索文本”的窗口,接著我們有兩種方式快速定位到生成的位置:
搜索URL的路徑部分
路徑部分指的是/learning/hash_sign這一段,當(dāng)然有些APP為了復(fù)用可能會(huì)將路徑拆分成多段的,如果直接搜索完整路徑搜索不到的話可以嘗試以反斜杠為分隔符,將路徑拆分成多個(gè)來(lái)搜(記得從右往左搜,別問(wèn)為什么),這里的話我們直接搜索hash_sign即可,因?yàn)檫@個(gè)名字很獨(dú)特,一般應(yīng)該不會(huì)出現(xiàn)有其他不相關(guān)的東西也叫這個(gè)名字的情況。
一搜就能定位到請(qǐng)求的位置了~
搜索你要找的參數(shù)
比如這里我們需要找的是sign這個(gè)參數(shù),可以直接搜索"sign"(注意帶上雙引號(hào)),但如果結(jié)果很多,而且還都很像生成/設(shè)置sign的地方的話,可以搜一些別的比較獨(dú)特的參數(shù),比如這里出現(xiàn)的model、brand之類的在代碼中一般不會(huì)經(jīng)常出現(xiàn)的詞。
由于這個(gè)DEMO APP比較簡(jiǎn)單,所以直接搜索"sign"就能定位到設(shè)置值的位置了~
定位到了代碼位置之后我們就可以開(kāi)始看代碼了,從搜到的結(jié)果中我們可以看到生成sign、設(shè)置sign、設(shè)置路徑的代碼都在這個(gè)l方法下,然后我們來(lái)從設(shè)置sign的位置開(kāi)始從下往上分析,這樣代碼的邏輯會(huì)更容易看懂一些。
這里我將代碼中的關(guān)鍵點(diǎn)都做了標(biāo)記,你可以按著旁邊標(biāo)注的序號(hào)跟著我一起來(lái)看這個(gè)代碼。
首先這個(gè)aVar4.a有兩個(gè)地方出現(xiàn)了,但是傳入的第二個(gè)參數(shù)都是stringBuilder2,而下面那里是直接設(shè)置了一個(gè)空值進(jìn)去,顯然不是我們想要找的,所以我們可以忽略掉下面的那一行帶有sign關(guān)鍵詞的代碼,直接看標(biāo)注了1的那一行。
選中stringBuilder2這個(gè)變量,可以看到它的值是從上面那個(gè)stringBuilder3.toString()得到的,接著看看stringBuilder3的生成,for循環(huán)這里做了什么操作看不懂,但是可以看到上面有個(gè)很顯眼的字符串"MD5"。那么我們可以大膽地猜測(cè)一下,這個(gè)stringBuilder3實(shí)際上就是做了個(gè)MD5操作而已,與我們最開(kāi)始抓包時(shí)的猜測(cè)相同,直接往上看看Hash前的字符串長(zhǎng)啥樣,然后測(cè)試一下吧,不行的話再回來(lái)看。
從前面MD5操作的位置可以看到digest方法里用到的參數(shù)又是一個(gè)叫做stringBuilder2的變量,繼續(xù)往上看就能看到實(shí)際上是從stringBuilder.toString()那得到的,那么這個(gè)stringBuilder又是怎么來(lái)的呢?從代碼中我們可以看出似乎是for一個(gè)TreeMap然后把每一個(gè)key和value組成key=value的格式寫入stringBuilder中,如果stringBuilder里已經(jīng)有值的話還會(huì)添加&符號(hào),那么這最終出來(lái)的東西可以聯(lián)想到的是什么?對(duì)!就是queryString那部分,只不過(guò)它的參數(shù)是被排過(guò)序的(因?yàn)門reeMap會(huì)自動(dòng)進(jìn)行排序)。
然后我們?cè)偻厦婵矗?yàn)證一下想法正不正確,可以看到最源頭的地方是個(gè)HashMap,被put進(jìn)去的都是我們抓包時(shí)看到的參數(shù)。
現(xiàn)在我們就把這個(gè)sign的生成邏輯給理清楚了,其實(shí)它就是個(gè)按照參數(shù)名排過(guò)序的queryString進(jìn)行了一次MD5操作后的產(chǎn)物,接下來(lái)我們只需要在代碼中實(shí)現(xiàn)這個(gè)生成邏輯就行了,在Python中,你可以使用它自帶的官方庫(kù)hashlib來(lái)對(duì)一個(gè)字符串做MD5操作。
提示:建議實(shí)際操作中不要這么測(cè)試,容易觸發(fā)反爬??梢韵饶米グ玫降膮?shù)生成一遍對(duì)比一下,如果一樣則說(shuō)明生成的sign沒(méi)有問(wèn)題。
關(guān)于寫爬蟲(chóng)遇到APP的請(qǐng)求有加密參數(shù)時(shí)該怎么解決就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。