爬蟲:js逆向目前遇到的知識點集合

目前js逆向遇到的函數、解法或者其他注意事項集合

0x01、Object(需要調用的函數名)(參數)用法詳解

後面的參數將傳遞到需要調用的函數名中,如下:

// s.c對應e1    s.d對應e2   s.e對應sig
// 這裏注意一下:object(sig)(f)表示將f傳遞到sig裏面去
var f = Object(e1)(Object(e2)(JSON.stringify(l.payload))), p = Object(sig)(f);  
0x02、js前加感嘆號是什麼意思?比如 !function(){}();
原文來源:https://blog.csdn.net/H_O_W_E/article/details/51388500

內容如下:

--------------------------我是可愛的分割線---------------------------------------------------

此文出自 http://q.cnblogs.com/q/52920/

感謝原創作者和轉載者,感謝提問人和解答人。

!function(){}();   !有什麼用?

從語法上來開,Javascript中分號表示語句結束,在開頭加上,可能是爲了壓縮的時候和別的方法分割一下,表示一個新的語句開始。所以,如果在一個單獨的JS文件中,開頭的分號是沒有任何意義的,可以刪掉。

歎號是邏輯運算符,是“非”的意思,常見這種寫法 if(!true){};而將運算符加載函數定義的前面,則是將函數看做一個整體,然後再調用這個函數,並對返回的結構進行邏輯運算。

說白了,此處就是構建了一個立即執行函數,建議樓主知道意思就可以,自己寫的時候,可以使用更清晰的格式:

(function(){})();

樓上已經給出很詳細的解說了。

這裏補充一點:在函數聲明【 function (){} 】後面加【 () 】,意思是執行這個函數聲明。有的叫法是“匿名自動執行函數”,更準確的表示應該爲“立即執行函數”。

但立即執行函數,要作爲表達式的一部分纔行,不然js解釋器會報語法錯誤。一般,成爲表達式的最容易理解方式是:在左右兩端加一個圓括號,像這樣【 (function (){}) 】。所以,立即執行函數最常見的寫法是【 (function (){})() 】,這是一個語句,在前面和後面都可以加【 ; 】。

其實立即執行函數還有N種寫法,比如【 (function (){}) 】也行,在函數聲明前加一元運算符也行:【 !function (){}() 】、【 ~function (){}() 】。甚至,對一元運算符進行組合也可以:【 !!!!function (){}() 】、【 ~~~function (){}() 】、【 !~!function (){}() 】。
0x03、(function (win){}(window))這個js是什麼意思?

1、意思是,把window對象傳入這個匿名函數中(即將window傳給win),並且同時執行這個函數,在頁面載入之前就執行

2、小括號有返回值,也就是小括號內的函數或者表達式的返回值,所以說小括號內的function返回值等於小括號的返回值;

0x04、window對象的某些用法轉換爲Nodejs的用法

1、對於一些window對象的用法,將js代碼扣出來,在nodejs裏是不能直接使用的,需要做相應的轉換,例如下面這個例子:

# 源js代碼
window["String"]["fromCharCode"](scHZjLUh1["charCodeAt"](i)

# 扣出來在本地webstorm+nodejs執行的代碼
String.fromCharCode((scHZjLUh1["charCodeAt"](i))

通過上面代碼之間的轉換,可以看出,window的某些用法可以在nodejs裏面也能找到對應的寫法

0x05、Nodejs實現Base64編解碼
# 用法一:
Base64["decode"](scHZjLUh1)  # 源js代碼 
Buffer.from(scHZjLUh1, 'base64').toString()  # 轉換成nodejs代碼

# 用法二:
window.atob([base64加密後的字符串])  # atob是解密base64字符串,成爲普通字符串
window.btoa([base64加密前的字符串])  # btoa是加密字符串,成爲base64編碼的字符串

01、例子:
源js代碼也可能是使用window對象來構造的base64加解密,比如下面:
window.atob("amF2YXNjcmlwdA==")  # 解碼的結果是javascript
轉換爲nodejs寫法就是:
Buffer.from("amF2YXNjcmlwdA==", 'base64').toString()  # nodejs的base64解碼方式

02、繼續延伸:
nodejs中base64加解密如下:

# base64解密
console.log(Buffer.from("SGVsbG8gV29ybGQ=", 'base64').toString('utf-8'))
Hello World

# base64加密
console.log(Buffer.from("Hello World").toString('base64'));
SGVsbG8gV29ybGQ=
至此本文教程寫完了,希望能夠幫助到各位在爬蟲路上的小夥伴們,覺得不錯點個讚唄
感謝認真讀完這篇教程的您

先別走唄,這裏有可能有你需要的乾貨文章:

CSS字體反爬實戰,10分鐘就能學會;
woff字體反爬實戰,10分鐘就能學會

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章