dsl-vm-reverse
Allows your agent to analyze systems that use custom languages. It can understand how these systems interpret commands and how code is executed.
What it does
This tool helps understand JavaScript code that looks like custom virtual machines. It analyzes how these codes interpret their own instructions, acting like a translator for an unknown language.
When to use it
- ✓When you encounter JavaScript code that seems complex and isn't a normal program.
- ✓When trying to understand how an internal security system (risk control) works.
- ✓To unravel code that uses its own set of 'commands' instead of standard JavaScript.
Example of what to ask your AI
“Analyze this JavaScript code and tell me how it executes its own internal instructions.”
Want more? Open the sections below.
How to use
The easiest way: copy the message below and paste it into Claude, ChatGPT, Cursor or any AI. It reads the skill and follows the instructions.
Skill link
Ready-to-paste message
How it works
The tool looks for specific patterns in JavaScript code, like 'case' structures or the use of many short variables. It then tries to map these instructions to understand the program's flow.
Installation
Easiest way: copy the skill link and paste it into Claude, ChatGPT or Cursor asking it to follow the instructions.
In the terminal (Claude Code, Codex, Cursor), in your project folder:
npx skills add zhaoxuya520/reverse-skill --skill dsl-vm-reverseOr download just the file:
curl -L https://raw.githubusercontent.com/zhaoxuya520/reverse-skill/main/skills/reverse-engineering/dsl-vm-reverse/SKILL.md -o SKILL.mdTechnical content (original SKILL.md)
Original text by the author, straight from GitHub.
🔄 DSL 自定义虚拟机逆向(DSL VM Reverse Engineering)
ACTION REQUIRED(读完后立刻执行)
NOW: 确认当前任务是自定义 JS opcode VM / 风控引擎,不是标准 WASM 或普通 webpackNOW:case-init直到scope.md就绪;离线样本用offline/labACT: 从「3. 通用逆向工作流」Phase 1 做文件分类,不要停在目录
用于逆向基于 JavaScript 实现的自定义 WASM 虚拟机/风控引擎
目录
1. 适用范围
当目标文件符合以下 任意特征 时使用本 skill:
| # | 特征 | 说明 |
|---|---|---|
| 1 | IIFE 开头 + 大量单字母变量名 | !function(){var U=void 0,y=parseInt,E0=Function,...} |
| 2 | 包含 DG() 或类似函数含 switch-case 循环 |
解释器主循环,d[7]&31 解码 opcode |
| 3 | 大文件(500KB+)但零字节占比 < 1% | 非标准 WASM,纯 JS |
| 4 | 包含 C[number] 常量表引用 |
C[9][xxx] 函数表/字符串表 |
| 5 | 单行压缩代码 | 583KB 单行,混淆变量名 |
排除规则
| 条件 | 非本 skill | 转至 |
|---|---|---|
文件以 \x00asm 开头 |
标准 WASM 二进制 | reverse-engineering/languages.md |
文件以 Uint8Array([0,97,115,109]) 含 WASM 魔术字 |
WASM 嵌入式 | 提取 .wasm 后转 IDA/Ghidra |
标准 Webpack 打包(function(e,t,n){...}) |
普通 JS | js-reverse/ |
| 零字节占比 > 20% | WASM 二进制 | reverse-engineering/languages.md |
2. DSL VM 识别特征
代码特征
// 特征 1: IIFE 入口,单字母变量映射数字常量
!function(){
var U=void 0, y=parseInt, E0=Function, AN=Uint8Array;
var E=15, l=10, m=12, x=16, S=13, $=11;
// 数字常量映射为变量名,替代原始数字
...
}
// 特征 2: 解释器主循环 DG()
function DG(C, d, ...) {
var d = []; // 数组模拟 WASM stack/locals
for (d[7] = x; d[7] !== U;) {
var aE = d[7] & 31; // 低 5 位 = opcode
var O = d[7] >> 5 & 31; // 高 5 位 = sub-operation
switch (aE) {
case 0: /* ... */ d[7] = 612; break;
case 1: /* ... */
// ... N 个 case
}
}
}
// 特征 3: 常量表 C[9] 存储函数索引和字符串
// C[9][0] = ["pc"] → 函数参数描述
// C[9][667] = "string" → 字符串常量
// C[9][x] = number → 函数索引
// 特征 4: W(C[index], null, ...) 调用模式
// W = Function.prototype.call.bind(call)
// 所有内置函数通过 C[index] 索引调用
// 特征 5: 指令编码格式
// d[7] = opcode(bit 0-4) | subop(bit 5-9) | operand(bit 10+)
Opcode 编码格式
每条指令编码为 32 位整数:
bit 0-4: opcode (0-N)
bit 5-9: sub-operation (0-31)
bit 10-31: operand/立即数
解码:
aE = d[7] & 31 → opcode
O = d[7] >> 5 & 31 → sub-operation
d[other] = d[7] >> 10 → operand
3. 通用逆向工作流
Phase 1: 文件分类(5 分钟)
# 检查是否为 DSL VM
python3 << 'EOF'
with open('target.js', 'rb') as f:
head = f.read(100)
# 1. 检查 WASM 魔术字
if head[:4] == b'\x00asm':
print("标准 WASM 二进制")
exit()
# 2. 检查零字节占比
data = open('target.js', 'rb').read()
zero_pct = data.count(b'\x00') / len(data) * 100
print(f"零字节占比: {zero_pct:.1f}%")
if zero_pct > 20:
print("WASM 二进制")
elif head[:2] == b'!f':
# 检查单字母变量模式
if b'var U=void 0' in head or b'U=void 0,y=parseInt' in head:
print("→ DSL VM!")
else:
print("普通 JS IIFE")
EOF
Phase 2: 变量映射表提取(10 分钟)
import re
with open('target.js', 'r', errors='replace') as f:
s = f.read()
# 提取开头 2000 字符的 var X=数字 映射
mappings = re.findall(r'var\s+(\w+)\s*=\s*(\d+)', s[:2000])
print('常量映射:')
for name, val in mappings:
print(f" {name:4s} = {val:3d} (0x{int(val):02x})")
Phase 3: Opcode 提取与分类(15 分钟)
# 1. 提取所有 case
all_cases = re.findall(r'case\s+(\d+):', s)
unique = sorted(set(int(c) for c in all_cases))
print(f"总 case: {len(all_cases)} 个")
print(f"唯一 opcode: {len(unique)} 个: {unique}")
# 2. 分类每个 opcode
for op in unique:
idx = s.find(f'case {op}:')
snippet = s[idx:idx+200]
if 'd[7]=' in snippet:
op_type = 'BRANCH'
elif 'return' in snippet:
op_type = 'RETURN'
elif 'W(C[' in snippet:
op_type = 'CALL'
elif 'new' in snippet:
op_type = 'ALLOC'
elif 'try' in snippet or 'catch' in snippet:
op_type = 'EXCEPTION'
else:
op_type = 'ARITH/STORE'
print(f" opcode {op:2d}: {op_type}")
Phase 4: 常量表分析(30 分钟)
const_refs = re.findall(r'C\[9\]\[(\d+)\]', s)
unique_refs = sorted(set(int(x) for x in const_refs))
print(f"C[9] 引用: {len(unique_refs)} 个索引")
print(f"范围: {min(unique_refs)} - {max(unique_refs)}")
# 对每个引用分析上下文
for ref in unique_refs[:20]:
idx = s.find(f'C[9][{ref}]')
ctx = s[max(0,idx-50):idx+80]
clean = ''.join(c if c.isprintable() else ' ' for c in ctx)
print(f" C[9][{ref}] → {clean}")
Phase 5: 导出函数追踪(1-2 小时)
…
FAQ
What is a 'custom virtual machine' in JavaScript?
It's JavaScript code written to act like a small computer within your browser, executing a specific set of 'commands' it defines itself, rather than using standard JavaScript commands.
What are 'IIFE' and 'switch-based opcode dispatchers'?
IIFE is a way to immediately execute JavaScript code. 'Switch-based opcode dispatchers' are like a large menu (switch) that decides which action (opcode) to perform based on a numerical code.
Why does the code seem to have single-letter variables?
This is an obfuscation technique (making code hard to read) used to protect code or hinder reverse engineering. The tool attempts to decipher these variables.
Details
Original description by the author
Reverse JavaScript-based custom DSL/VM interpreters, non-standard WASM-like runtimes, and risk-control engines. Use when analyzing IIFE or switch-based opcode dispatchers, extracting instruction tables, recovering bytecode semantics, capturing VM state at runtime, or reconstructing execution flow.
Popularity
- GitHub stars
- 42k
- Ranking position
- #4785
- License
- MIT
- Updated
- 9/22/2026
Comments
- …
More skills from this repository
competition-ad-certificate-abuse
Helps your agent analyze attacks on digital certificate systems. It investigates how certificates can be misused to gain access.
zhaoxuya520/reverse-skill
competition-agent-cloud
Helps your agent analyze security challenges in AI and cloud systems. It investigates how prompts, tools, and the cloud can be exploited.
zhaoxuya520/reverse-skill
competition-android-hooking
Helps your agent investigate Android applications. It analyzes how apps work internally and how they might be modified or exploited.
zhaoxuya520/reverse-skill
competition-browser-persistence
Helps your agent analyze how websites store information in your browser. It investigates cookies and other data to understand how sessions work.
zhaoxuya520/reverse-skill
Similar skills
benchmark-optimization-loop
Has your agent improve something's speed in a measured way. It tests multiple versions and chooses the fastest one that still works correctly.
affaan-m/ECC
change-impact
Helps your agent analyze the impact of code changes before making them. It compares the planned vs. actual results afterward, covering paths, data, tests, and documentation. Useful for risky or system-wide changes.
affaan-m/ECC
click-path-audit
Lets your agent trace all user buttons and interactions to find bugs. It finds issues where functions seem to work alone but fail together. Useful when bugs persist even after debugging.
affaan-m/ECC