JavaScript逆向魔法:Chrome開發者工具探秘之旅

在前端開發和安全研究領域,JavaScript逆向工程是一項關鍵技能。它涉及分析和理解代碼的執行流程、數據結構和邏輯,以發現潛在的安全漏洞、提取核心算法或實現功能兼容。本文將結合Chrome開發者工具的調試功能,并通過具體示例幫助你更好地理解和應用這些技巧。

一、理解代碼結構:靜態分析與動態調試結合

(一)靜態分析:閱讀與分解代碼

靜態分析就像是閱讀一本小說,你需要先了解故事的大致情節和人物關系。對于JavaScript代碼來說,靜態分析就是通過閱讀代碼來理解其結構和邏輯。

  1. 打開目標網頁的源代碼:右鍵點擊網頁空白處,選擇“檢查”,然后在開發者工具中點擊“Elements”標簽,查看HTML結構,找到關鍵的JavaScript文件引用。

  2. 查看JavaScript文件內容:在“Sources”面板中找到并打開相關的JavaScript文件,初步了解代碼的整體結構。

  3. 尋找入口函數和核心邏輯:通常,入口函數可能是window.onloaddocument.addEventListener('DOMContentLoaded', ...)或者一些明顯的事件處理函數,如button.onClick等。

(二)動態調試:觀察代碼執行

動態調試就像是觀察小說中人物的實際行為,看看他們是否按照你預期的方式互動。對于代碼來說,動態調試就是通過設置斷點、單步執行等手段,觀察代碼的實際執行過程。

  1. 在關鍵函數入口設置斷點:在“Sources”面板中,點擊代碼行號的左側,設置一個斷點。當代碼執行到這一行時,會自動暫停。

  2. 啟動調試:刷新網頁或觸發相關操作,使代碼開始執行。當代碼執行到斷點處時,它會暫停,你可以在右側的“Scope”面板中查看當前變量的值。

  3. 單步執行:使用“Step Over”(F10)、“Step Into”(F11)和“Step Out”按鈕,逐步執行代碼,觀察每一步的變化。

示例:調試一個簡單的加密函數

function encrypt(text, key) {let result = '';for (let i = 0; i < text.length; i++) {let charCode = text.charCodeAt(i);charCode += key;result += String.fromCharCode(charCode);}return result;
}document.getElementById('encryptBtn').addEventListener('click', function() {let text = document.getElementById('inputText').value;let key = parseInt(document.getElementById('key').value);let encryptedText = encrypt(text, key);document.getElementById('result').innerText = encryptedText;
});

調試步驟:

  1. encrypt函數的第一行設置斷點。

  2. 輸入一些文本和密鑰,點擊“加密”按鈕。

  3. 當代碼暫停在斷點處時,查看textkey的值。

  4. 使用“Step Over”逐步執行循環,觀察charCoderesult的變化。

二、追蹤數據流:變量與網絡請求分析

(一)變量監控

在調試過程中,你可以實時查看和修改變量的值,就像在實驗室中觀察化學反應一樣。

  1. 添加監視表達式:在“Sources”面板的“Watch”部分,輸入你想監控的變量或表達式,如typeof sumresult.length

  2. 條件斷點:僅在特定條件下觸發斷點,例如count > 10,這樣可以更精確地定位問題。

(二)網絡請求分析

網絡請求分析就像是追蹤信使的行動,看看他們傳遞了什么信息。

  1. 利用XHR斷點:在“Sources”面板的“XHR/Breakpoints”部分,輸入要匹配的URL子字符串,如api.example.com。當發送匹配的XHR請求時,開發者工具會自動暫停。

  2. 查看網絡活動:在“Network”面板中,你可以看到所有網絡請求的詳細信息,包括請求方法、狀態碼、請求頭和響應體。

示例:分析一個登錄請求

function login() {let username = document.getElementById('username').value;let password = document.getElementById('password').value;let xhr = new XMLHttpRequest();xhr.open('POST', 'https://api.example.com/login');xhr.setRequestHeader('Content-Type', 'application/json');xhr.onload = function() {if (xhr.status === 200) {let response = JSON.parse(xhr.responseText);console.log('Login successful:', response);} else {console.error('Login failed:', xhr.statusText);}};xhr.send(JSON.stringify({ username, password }));
}

分析步驟:

  1. xhr.open行設置斷點。

  2. 輸入用戶名和密碼,點擊“登錄”按鈕。

  3. 當代碼暫停時,查看usernamepassword的值。

  4. 繼續執行,觀察網絡請求的詳細信息,包括請求體和響應內容。

三、逆向核心算法:函數調用與邏輯拆解

(一)函數調用鏈分析

函數調用鏈就像是偵探追蹤嫌疑人的行動軌跡,它記錄了函數之間的調用順序。

  1. 查看調用棧:當代碼在斷點處暫停時,打開“Call Stack”面板,可以看到當前的調用棧。每一行代表一個函數調用,從下往上依次是函數調用的順序。

  2. 跳轉到函數定義:點擊調用棧中的某一行,可以跳轉到對應的函數定義處,查看函數的實現。

(二)異常處理與容錯機制

異常處理就像是給程序買保險,當出現問題時,程序可以優雅地處理而不是崩潰。

  1. 使用異常斷點:在“Sources”面板的“Breakpoints”部分,勾選“Pause on exceptions”選項。當代碼拋出異常時,開發者工具會自動暫停,幫助你快速定位問題。

  2. 分析異常處理邏輯:查看try...catch塊,了解程序如何處理異常情況。

示例:逆向一個加密算法

function customEncrypt(data) {let encrypted = '';for (let i = 0; i < data.length; i++) {let char = data.charCodeAt(i);// 對字符編碼進行位操作char = (char << 5) | (char >> 11);encrypted += String.fromCharCode(char);}// 處理非 ASCII 字符const utf8Encoded = encodeURIComponent(encrypted).replace(/%([0-9A-F]{2})/g, function(match, p1) {return String.fromCharCode('0x' + p1);});// 使用 Base64 編碼加密后的數據return btoa(utf8Encoded);
}// 監聽加密按鈕的點擊事件
document.getElementById('encryptData').addEventListener('click', function () {// 獲取輸入框中的數據let data = document.getElementById('dataInput').value;// 調用自定義加密函數進行加密let encryptedData = customEncrypt(data);// 將加密結果顯示在頁面上document.getElementById('encryptedOutput').innerText = encryptedData;
});

逆向步驟:

  1. customEncrypt函數內部設置斷點。

  2. 輸入一些數據,點擊“加密”按鈕。

  3. 當代碼暫停時,查看data的值。

  4. 使用“Step Over”逐步執行循環,觀察char的變化,理解加密邏輯。

  5. 在本地重現加密算法,驗證其正確性。

四、實戰案例:破解加密算法

(一)案例背景

假設目標網頁使用自定義加密算法對用戶輸入進行加密傳輸,我們需要逆向該算法以實現兼容的客戶端。

(二)逆向步驟

  1. 定位加密函數:通過靜態分析,找到處理用戶輸入的函數,通常這些函數會在表單提交或按鈕點擊事件中被調用。

  2. 設置斷點:在加密函數的入口處設置斷點,捕獲加密前的原始數據。

  3. 追蹤數據流:通過單步調試,觀察數據在加密過程中的變化,記錄每一步的邏輯。

  4. 重現算法:根據觀察到的邏輯,在本地環境中重現加密算法,并進行測試。

示例:破解一個簡單的加密算法

function simpleEncrypt(text) {let result = '';for (let i = 0; i < text.length; i++) {let charCode = text.charCodeAt(i);charCode = charCode ^ 0x55; // 異或操作result += String.fromCharCode(charCode);}return result;
}document.getElementById('encryptBtn').addEventListener('click', function() {let text = document.getElementById('inputText').value;let encryptedText = simpleEncrypt(text);document.getElementById('result').innerText = encryptedText;
});

破解步驟:

  1. simpleEncrypt函數內部設置斷點。

  2. 輸入“Hello”并點擊“加密”按鈕。

  3. 當代碼暫停時,查看text的值為“Hello”。

  4. 使用“Step Over”逐步執行循環,觀察charCode的變化:

    • 'H'的字符碼是72,異或0x55后變為72 ^ 85 = 101,對應字符'e'。

    • 'e'的字符碼是101,異或0x55后變為101 ^ 85 = 72,對應字符'H'。

    • 以此類推,發現加密邏輯是簡單的異或操作。

  5. 在本地重現加密算法:

function reverseEncrypt(encryptedText) {let result = '';for (let i = 0; i < encryptedText.length; i++) {let charCode = encryptedText.charCodeAt(i);charCode = charCode ^ 0x55;result += String.fromCharCode(charCode);}return result;
}console.log(reverseEncrypt('eH...')); // 輸出原始文本

五、逆向思維與工具擴展

(一)逆向思維培養

逆向思維就像是解謎游戲,需要你不斷地提出假設并驗證。

  1. 假設與驗證:對代碼功能和邏輯做出假設,通過調試驗證假設的正確性。例如,假設某個函數是加密入口,通過設置斷點驗證數據流向。

  2. 模塊分解:將復雜的代碼分解為獨立的功能模塊,逐一分析。比如,將加密算法分解為字符處理、編碼轉換等步驟。

  3. 思維導圖:繪制代碼結構和數據流圖,清晰呈現逆向分析的思路。可以使用工具如XMind或簡單手繪。

(二)工具擴展

  1. 靜態分析工具:使用ESLint檢查代碼風格,發現潛在問題;使用JSCPD檢測代碼重復,定位核心邏輯。

  2. 代碼美化工具:JS Beautifier可以將壓縮的代碼格式化,提高可讀性。

  3. 自動化測試框架:Jest可以幫助驗證逆向得到的算法和邏輯是否正確。

通過掌握這些JavaScript逆向基礎技巧,你將能夠在前端安全研究、功能兼容實現和代碼優化等領域發揮重要作用。記住,逆向工程不僅是技術的挑戰,更是對邏輯思維和耐心的考驗。

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

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

相關文章

Qt基礎:資源文件

資源文件 1. 資源文件2. 資源文件創建 1. 資源文件 資源文件顧名思義就是一個存儲資源的文件&#xff0c;在Qt中引入資源文件好處在于他能提高應用程序的部署效率并且減少一些錯誤的發生。 在程序編譯過程中&#xff0c; 添加到資源文件中的文件也會以二進制的形式被打包到可執…

Agent TARS與Manus的正面競爭

Agent TARS 是 Manus 的直接競爭對手&#xff0c;兩者在 AI Agent 領域形成了顯著的技術與生態對抗。 一、技術架構與功能定位的競爭 集成化架構 vs 模塊化設計 Agent TARS 基于字節跳動的 UI-TARS 視覺語言模型&#xff0c;將視覺感知、推理、接地&#xff08;grounding&#…

使用ssh連接上開發板

最后我發現了問題&#xff0c;我忘記指定用戶名了&#xff0c;在mobaXterm上左上角打開會話&#xff0c;點擊ssh&#xff0c;然后輸入要連接的開發板主機的ip地址&#xff0c;關鍵在這里&#xff0c;要指定你要連接的開發板的系統中存在的用戶&#xff0c;因為通過ssh連接一個設…

【性能優化點滴】odygrd/quill在編譯期做了哪些優化

Quill 是一個高性能的 C 日志庫&#xff0c;它在編譯器層面進行了大量優化以確保極低的運行時開銷。以下是 Quill 在編譯器優化方面的關鍵技術和實現細節&#xff1a; 1. 編譯時字符串解析與格式校驗 Quill 在編譯時完成格式字符串的解析和校驗&#xff0c;避免運行時開銷&…

【數據結構】排序算法(中篇)·處理大數據的精妙

前引&#xff1a;在進入本篇文章之前&#xff0c;我們經常在使用某個應用時&#xff0c;會出現【商品名稱、最受歡迎、購買量】等等這些榜單&#xff0c;這里面就運用了我們的排序算法&#xff0c;作為剛學習數據結構的初學者&#xff0c;小編為各位完善了以下幾種排序算法&…

混雜模式(Promiscuous Mode)與 Trunk 端口的區別詳解

一、混雜模式&#xff08;Promiscuous Mode&#xff09; 1. 定義與工作原理 定義&#xff1a;混雜模式是網絡接口的一種工作模式&#xff0c;允許接口接收通過其物理鏈路的所有數據包&#xff0c;而不僅是目標地址為本機的數據包。工作層級&#xff1a;OSI 數據鏈路層&#x…

大學生機器人比賽實戰(一)綜述篇

大學生機器人比賽實戰 參加機器人比賽是大學生提升工程實踐能力的絕佳機會。本指南將全面介紹如何從零開始準備華北五省機器人大賽、ROBOCAN、RoboMaster等主流機器人賽事&#xff0c;涵蓋硬件設計、軟件開發、算法實現和團隊協作等關鍵知識。 一、比賽選擇與準備策略 1.1 主…

【Linux】動靜態庫知識大梳理

親愛的讀者朋友們&#x1f603;&#xff0c;此文開啟知識盛宴與思想碰撞&#x1f389;。 快來參與討論&#x1f4ac;&#xff0c;點贊&#x1f44d;、收藏?、分享&#x1f4e4;&#xff0c;共創活力社區。 在 Linux 系統編程中&#xff0c;動靜態庫是重要的組成部分&#xff0…

06-公寓租賃項目-后臺管理-公寓管理篇

尚庭公寓項目/公寓管理模塊 https://www.yuque.com/pkqzyh/qg2yge/5ba67653b51379d18df61b9c14c3e946 一、屬性管理 屬性管理頁面包含公寓和房間各種可選的屬性信息&#xff0c;其中包括房間的可選支付方式、房間的可選租期、房間的配套、公寓的配套等等。其所需接口如下 1.1…

Links for llama-cpp-python whl安裝包下載地址

Links for llama-cpp-python whl安裝包下載地址 Links for llama-cpp-python whl安裝包下載地址 https://github.com/abetlen/llama-cpp-python/releases

為境外組織提供企業商業秘密犯法嗎?

企業商業秘密百問百答之九十六&#xff1a;為境外組織提供企業商業秘密犯法嗎&#xff1f; 在日常的對外交流中&#xff0c;企業若暗中為境外的機構、組織或人員竊取、刺探、收買或非法提供商業秘密&#xff0c;這種行為嚴重侵犯了商業秘密權利人的合法權益&#xff0c;更深遠…

grep 命令詳解(通俗版)

1. 基礎概念 grep 是 Linux 下的文本搜索工具&#xff0c;核心功能是從文件或輸入流中篩選出包含指定關鍵詞的行。 它像“文本界的搜索引擎”&#xff0c;能快速定位關鍵信息&#xff0c;特別適合日志分析、代碼排查等場景。 2. 基礎語法 grep [選項] "搜索詞" 文件…

JSVMP逆向實戰:原理分析與破解思路詳解

引言 在當今Web安全領域&#xff0c;JavaScript虛擬機保護&#xff08;JSVMP&#xff09;技術被廣泛應用于前端代碼的保護和反爬機制中。作為前端逆向工程師&#xff0c;掌握JSVMP逆向技術已成為必備技能。本文將深入剖析JSVMP的工作原理&#xff0c;并分享實用的逆向破解思路…

【youcans論文精讀】弱監督深度檢測網絡(Weakly Supervised Deep Detection Networks)

歡迎關注『youcans論文精讀』系列 本專欄內容和資源同步到 GitHub/youcans 【youcans論文精讀】弱監督深度檢測網絡 WSDDN 0. 弱監督檢測的開山之作0.1 論文簡介0.2 WSDNN 的步驟0.3 摘要 1. 引言2. 相關工作3. 方法3.1 預訓練網絡3.2 弱監督深度檢測網絡3.3 WSDDN訓練3.4 空間…

基于Contiue來閱讀open-r1中的GRPO訓練代碼

原創 快樂王子HP 快樂王子AI說 2025年04月03日 23:54 廣東 前面安裝了vscode[1]同時也安裝了Coninue的相關插件[2]&#xff0c;現在想用它們來閱讀一下open-r1項目的代碼[3]。 首先&#xff0c;從啟動訓練開始(以GRPO為例子&#xff09; 第一步&#xff0c;使用TRL的vLLM后端…

JVM深入原理(六)(二):雙親委派機制

目錄 6.5. 類加載器-雙親委派機制 6.5.1. 雙親委派機制-作用 6.5.2. 雙親委派機制-工作流程 6.5.3. 雙親委派機制-父加載器 6.5.4. 雙親委派機制-面試題 6.5.5. 雙親委派機制-代碼主動加載一個類 6.6. 類加載器-打破雙親委派機制 6.6.1. 打破委派-ClassLoader原理 6.6.…

Linux 文件系統超詳解

一.磁盤 磁盤是計算機的主要存儲介質&#xff0c;它可以存儲大量二進制數據&#xff0c;即使斷電后也可以保證數據不會丟失。下面我們將了解磁盤的物理結構、存儲結構以及邏輯結構。 磁盤的存儲結構 1. 磁盤尋址的時候&#xff0c;基本單位既不是bit也不是byte&#xff0c;而…

2025年大模型與Transformer架構:重塑AI未來的科技革命

引言&#xff1a;一場關于智能的革命 想象一下&#xff0c;當你向一個虛擬助手提問時&#xff0c;它不僅能夠準確理解你的需求&#xff0c;還能生成一段流暢且富有邏輯的回答&#xff1b;或者當你上傳一張模糊的照片時&#xff0c;系統可以快速修復并生成高清版本——這一切的…

GO語言學習(16)Gin后端框架

目錄 ??前言 1.什么是前端&#xff1f;什么是后端&#xff1f;&#x1f300; 2.Gin框架介紹 &#x1f337; 3.Gin框架的基本使用 -Hello&#xff0c;World例子&#x1f337; &#x1f33f;入門示例 - Hello&#xff0c;World &#x1f4bb;補充&#xff08;一些常用的網…

深入解析 Git Submodule:從基礎到高級操作指南

深入解析 Git Submodule&#xff1a;從基礎到高級操作指南 一、Git Submodule 是什么&#xff1f; git submodule 是 Git 提供的一個強大功能&#xff0c;允許在一個 Git 倉庫&#xff08;主倉庫&#xff09;中嵌入另一個獨立的 Git 倉庫&#xff08;子模塊&#xff09;。主倉…