1. 程式人生 > >兄弟,你爬蟲基礎這麼好,需要研究js逆向了,一起吧(有完整JS程式碼)

兄弟,你爬蟲基礎這麼好,需要研究js逆向了,一起吧(有完整JS程式碼)

> 這幾天的確有空了,看更新多快,專門研究了一下幾個網站登入中密碼加密方法,比起滑塊驗證碼來說都相對簡單,適合新手js逆向入門,大家可以自己試一下,試不出來了再參考我的js程式碼。篇幅有限,完整的js程式碼在這裡:[從今天開始種樹](http://www.happyhong.cn/download/qichezhijia.html) ## 前戲 今天要碰的是`汽車之家`,關於這個網站網上大多都再研究其字型反爬,如果想研究字型反爬的話直接搜一下就有很多。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200816194239393.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b2h1YTEzOTUw,size_16,color_FFFFFF,t_70#pic_center) 今天主要是研究汽車之家在登入時的`password`加密方法,並通過`python`呼叫`js`的方式執行出加密結果。 ## 開始 老規矩,開啟登入頁面,長下面這樣,與大多網站一樣的佈局,切換到賬號密碼登入。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200816194455478.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b2h1YTEzOTUw,size_16,color_FFFFFF,t_70#pic_center) 接下來應該知道怎麼做了吧(花5秒鐘假裝思考一下),跟長頸鹿裝進冰箱裡一樣,一共4步: - **把冰箱門開啟**:F12,切到`Network`頁籤(一般預設就是這個頁籤,建議大家都用`chrome`); - **把大象拿出來**:輸入賬號密碼,可別輸入正確的哦; - **把長頸鹿放進去**:在請求列表裡查詢關於登入發起的請求; - **把冰箱門關上**:找到請求,檢視`POST`(一般都是post請求,暫時還沒見過其它方式的) url,還有`FormData`裡的引數。 #### 把冰箱門開啟 按F12開啟工具 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200816195446421.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b2h1YTEzOTUw,size_16,color_FFFFFF,t_70#pic_center) #### 把大象拿出來 輸入錯誤的賬號密碼。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200816195525342.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b2h1YTEzOTUw,size_16,color_FFFFFF,t_70#pic_center) #### 把長頸鹿放進去 找到請求,一般這種就需要就經驗了,有時候這種請求名稱會帶`login`等字眼,通常都是`ajax`請求(切到`XHR`可以只看ajax請求,如果實在找不到可以切換到XHR),這樣就不會有亂七八糟的圖片、css、js請求干擾你。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/2020081619565932.png#pic_center) #### 把冰箱門關上 這裡只截取了部分資料,後面沒截的大都是滑塊驗證碼相關引數,這個後續再進行研究,今天只看這個`pwd`引數。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200816195713938.png#pic_center) ## 分析 有了前面檢視的結果,我們可以直接拿這個`pwd`去`sourecs`裡查詢相關的js檔案,從下圖看有兩個檔案包含`pwd`關鍵字,第一個看著都不像,不信你可以點進去看看,第二個包含了`login`關鍵字,八九不離十就是它,點進去。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200816202651428.png#pic_center) 進行來後繼續搜尋`pwd`關鍵字,幸運的是隻有一個結果: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200816203020681.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b2h1YTEzOTUw,size_16,color_FFFFFF,t_70#pic_center) 那可以確定加密函式就是`hex_md5`了,一般我們會碰到的就是帶有`rsa`、`MD5`、`encrypt`之類的函式,可以作為經驗留意一下。 ## 除錯 整一個斷點,我整在了413行,大家看自己的在第幾行。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200816203438469.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b2h1YTEzOTUw,size_16,color_FFFFFF,t_70#pic_center) 輸入賬號密碼,點選登入然後應該就會跳轉到413行,點選右側下一步箭頭,就是下面這個: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200816203732205.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b2h1YTEzOTUw,size_16,color_FFFFFF,t_70#pic_center) #### hex_md5函式 一步一步執行進入`hex_md5`函式,函式長這樣: ```javascript function hex_md5(s) { return binl2hex(core_md5(str2binl(s), s.length * chrsz)); } ``` `s`是我們的密碼,可以看出呼叫了`binl2hex`和`core_md5`,還有一個`chrsz`變數,往上看一點就發現了`chrsz`。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200816204033482.png#pic_center) `hex_md5`函式返回的就是最終加密的結果。 #### binl2hex函式 ```javascript function binl2hex(binarray) { var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; var str = ""; for (var i = 0; i < binarray.length * 4; i++) { str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xF) + hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8)) & 0xF); } return str; } ``` `hexcase` 在前面那個圖裡有,`binarray`先不用管,這是`core_md5`返回的值,函式相對簡單,內部也沒有繼續呼叫小函式,我們也不用知道幹了啥,到時候摳出來直接呼叫即可。 #### str2binl函式 ```javascript function str2binl(str) { var bin = Array(); var mask = (1 << chrsz) - 1; for (var i = 0; i < str.length * chrsz; i += chrsz) bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (i % 32); return bin; } ``` 這個函式也沒有內部小函數了。 #### core_md5函式 這個函式就長了,內部也呼叫了很多,這裡只截部分了,建議分別去看看呼叫的這些小函式,比如`md5_ff`等,這樣後面好扣程式碼: ```javascript function core_md5(x, len) { /* append padding */ x[len >> 5] |= 0x80 << ((len) % 32); x[(((len + 64) >>> 9) << 4) + 14] = len; var a = 1732584193; var b = -271733879; var c = -1732584194; var d = 271733878; for (var i = 0; i < x.length; i += 16) { var olda = a; var oldb = b; var oldc = c; var oldd = d; a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936); d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586); c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819); b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330); a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897); ..... 省略 ..... ``` ## 摳出來python執行 前面已經把js程式碼加密思路理了一下,大家可以自己試著摳一下,實在摳不出來的點選這裡[從今天開始種樹](http://www.happyhong.cn/download/qichezhijia.html)參考完整js程式碼,接下來使用python執行,使用的依然是`execjs`庫。 ```python import execjs with open('..//js//qichezhijia.js', encoding='utf-8') as f: qichezhijia= f.read() js = execjs.compile(qichezhijia) logid = js.call('get_pwd', "123456") print(logid) ``` #### 結果對比 FormData裡的加密結果: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200816205308481.png#pic_center) python執行的結果: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200816205321632.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b2h1YTEzOTUw,size_16,color_FFFFFF,t_70#pic_center) 看看的確是一模一樣,一方面說明沒問題,另外一方面說明加密方法跟時間戳沒什麼關係,有些網站加密結果還會跟時間戳、useragent等有關。 ## 結束 整個過程並不難,又是一個適合js逆向入門練手級網站,可以通過這個例子練習一下除錯技巧,完整程式碼點選這裡[從今天開始種樹](http://www.happyhong.cn/download/qichezhijia.html),關注下面的公眾號,獲取更多內容,當然不關注也無所謂。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200321100547328.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b2h1YTEzOTUw,size_16,color_FFFFFF,t_70#pic