国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JS中注入eval, Function等系統函數截獲動態代碼

2024-05-06 15:41:07
字體:
來源:轉載
供稿:網友

現在很多網站都上了各種前端反爬手段,無論手段如何,最重要的是要把包含反爬手段的前端javascript代碼加密隱藏起來,然后在運行時實時解密動態執行。

動態執行js代碼無非兩種方法,即eval和Function。那么,不管網站加密代碼寫的多牛,我們只要將這兩個方法hook住,即可獲取到解密后的可執行js代碼。

注意,有些網站會檢測eval和Function這兩個方法是否原生,因此需要一些小花招來忽悠過去。

掛鉤代碼

首先是eval的掛鉤代碼:

(function() {  if (window.__cr_eval) return  window.__cr_eval = window.eval  var myeval = function (src) {    console.log("================ eval begin: length=" + src.length + ",caller=" + (myeval.caller && myeval.caller.name) + " ===============")    console.log(src);    console.log("================ eval end ================")    return window.__cr_eval(src)  }  var _myeval = myeval.bind(null)  _myeval.toString = window.__cr_eval.toString  Object.defineProperty(window, 'eval', { value: _myeval })  console.log(">>>>>>>>>>>>>> eval injected: " + document.location + " <<<<<<<<<<<<<<<<<<<")})();

這段代碼執行后,之后所有的eval操作都會在控制臺打印輸出將要執行的js源碼。

同理可以寫出Function的掛鉤代碼:

(function() {  if (window.__cr_fun) return  window.__cr_fun = window.Function  var myfun = function () {    var args = Array.prototype.slice.call(arguments, 0, -1).join(","), src = arguments[arguments.length - 1]    console.log("================ Function begin: args=" + args + ", length=" + src.length + ",caller=" + (myfun.caller && myfun.caller.name) + " ===============")    console.log(src);    console.log("================ Function end ================")    return window.__cr_fun.apply(this, arguments)  }  myfun.toString = function() { return window.__cr_fun + "" }  Object.defineProperty(window, 'Function', { value: myfun })  console.log(">>>>>>>>>>>>>> Function injected: " + document.location + " <<<<<<<<<<<<<<<<<<<")})();

注意和eval不同,Function是個變長參數的構造方法,需要處理this

另外,有些網站還會用類似的機制加密頁面內容,然后通過document.write輸出動態解密的內容,因此同樣可以掛鉤document.write,掛鉤方法類似eval,這里就不重復了。

注入方式

另外,還有個問題需要關注,就是掛鉤代碼的注入方法。

最簡單的就是F12調出控制臺,直接執行上面的代碼,但這樣只能hook住之后的調用,如果希望從頁面剛加載時就注入,那么可以用以下幾種方式:

油猴注入,油猴可以監聽文檔加載的幾種不同狀態,并在特定時刻執行js代碼。我沒有太多研究,具體請參見油猴手冊 代理注入,修改應答數據,在<head>標簽內的第一個位置插入<script>節點,確保在其它js加載執行前注入;Fiddler, anyproxy等都可以編寫外部規則,具體請參見代理工具的手冊 使用chrome-devtools-protocol, 通過Page.addScriptToEvaluateOnNewDocument注入外部js代碼
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 徐州市| 灵山县| 宁海县| 镇巴县| 班玛县| 当涂县| 治多县| 桓台县| 洪泽县| 无锡市| 永嘉县| 吴忠市| 新巴尔虎右旗| 贡觉县| 家居| 岐山县| 隆安县| 银川市| 祁阳县| 尼木县| 益阳市| 乌拉特中旗| 元阳县| 黔西| 荆门市| 滦平县| 永昌县| 盘锦市| 新源县| 加查县| 越西县| 揭阳市| 三都| 彩票| 沅陵县| 东阿县| 台前县| 汨罗市| 杨浦区| 邵阳市| 扶余县|