該文章主要提供交流學習使用,請勿利用其進行不當行爲!
如本篇文章侵犯了貴公司的隱私,請聯繫我立刻刪除!
個人博客:http://www.feastawlisao.com/
歡迎關注個人公衆號:pythonORjs
今天分享一下gojoy的登陸產生的參數是如何形成的。
這裏感謝 ttdd666 分享的參數生成過程。
好了,進入正題,這裏我們全方位進行講解。
1.這裏我們打開https://passport.gojoy.com/login,進行登陸,打開f12開發者工具,我們會看到這個。有個debugger,自動進入調試。
這裏我們在debugger處,打上斷點,右鍵選擇Edit Breakpoint ,然後輸入false,點擊下一步就行了,斷點會自動端下來。
然後我們輸入賬號密碼,開始抓包,post提交的參數如下,一串數字加字母的組合,不知道什麼東西,而且我們經常見的參數名也沒有了,這怎麼找參數呢。
不要慌,問題不大,慌也沒用撒。我們看這裏,就會發現很多js參數。這裏提醒一下,並不是所有都是這樣找的,這個只是方便點。
我們點進去第一個js。然後格式化,在此處打上斷點,如下,我們就會發現參數l,就是我們要找的參數。
但是這裏我們就是想明白,這個l已經是加密過後的參數了,那我們就得往前翻,找到沒被加密之前的事如何傳參的。我們繼續往後找。
然後發現在這裏,我們下上斷點,然後運行,會發現,post,mobile,等,看着是不是很熟悉。然後我們看到s就是我們的賬號密碼,此處,還沒有加密,那我們就執行下一步,,這裏執行下一步,我們要小心點,用心看,別執行那麼快。
大約執行10次左右,我們發現,Q函數裏面,有我們的賬號密碼。
那我們看一下,Q函數攜帶上賬號密碼,是不是我們要的結果。
此處我們進入Q函數,然後發現,我們進入的怎麼使s函數。當時我也是一陣迷茫,這是啥情況呢,然後慢慢發現,這裏有一行代碼,我們調用s函數,實際上就是Q函數。
此處我們看代碼發現,這是個大列表,,別表裏面有五六個函數,然後相互調用。那我們先把代碼摳出來。就是這個大列表,我們放入VScode裏面,因爲我們要進行調試。裏面有很多坑,需要我們進行調試。
然後我們發現,代碼裏面竟然有debugger,我敲,神了,那我們就看看代碼哪裏有debugger。
我們通過斷點發現,這就是debugger。我敲。真的是。。。。。。
既然發現了,我們得把他刪除掉,影響我們代碼運行,然後我們又發現,這是一段for循環的代碼,但是 i < 後面的東西應該是個數字,這麼一長串是什麼東西呢。
我們把後面的複製出來,然後特喵的,發現這麼一長段,竟然是個0。我就想問問他們程序員這麼無聊的嗎,無力吐槽。
那我們就把代碼刪掉,因爲裏面有debug程序,而且我們也知道結果是什麼了。
我們繼續調試。然後發現還有一個又出來一個debug,,,,,,,,,,,,和上面的一樣,替換成0就行了。
然後接着運行,然後又有一個debug,我吐吐血,我。我。我。。。。。。
這個地方刪除這個函數就行了。如下。
然後發現程序可以運行了,我們,打印一下輸出的東西。
然後就會輸出結果,這個就是生成過程,但是如果用python調用的話還是會報錯的。我們下面更改一下。
python調用js如下。
這裏我們用v8模塊運行js,會發現報錯了,我們查看一下,發現,這是錯誤拋異常的代碼,不管裏面哪個代碼錯了,都會跑出來異常。
那我們就先把try捕獲異常去掉,看看是哪個代碼報錯了。然後發現是這行代碼,那我們知道哪行代碼錯了,我們就開始進行調試。
經過調試發現,this.b就是atob,,而atob是js裏面base64的方法,atob,btoa,解碼,和編碼。具體可搜索base64.js。
這裏我們用base64.decode和encode代替一下。複製原生的js代碼。
var Base64 = {
_keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
encode: function(e) {
var t = "";
var n, r, i, s, o, u, a;
var f = 0;
e = Base64._utf8_encode(e);
while (f < e.length) {
n = e.charCodeAt(f++);
r = e.charCodeAt(f++);
i = e.charCodeAt(f++);
s = n >> 2;
o = (n & 3) << 4 | r >> 4;
u = (r & 15) << 2 | i >> 6;
a = i & 63;
if (isNaN(r)) {
u = a = 64
} else if (isNaN(i)) {
a = 64
}
t = t + this._keyStr.charAt(s) + this._keyStr.charAt(o) + this._keyStr.charAt(u) + this._keyStr.charAt(a)
}
return t
},
decode: function(e) {
var t = "";
var n, r, i;
var s, o, u, a;
var f = 0;
e = e.replace(/[^A-Za-z0-9+/=]/g, "");
while (f < e.length) {
s = this._keyStr.indexOf(e.charAt(f++));
o = this._keyStr.indexOf(e.charAt(f++));
u = this._keyStr.indexOf(e.charAt(f++));
a = this._keyStr.indexOf(e.charAt(f++));
n = s << 2 | o >> 4;
r = (o & 15) << 4 | u >> 2;
i = (u & 3) << 6 | a;
t = t + String.fromCharCode(n);
if (u != 64) {
t = t + String.fromCharCode(r)
}
if (a != 64) {
t = t + String.fromCharCode(i)
}
}
t = Base64._utf8_decode(t);
return t
},
_utf8_encode: function(e) {
e = e.replace(/rn/g, "n");
var t = "";
for (var n = 0; n < e.length; n++) {
var r = e.charCodeAt(n);
if (r < 128) {
t += String.fromCharCode(r)
} else if (r > 127 && r < 2048) {
t += String.fromCharCode(r >> 6 | 192);
t += String.fromCharCode(r & 63 | 128)
} else {
t += String.fromCharCode(r >> 12 | 224);
t += String.fromCharCode(r >> 6 & 63 | 128);
t += String.fromCharCode(r & 63 | 128)
}
}
return t
},
_utf8_decode: function(e) {
var t = "";
var n = 0;
var r = c1 = c2 = 0;
while (n < e.length) {
r = e.charCodeAt(n);
if (r < 128) {
t += String.fromCharCode(r);
n++
} else if (r > 191 && r < 224) {
c2 = e.charCodeAt(n + 1);
t += String.fromCharCode((r & 31) << 6 | c2 & 63);
n += 2
} else {
c2 = e.charCodeAt(n + 1);
c3 = e.charCodeAt(n + 2);
t += String.fromCharCode((r & 15) << 12 | (c2 & 63) << 6 | c3 & 63);
n += 3
}
}
return t
}
}
這裏我們修改爲…如下。
然後運行,如下。
用python調用。
今天的分享到此結束,謝謝大家閱讀此文章,下篇文章見撒!