兄弟,你爬蟲基礎這麼好,需要研究js逆向了,一起吧(有完整JS程式碼)
阿新 • • 發佈:2020-08-24
> 這幾天的確有空了,看更新多快,專門研究了一下幾個網站登入中密碼加密方法,比起滑塊驗證碼來說都相對簡單,適合新手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