大家好,我是辣條,
這是我爬蟲系列的第三十篇,爬蟲之路永無止境,
采集目標
網址:
aHR0cHM6Ly93d3cud2VpZGlhbi5jb20vP3NvdXJjZT1ndWFud2FuZw==

工具準備
開發工具:pycharm 開發環境:python3.7, Windows10 使用工具包:requests, node.js,buff
專案決議思路
首先需要找到網頁的登錄頁面的登錄介面 登錄頁面:aHR0cHM6Ly9kLndlaWRpYW4uY29tL3dlaWRpYW4tcGMvbG9naW4vP3NwaWRlcl90b2tlbj04MDRjIy8=

在獲取到登錄介面,介面需要使用抓包工具獲取到登錄的請求介面,先輸入錯誤的賬戶密碼觸發出登錄介面

post請求大部分情況下意味著我們需要傳遞引數,查看需要傳遞的引數資訊,當前網頁有點奇怪,賬戶密碼都是沒有加密的,加密的是ua欄位,那我們今天主要的就是搞定ua欄位


今天還是照常使用搜索的方式查找欄位,但是ua關鍵字想想就知道出現的頻率會很高,今天來一個搜索的小訣竅,一般ua會作為一個關鍵字,我們可以更精確的搜索比方說搜索‘ua:’、‘ua=’,這種搜索出來的會比直接搜索關鍵字更加的準確,


剩下的檔案就需要慢慢進行篩選排除了,找到和我們類似相似欄位的時候可以斷點除錯,看看是不是我們需要的請求介面觸發的, 最終我們將代碼定格在index.js檔案

ua欄位是由encodeURIComponent加載過來的,encodeURIComponent是對字串進行url編碼的,該方法不會對 ASCII 字母和數字進行編碼,也不會對這些 ASCII 標點符號進行編碼: - _ . ! ~ * ' ( ) 編碼的資料是i,找到i的生成位置, i是由window.getUa加載過來的,搞的辣條一陣歡喜,還想著這個網頁加密沒有很嚴謹,到我打開之后發現是辣條的格局小了,打上斷點我們進入window.getUa這個函式,看的我徑訓一緊,

直接世界崩塌

代碼是混淆加密的,在這里也辣條也想征集一個好用的反混淆的工具(還望各位大佬不吝賜教),
我們來慢慢解一下試試 _0x7dfc34可以很直觀看出來是獲取時間戳,if的判斷是沒有進的可以暫時忽略,在下方的函式呼叫可以不用搭理

開始決議0x261229,0x261229是有3部分拼接得來先解決第一部分0x1722c3(0x2e98dd), 0x2e98dd可以看出資料是陣列,我轉換json來看看,先對資料有一定的概念, 在看看0x1722c3的函式

var _0x1722c3 = function(_0x1da193) {
var _0x3dca2f = new _0x4d6308();
if (_0x1da193[_0x4651('0x43a')]) {
var _0x180af0 = _0x3dca2f[_0x4651('0x43b')](_0x2e98dd);
var _0x286380 = _0x3b911e(_0x180af0);
return _0x286380;
} else {
var _0x180af0 = _0x3dca2f[_0x4651('0x43c')](_0x1da193);
var _0x286380 = _0x3b911e(_0x180af0);
return _0x286380;
}
};
呼叫的函式判斷的資料有點多,辣潭訓是選擇直接補環境 先把主要代碼邏輯放過來
var _0x1722c3 = function(_0x1da193) {
var _0x3dca2f = new _0x4d6308();
if (_0x1da193[_0x4651('0x43a')]) {
var _0x180af0 = _0x3dca2f[_0x4651('0x43b')](_0x2e98dd);
var _0x286380 = _0x3b911e(_0x180af0);
return _0x286380;
} else {
var _0x180af0 = _0x3dca2f[_0x4651('0x43c')](_0x1da193);
var _0x286380 = _0x3b911e(_0x180af0);
return _0x286380;
}
};
?
?
window[_0x4651('0x710')] = function() {
var _0x7dfc34 = new Date().getTime();
// if (_0x4a9622) {
// _0x2644f4();
// }
// _0x55b608();
var _0x261229 = _0x1722c3(_0x2e98dd) + '|' + _0x1722c3(_0x420004) + '|' + _0x7dfc34[_0x4651('0x8c')](0x10);
_0x261229 = btoa(_0x570bef[_0x4651('0x90')](_0x261229, {
'to': _0x4651('0x97')
}));
return _0x261229;
};
嘗試運行看看缺少什么,缺什么就補什么,把剛剛控制臺上的資料拿過來,

慢慢補的速度實在有點慢,直接拿整個檔案吧,混淆的代碼看這有點頭疼,運行整個js檔案時給我們報錯,

這個使用特定的js代碼搞定,其他腳本也適應,加上之后就沒得問題了,
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
window = dom.window;
document = window.document;
XMLHttpRequest = window.XMLHttpRequest;
這個我就不就不添加了,直接去原始碼里查找

兩個為本地網址的域名和網路協議直接修改


沒有報錯了,嘗試呼叫我們的主邏輯代碼

當我們呼叫主函式時報錯資訊提示btoa的問題,這個是base64的加密方法,直接呼叫的話會出現一些問題,我們可以選擇用buff方式進行加密,將原有代碼替換,在嘗試運行

var _0x261229 = new Buffer.from(_0x570bef[_0x4651('0x90')](_0x261229, {
'to': _0x4651('0x97')
}));

大功告成,js給位大佬可以之后自行嘗試
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
window = dom.window;
document = window.document;
XMLHttpRequest = window.XMLHttpRequest;
#代碼實在太太太長了,嚴重影響了閱讀,我全刪減了,需要的話可以按照我上面的操作去獲取或者不會的話私我獲取
后續的作業就很簡單了,把資料轉換就好了,對網址發送請求帶上請求頭,在帶上需要傳遞的引數,后面就很簡單啦 ,

👇🏻 疑難解答可通過搜索下方 👇🏻
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/325598.html
標籤:python
