嗯,在看完了《當你寫爬蟲抓不到APP請求包的時候該怎麼辦?》系列以後,同窗們對抓APP的請求包應該已是輕車熟路了吧。在對想爬的APP抓個包以後你可能會發現,只是抓到包彷佛沒有什麼卵用啊,凡有用的接口基本都有一個或多個加密的參數,並且它還每次請求都變,而本身去請求對應的接口時,若是沒帶或者隨便輸入一串值給這種參數,還會出現不返回數據的狀況,這可怎麼辦纔好?安全
別擔憂,據我觀察,目前至少80%左右的常見APP(BAT這類大廠的除外)在安全方面作的並很差,在看完這篇文章以後,你將知道如何輕鬆地拿下它們。網絡
咱們直接開始實戰演練吧,這裏我寫了一個演示用的APP給你玩,它會像我前面所說的同樣,發出一個請求並帶有一個加密參數——sign,且每次請求時sign都會變化。工具
安裝以後打開它,並準備好你的抓包工具,而後點擊「點擊發送請求」按鈕。測試
不出意外的話會出現一個「sign校驗經過」的提示,而後咱們看看抓到的包吧。ui
從抓包工具中咱們能夠很明顯地看出來,會變更的參數有兩個,一個是ts,一個是sign。(爲了看到變化建議多發兩個請求對比)加密
先分析一下參數的含義吧,ts從名字上能夠看出來,應該是個時間戳,實際將ts的值格式化一下也能夠肯定這就是個請求時的時間戳;而後是sign,一眼看上去大概32位左右,而外觀長這樣的通常是hash,猜想一下最有可能性的是md5之類的,但不知道實際是如何生成的,只能逆向看看了。3d
該正式開始破解這個加密參數了,因爲Android APP是靜態編譯的,不像JS,直接能夠看到源碼,因此...咱們須要對APP進行反編譯,這裏我使用的工具名爲Jadx,前面的《寫APP爬蟲會須要用到哪些工具呢?》和《當你寫爬蟲抓不到APP請求包的時候該怎麼辦?【高級篇-混淆致使通用Hook工具失效】》文章中也有提到,這裏就再也不贅述了。cdn
反編譯以後能夠看到這麼一堆亂七八糟的的東西,那麼咱們要怎麼找到生成sign參數的地方呢?blog
看到那個像魔法棒同樣的按鈕了嗎?點一下它。排序
而後它會彈出一個「搜索文本」的窗口,接着咱們有兩種方式快速定位到生成的位置:
搜索URL的路徑部分
路徑部分指的是/learning/hash_sign這一段,固然有些APP爲了複用可能會將路徑拆分紅多段的,若是直接搜索完整路徑搜索不到的話能夠嘗試以反斜槓爲分隔符,將路徑拆分紅多個來搜(記得從右往左搜,別問爲何),這裏的話咱們直接搜索hash_sign便可,由於這個名字很獨特,通常應該不會出現有其餘不相關的東西也叫這個名字的狀況。
一搜就能定位到請求的位置了~
搜索你要找的參數
好比這裏咱們須要找的是sign這個參數,能夠直接搜索"sign"(注意帶上雙引號),但若是結果不少,並且還都很像生成/設置sign的地方的話,能夠搜一些別的比較獨特的參數,好比這裏出現的model、brand之類的在代碼中通常不會常常出現的詞。
因爲這個DEMO APP比較簡單,因此直接搜索"sign"就能定位到設置值的位置了~
定位到了代碼位置以後咱們就能夠開始看代碼了,從搜到的結果中咱們能夠看到生成sign、設置sign、設置路徑的代碼都在這個l方法下,而後咱們來從設置sign的位置開始從下往上分析,這樣代碼的邏輯會更容易看懂一些。
這裏我將代碼中的關鍵點都作了標記,你能夠按着旁邊標註的序號跟着我一塊兒來看這個代碼。
首先這個aVar4.a有兩個地方出現了,可是傳入的第二個參數都是stringBuilder2,而下面那裏是直接設置了一個空值進去,顯然不是咱們想要找的,因此咱們能夠忽略掉下面的那一行帶有sign關鍵詞的代碼,直接看標註了1的那一行。
選中stringBuilder2這個變量,能夠看到它的值是從上面那個stringBuilder3.toString()獲得的,接着看看stringBuilder3的生成,for循環這裏作了什麼操做看不懂,可是能夠看到上面有個很顯眼的字符串"MD5"。那麼咱們能夠大膽地猜想一下,這個stringBuilder3實際上就是作了個MD5操做而已,與咱們最開始抓包時的猜想相同,直接往上看看Hash前的字符串長啥樣,而後測試一下吧,不行的話再回來看。
從前面MD5操做的位置能夠看到digest方法裏用到的參數又是一個叫作stringBuilder2的變量,繼續往上看就能看到其實是從stringBuilder.toString()那獲得的,那麼這個stringBuilder又是怎麼來的呢?從代碼中咱們能夠看出彷佛是for一個TreeMap而後把每個key和value組成key=value的格式寫入stringBuilder中,若是stringBuilder裏已經有值的話還會添加&符號,那麼這最終出來的東西能夠聯想到的是什麼?對!就是queryString那部分,只不過它的參數是被排過序的(由於TreeMap會自動進行排序)。
而後咱們再往上面看,驗證一下想法正不正確,能夠看到最源頭的地方是個HashMap,被put進去的都是咱們抓包時看到的參數。
如今咱們就把這個sign的生成邏輯給理清楚了,其實它就是個按照參數名排過序的queryString進行了一次MD5操做後的產物,接下來咱們只須要在代碼中實現這個生成邏輯就好了,在Python中,你可使用它自帶的官方庫hashlib來對一個字符串作MD5操做。
那麼咱們寫一段代碼模擬請求一下試試,sign確實能夠經過校驗,說明咱們生成的sign是可使用的,至此,加密參數破解完成。
提示:建議實際操做中不要這麼測試,容易觸發反爬。能夠先拿抓包獲得的參數生成一遍對比一下,若是同樣則說明生成的sign沒有問題。
這個時代各類東西變化太快,而網絡上的垃圾信息又不少,你須要有一個良好的知識獲取渠道,不少時候早就是一種優點,因此還不趕忙關注個人公衆號並置頂/星標一波。
發送消息「APP加密參數破解初級篇代碼」到個人公衆號【小周碼字】便可得到demo代碼和APP的下載地址~