JS hook

參照:

JS 逆向之 Hook

JS Hook 與 過 debugger

一、常用Hook

1. eval

(function() {let _eval = eval;eval = function(val) {if (val.indexof('debugger') === -1) {_eval_cache(obj);}}
})();

2. JSON.parse()

(function () {var parse_ = JSON.parse;JSON.parse = function (arg) {console.log(arg);debugger;return parse_(arg);};
})();

?3.JSON.stringify

JSON.stringify()?方法用于將 JavaScript 值轉換為 JSON 字符串,在某些站點的加密過程中可能會遇到,以下代碼演示了遇到?JSON.stringify()?時,則插入斷點:

(function() {var stringify = JSON.stringify;JSON.stringify = function(params) {console.log("Hook JSON.stringify ——> ", params);debugger;return stringify(params);}
})();

3.XMLHttpRequest(URL)

一般獲取請求中的參數

(function () {var _open = window.XMLHttpRequest.prototype.open;window.XMLHttpRequest.prototype.open = function (method, url, async) {if (url.indexOf("參數名稱") != -1) {debugger;}return _open.apply(this, arguments);};
})();

4.XMLHttpRequest(Header)

一般獲取header中的參數

(function () {var _setRequestHeader = window.XMLHttpRequest.prototype.setRequestHeader;window.XMLHttpRequest.prototype.setRequestHeader = function (key, value) {if (key == "header 的參數 key") {debugger;}return open.apply(this, arguments);};
})();

5.cookie

(function() {var cookieTemp = '';Object.defineProperty(document, 'cookie', {set: function (val) {if (val.indexOf('cookie 關鍵字') != -1) {debugger;}console.log(val);cookieTemp = val;return val;},get: function() {return cookieTemp;},});
})();(function () {'use strict';var org = document.cookie.__lookupSetter__('cookie');document.__defineSetter__('cookie', function (cookie) {if (cookie.indexOf('__dfp') != -1) {debugger;}org = cookie;});document.__defineGetter__('cookie', function () {return org;});
})();

6. Function

(function() {// 保存原始方法window.__cr_fun = window.Function;// 重寫 functionvar myfun = function() {var args = Array.prototype.slice.call(arguments, 0, -1).join(","),src = arguments[arguments.length - 1];console.log(src);console.log("=============== Function end ===============");debugger;return window.__cr_fun.apply(this, arguments);}// 屏蔽js中對原生函數native屬性的檢測myfun.toString = function() {return window.__cr_fun + ""}Object.defineProperty(window, 'Function', {value: myfun});
})();

?

二、無限 debugger

debugger 使用 Function.constructor / setInterval / eval?

1.?setInterval

比如setInterval(function () { debugger; }, 500);1. 方法置空setInterval = function() {};

2.eval

//通常以下代碼是加密構造出來的, eval 執行的是一個字符串變量。
eval("debugger;")
eval("(function() {var a = new Date(); debugger; return new Date() - a > 100;}())")1.使用字符串 replace("debugger;","   ") 方法,進行替換 debugger ,為防止對字符串進行長度檢測,常常使用等長的空格替換2.Hook(function() {var _eval = eval;eval = function(val) {if (val.indexof('debugger') === -1) {_eval_cache(obj);}}})();3.置空eval = function() {};

3.Function

// 常見形式
Function('debugger')()
(function(){return false;})['constructor']('debugger')['call']();xxx.constructor("debugger").call("action")1. Hook
Function.prototype.__constructor_back = Function.prototype.constructor;Function.prototype.constructor = function() {if(arguments && typeof arguments[0]==='string'){//alert("new function: "+ arguments[0]);if("debugger" === arguments[0]){//arguments[0]="console.log(\"anti debugger\");";//arguments[0]=";";return;}}return Function.prototype.__constructor_back.apply(this,arguments);
}

三、Object.defineProperty()

基本語法:Object.defineProperty(obj, prop, descriptor),它的作用就是直接在一個對象上定義一個新屬性,或者修改一個對象的現有屬性,接收的三個參數含義如下:

obj:需要定義屬性的當前對象;

prop:當前需要定義的屬性名;

descriptor:屬性描述符,可以取以下值:

屬性名默認值含義
getundefined存取描述符,目標屬性獲取值的方法
setundefined存取描述符,目標屬性設置值的方法
valueundefined數據描述符,設置屬性的值
writablefalse數據描述符,目標屬性的值是否可以被重寫
enumerablefalse目標屬性是否可以被枚舉
configurablefalse目標屬性是否可以被刪除或是否可以再次修改特性

?通常情況下,對象的定義與賦值是這樣的:

var people = {}
people.name = "Bob"
people["age"] = "18"console.log(people)
輸出{ name: 'Bob', age: '18' }

使用 Object.defineProperty() 方法:

var people = {}Object.defineProperty(people, 'name', {value: 'Bob',writable: true  // 是否可以被重寫
})
//這個是重寫了people的name方法console.log(people.name)  // 'Bob'people.name = "Tom"console.log(people.name)  // 'Tom'

在 Hook 中,使用最多的是存取描述符,即 get 和 set。

get:屬性的 getter 函數,如果沒有 getter,則為 undefined,當訪問該屬性時,會調用此函數,執行時不傳入任何參數,但是會傳入 this 對象(由于繼承關系,這里的 this 并不一定是定義該屬性的對象),該函數的返回值會被用作屬性的值。

set:屬性的 setter 函數,如果沒有 setter,則為 undefined,當屬性值被修改時,會調用此函數,該方法接受一個參數,也就是被賦予的新值,會傳入賦值時的 this 對象。

用一個例子來演示:

var people = {name: 'Bob',
};
var count = 18;// 定義一個 age 獲取值時返回定義好的變量 count
Object.defineProperty(people, 'age', {get: function () {console.log('獲取值!');return count;},set: function (val) {console.log('設置值!');count = val + 1;},
});console.log(people.age);people.age = 20;console.log(people.age);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/37767.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37767.shtml
英文地址,請注明出處:http://en.pswp.cn/web/37767.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++ initializer_list類型推導

目錄 initializer_list C自動類型推斷 auto typeid decltype initializer_list<T> C支持統一初始化{ }&#xff0c;出現了一個新的類型initializer_list<T>&#xff0c;一切類型都可以用列表初始化。提供了一種更加靈活、安全和明確的方式來初始化對象。 class…

IO-Link OD介紹

IO-Link OD&#xff08;On-request Data&#xff0c;按需數據&#xff09;是IO-Link通信中的一種重要數據類型&#xff0c;主要用于參數讀寫、指令交互、事件上傳等動作。以下是關于IO-Link OD的結構、構成以及功能使用的詳細說明&#xff1a; 結構與構成 定義&#xff1a;OD…

堆排序(Heap Sort)

堆排序是一種高效的排序算法&#xff0c;它利用了堆的數據結構來實現。堆是一種特殊的完全二叉樹&#xff0c;分為最大堆和最小堆兩種類型。在最大堆中&#xff0c;父節點的值大于等于其子節點的值&#xff1b;而在最小堆中&#xff0c;父節點的值小于等于其子節點的值。 堆排…

【C命名規范】遵循良好的命名規范,提高代碼的可讀性、可維護性和可復用性

/******************************************************************** * brief param return author date version是代碼書寫的一種規范 * brief &#xff1a;簡介&#xff0c;簡單介紹函數作用 * param &#xff1a;介紹函數參數 * return&#xff1a;函數返回類型說明 * …

同一個excel表格,為什么在有的電腦上會顯示#NAME?

一、哪些情況會產生#NAME?的報錯 1.公式名稱拼寫錯誤 比如求和函數SUM&#xff0c;如果寫成SUN就會提示#NAME&#xff1f;報錯。 2.公式中的文本值未添加雙引號 如下圖&#xff1a; VLOOKUP(丙,A:B,2,0) 公式的計算結果會返回錯誤值#NAME?&#xff0c;這是因為公式中文本…

【PLC】三菱PLC如何和匯川伺服實現485通信

前言 一開始選用的是匯川SV660P脈沖型伺服&#xff0c;由于生產需求需要對伺服的個別參數進行讀取和寫入操作&#xff0c;但是SV660P并不支持這種情況&#xff0c;因此需要使用485通信來滿足。PLC這邊選用的是三菱FX5U。 開始 1、首先準備按照下圖的引腳提示準備好一根帶屏蔽…

全志H616交叉編譯工具鏈的安裝與使用

交叉編譯的概念 1. 什么是交叉編譯&#xff1f; 交叉編譯是指在一個平臺上生成可以在另一個平臺上運行的可執行代碼。例如&#xff0c;在Ubuntu Linux上編寫代碼&#xff0c;并編譯生成可在Orange Pi Zero2上運行的可執行文件。這個過程是通過使用一個專門的交叉編譯工具鏈來…

(七)glDrawArry繪制

幾何數據&#xff1a;vao和vbo 材質程序&#xff1a;vs和fs(頂點著色器和片元著色器) 接下來只需要告訴GPU&#xff0c;使用幾何數據和材質程序來進行繪制。 #include <glad/glad.h>//glad必須在glfw頭文件之前包含 #include <GLFW/glfw3.h> #include <iostrea…

程序員接單服務話術

進入群聊開始服務時&#xff1a; 尊敬的客戶您好&#xff0c;我程序員&#xff1a;xx 很榮幸為您服務 我擅長xx領域 接下來我們一起對接下詳細需求&#xff0c;我將根據您的任務需求難度給您匯報開發所需時長及報價。預祝我們合作愉快。 報價后且客戶接受時&#xff1a; 您好…

PostgreSQL的學習心得和知識總結(一百四十七)|深入理解PostgreSQL數據庫之transaction chain的使用和實現

目錄結構 注&#xff1a;提前言明 本文借鑒了以下博主、書籍或網站的內容&#xff0c;其列表如下&#xff1a; 1、參考書籍&#xff1a;《PostgreSQL數據庫內核分析》 2、參考書籍&#xff1a;《數據庫事務處理的藝術&#xff1a;事務管理與并發控制》 3、PostgreSQL數據庫倉庫…

2024年文化傳播與對外交流國際學術會議(ICCCFE 2024)

2024年文化傳播與對外交流國際學術會議&#xff08;ICCCFE 2024&#xff09; 2024 International Conference on Cultural Communication and Foreign Exchange(ICCCFE 2024) 會議簡介&#xff1a; 2024年文化傳播與對外交流國際學術會議&#xff08;ICCCFE 2024&#xff09;定…

clion開發51 沒有創建成功可能是Clion版本問題

安裝插件 PlatformlO for CLion 進入這個網站下載get-platformio.py https://docs.platformio.org/en/latest/core/installation/methods/installer-script.html#local-download-macos-linux-windows 點擊 Installation Methods 選擇 Local Download (macOS/Linux/Windows) 點…

linux指令gzip

gzip 是 Linux 系統中廣泛使用的一個文件壓縮和解壓縮程序。它使用 Lempel-Ziv 編碼&#xff08;LZ77&#xff09;和 Huffman 編碼的組合來壓縮文件&#xff0c;減少磁盤使用空間和網絡傳輸時間。以下是對 gzip 命令的一些基本使用說明和示例&#xff0c;這些示例旨在幫助你了解…

小阿軒yx-案例:MySQL主從復制與讀寫分離

小阿軒yx-案例&#xff1a;MySQL主從復制與讀寫分離 案例分析 概述 實際生產環境中 如果對數據庫讀和寫都在同一個數據庫服務器中操作&#xff0c;無論在安全性、高可用性還是高并發等各個方面都完全不能滿足實際需求一般都是通過主從復制&#xff08;Master-Slave&#xf…

MSPG3507——藍牙接收數據顯示在OLED,滴答定時器延時500MS

#include "ti_msp_dl_config.h" #include "OLED.h" #include "stdio.h"volatile unsigned int delay_times 0;//搭配滴答定時器實現的精確ms延時 void delay_ms(unsigned int ms) {delay_times ms;while( delay_times ! 0 ); } int a0; …

4.自動生成class和device

第三章里面&#xff0c;我們使用mknod創建設備節點&#xff0c;常規操作是在驅動init的時候就創建好&#xff0c;使用class_create和device_create創建。 #include "asm/uaccess.h" #include "linux/scatterlist.h" #include "linux/types.h" #…

【公平鎖 和 非公平鎖】

公平鎖 和 非公平鎖 公平鎖:類似食堂打飯&#xff0c;按照申請鎖的順序來獲取鎖類似廁所蹲坑先來后到 公平鎖就是很公平 在并發環境下每個線程在獲取鎖的同時會先查看此鎖維護的等待隊列&#xff0c;如果為空&#xff0c;或者當前線程是等待就占有鎖&#xff0c;否則就加入到…

20人團隊如何免費使用 Atlassian 云產品?

企業賺錢越來越難&#xff0c;尤其是初創團隊或小型團隊更傾向于使用免費工具支持業務。團隊規模影響協作復雜度&#xff0c;Atlassian 考慮到小團隊的需求&#xff0c;提供了多種選擇。比如&#xff0c;Jira 和 Confluence 的云版本有免費版&#xff0c;包含基本的項目管理功能…

ISP IC/FPGA設計-第一部分-SC130GS攝像頭分析(0)

1.介紹 SC130GS是一款國產的Global shutter CMOS圖像傳感器&#xff0c;最高支持1280Hx1024V240fps的傳輸速率&#xff1b;SC130GS有黑白和彩色款&#xff0c;作為ISP開發選擇彩色的&#xff0c;有效像素窗口為1288Hx1032V&#xff0c;支持復雜的片上操作&#xff0c;選擇他理…

Toshiba東芝TB6612FNG電機驅動IC:釋放性能與多功能性

在嵌入式系統和機器人技術領域&#xff0c;電機控制是一個關鍵方面&#xff0c;對項目的性能和可靠性有著顯著影響。東芝的TB6612FNG電機驅動IC作為一個穩健且多功能的解決方案&#xff0c;在驅動雙直流電機方面脫穎而出&#xff0c;提供了高性能、可靠性和易用性。本文將深入探…