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

引言

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

什么是JSVMP?

JSVMP(JavaScript Virtual Machine Protection)是一種通過自定義虛擬機執行JavaScript代碼的保護技術。它將原始JavaScript代碼編譯為自定義的字節碼,然后通過解釋器執行,從而:

  1. 隱藏原始業務邏輯

  2. 增加逆向分析難度

  3. 防止直接調試和Hook

JSVMP的核心組成

1. 字節碼編譯器

將原始JS代碼轉換為自定義字節碼序列:

// 原始JS
function add(a, b) {return a + b;
}// 編譯后字節碼可能類似
[0x01, 0x02, 0x03, 0x04, ...]

2. 虛擬機解釋器

解釋執行自定義字節碼的虛擬機核心:

function VM(bytecode) {this.pc = 0; // 程序計數器this.stack = []; // 操作數棧this.registers = {}; // 寄存器this.run = function() {while(this.pc < bytecode.length) {const opcode = bytecode[this.pc++];this.execute(opcode);}}this.execute = function(opcode) {switch(opcode) {case 0x01: // PUSHthis.stack.push(bytecode[this.pc++]);break;case 0x02: // ADDconst a = this.stack.pop();const b = this.stack.pop();this.stack.push(a + b);break;// ...其他操作碼}}
}

3. 運行時環境

提供與原生JavaScript環境的交互接口:

const runtime = {getCookie: function(name) {// 獲取cookie的實現},sendRequest: function(url, data) {// 發送請求的實現}// ...其他運行時方法
};

JSVMP逆向分析步驟

1. 識別JSVMP結構

通過特征識別目標是否使用JSVMP:

  • 存在大量switch-case結構

  • 有明顯的字節碼序列

  • 代碼包含解釋執行循環

  • 使用evalFunction動態執行

2. 定位關鍵入口

尋找字節碼加載和解釋器初始化的位置:

// 常見初始化模式
const bytecode = [0x01, 0x02, ...];
const vm = new VM(bytecode);
vm.run();

3. 分析字節碼結構

確定字節碼的編碼方式和指令集:

操作碼指令描述
0x01PUSH壓棧
0x02ADD加法
0x03CALL調用函數
.........

4. 動態調試技巧

使用Chrome DevTools進行動態分析:

// 在關鍵位置插入調試語句
console.log("PC:", vm.pc, "Opcode:", opcode, "Stack:", vm.stack);// 或使用debugger語句
if(vm.pc === targetPC) debugger;

實戰破解案例

案例1:某網站加密參數分析

目標:破解_signature參數生成算法

步驟

  1. 通過XHR斷點定位加密位置

  2. 回溯調用棧找到VM入口

  3. 分析字節碼中的加密邏輯

  4. 提取關鍵操作模擬執行

// 還原后的加密邏輯
function generateSign(params) {const vm = new VM(encryptBytecode);vm.registers.input = JSON.stringify(params);vm.run();return vm.stack.pop();
}

案例2:某JSVMP反爬破解

挑戰

  • 動態變化的操作碼映射表

  • 自修改字節碼

  • 反調試檢測

解決方案

  1. 使用Object.definePropertyHook關鍵函數

  2. 記錄操作碼執行軌跡

  3. 構建操作碼到原始JS的映射關系

// Hook示例
const originalRun = VM.prototype.run;
VM.prototype.run = function() {console.log("VM started with bytecode:", this.bytecode);return originalRun.apply(this, arguments);
};

高級逆向技術

1. 符號執行分析

通過符號執行還原原始邏輯:

# 使用PyExZ3等符號執行工具
from pyexz3 import *def analyze_bytecode(bytecode):vm = VM(bytecode)vm.run()return vm.stack

2. 字節碼反編譯

將字節碼轉換回高級JavaScript代碼:

function decompile(bytecode) {let jsCode = "";for(let i = 0; i < bytecode.length; ) {const opcode = bytecode[i++];switch(opcode) {case 0x01: jsCode += `stack.push(${bytecode[i++]});\n`;break;// 其他操作碼轉換...}}return jsCode;
}

3. 內存快照分析

通過內存dump獲取運行時信息:

// 獲取VM內存狀態
function dumpVM(vm) {return {pc: vm.pc,stack: [...vm.stack],registers: {...vm.registers}};
}

反反爬對策

應對JSVMP的反逆向措施:

反爬技術破解方法
代碼混淆AST分析
環境檢測純凈環境
動態加載請求攔截
定時檢測斷點繞過

工具推薦

  1. 靜態分析工具

    • AST Explorer

    • Babel Parser

    • WebStorm

  2. 動態調試工具

    • Chrome DevTools

    • Fiddler

    • Charles

  3. 專用逆向工具

    • WasmDec

    • JEB JavaScript

    • Node.js VM

學習資源

  1. 《JavaScript高級程序設計》- VM實現章節

  2. Chrome V8引擎源碼

  3. WebAssembly虛擬機規范

  4. Babel插件開發手冊

結語

JSVMP逆向是一個需要耐心和技術積累的過程。通過本文介紹的方法論和實戰案例,相信讀者已經對JSVMP逆向有了系統性的認識。記住,逆向工程的本質是與開發者的智力博弈,保持學習和技術更新才是制勝關鍵。

重要聲明:本文所有技術僅限學習交流,請勿用于非法用途。實際逆向操作前請確保已獲得相關授權。

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

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

相關文章

【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;。主倉…

電子電氣架構 --- EEA演進與芯片架構轉移

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 周末洗了一個澡,換了一身衣服,出了門卻不知道去哪兒,不知道去找誰,漫無目的走著,大概這就是成年人最深的孤獨吧! 舊人不知我近況,新人不知我過…

如何用deepseek生成流程圖

軟件準備&#xff1a; 在線流程圖【Flowchart Maker & Online Diagram Software】或【process on】 步驟&#xff1a; 1、用 【DeepSeek】生成 結構化內容&#xff08;Mermaid文件&#xff09; 1.1、向deepseek輸入指令&#xff1a;【幫我用mermaind寫出“某某”的具體…

【華為OD技術面試真題 - 技術面】- Java面試題(17)

華為OD面試真題精選 專欄:華為OD面試真題精選 目錄: 2024華為OD面試手撕代碼真題目錄以及八股文真題目錄 文章目錄 華為OD面試真題精選虛擬機分區1. **虛擬磁盤分區**2. **虛擬機的內存分區**3. **CPU分配**4. **虛擬網絡分區**5. **存儲虛擬化和分區**6. **虛擬機分區管理**…

Linux | I.MX6ULL內核及文件系統源碼結構(7)

01 類型 描述 備注 ARM 交叉編譯器 版本&#xff1a;4.9.4 提供軟件工具 Uboot 版本&#xff1a;2016.03 提供源碼 支持LCD顯示&#xff1b;支持網口&#xff1b; 支持 EMMC,NAND FLASH&#xff1b; 支持環境變量修改保存 Linux 內核 版本&#xff1a;4.1.15 提供…

0基礎入門scrapy 框架,獲取豆瓣top250存入mysql

一、基礎教程 創建項目命令 scrapy startproject mySpider --項目名稱 創建爬蟲文件 scrapy genspider itcast "itcast.cn" --自動生成 itcast.py 文件 爬蟲名稱 爬蟲網址 運行爬蟲 scrapy crawl baidu(爬蟲名&#xff09; 使用終端運行太麻煩了&#xff0c;而且…

鴻蒙NEXT小游戲開發:猜小球

1. 引言 “猜小球”是一個經典的益智游戲&#xff0c;通常由一名表演者和多名參與者共同完成。表演者會將一個小球放在一個杯子下面&#xff0c;然后將三個杯子快速地交換位置&#xff0c;參與者則需要猜出最終哪個杯子下面有小球。本文將介紹如何使用HarmonyOS NEXT技術&…

網絡購物謹慎使用手機免密支付功能

在數字經濟蓬勃發展的當下&#xff0c;“免密支付”成為許多人消費時的首選支付方式。 “免密支付”的存在有其合理性。在快節奏的現代生活中&#xff0c;時間愈發珍貴&#xff0c;每節省一秒都可能帶來更高的效率。以日常通勤為例&#xff0c;上班族乘坐交通工具時&#xff0c…

記錄 | Android getWindow().getDecorView().setSystemUiVisibility(...)設置狀態欄屬性

純純的一邊開發一邊學習&#xff0c;是小白是菜鳥&#xff0c;單純的記錄和學習&#xff0c;大神勿噴&#xff0c;理解有錯望指正&#xff5e; getWindow().getDecorView().setSystemUiVisibility(…) 該方法用于控制系統 UI&#xff08;如狀態欄、導航欄&#xff09;的可見性…

java虛擬機---JVM

JVM JVM&#xff0c;也就是 Java 虛擬機&#xff0c;它最主要的作用就是對編譯后的 Java 字節碼文件逐行解釋&#xff0c;翻譯成機器碼指令&#xff0c;并交給對應的操作系統去執行。 JVM 的其他特性有&#xff1a; JVM 可以自動管理內存&#xff0c;通過垃圾回收器回收不再…

VectorBT:使用PyTorch+LSTM訓練和回測股票模型 進階四

VectorBT&#xff1a;使用PyTorchLSTM訓練和回測股票模型 進階四 本方案融合 LSTM 時序預測與動態風險控制。系統采用混合架構&#xff0c;離線訓練構建多尺度特征工程和雙均線策略&#xff0c;結合在線增量更新持續優化模型。技術要點包括三層特征篩選、波動率動態倉位管理、混…

前端中rem,vh,vw

1. rem&#xff08;Root EM&#xff09; 參照對象 基準&#xff1a;相對于 根元素&#xff08;<html>&#xff09;的 font-size 計算。 默認情況下&#xff0c;瀏覽器的根 font-size 為 16px&#xff08;即 1rem 16px&#xff09;&#xff0c;但可通過 CSS 修改&#…

詳解 MySQL 常見的存儲引擎及它們之間的區別

MySQL 支持多種存儲引擎&#xff0c;每種引擎針對不同的應用場景提供了特定的特性和優化。下面是幾種常見的存儲引擎以及它們之間的主要區別&#xff1a; 常見存儲引擎 1. InnoDB&#xff08;重點&#xff09; 事務支持&#xff1a; 完全支持 ACID 事務&#xff0c;確保數據一…

html+css+js 實現一個貪吃蛇小游戲

目錄 游戲簡介 游戲功能與特點 如何玩轉貪吃蛇 游戲設計與實現 HTML結構 JavaScript核心實現 代碼結構&#xff1a; 效果 關于“其他游戲” 游戲簡介 貪吃蛇是一款經典的單人小游戲&#xff0c;玩家通過控制蛇的移動&#xff0c;吃掉食物來增加長度&#xff0c;避免撞…