dsl-vm-reverse
Permite que seu agente analise sistemas que usam linguagens personalizadas. Ele pode entender como esses sistemas interpretam comandos e como o código é executado.
O que ela faz
Esta ferramenta ajuda a entender códigos JavaScript que se parecem com máquinas virtuais personalizadas. Ela analisa como esses códigos interpretam suas próprias instruções, como se fosse um tradutor para um idioma desconhecido.
Quando usar
- ✓Quando você encontra um código JavaScript que parece complicado e não é um programa normal.
- ✓Ao tentar entender como um sistema de segurança (controle de risco) funciona internamente.
- ✓Para desvendar códigos que usam um sistema de 'comandos' próprio em vez de JavaScript padrão.
Exemplo do que pedir para a IA
“Analise este código JavaScript para me dizer como ele executa suas próprias instruções internas.”
Quer saber mais? Abra as seções abaixo.
Como usar
O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.
Link da skill
Mensagem pronta para colar
Como funciona
A ferramenta procura padrões específicos em códigos JavaScript, como estruturas de 'case' ou o uso de muitas variáveis curtas. Ela então tenta mapear essas instruções para entender o fluxo do programa.
Instalação
Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.
No terminal (Claude Code, Codex, Cursor), na pasta do projeto:
npx skills add zhaoxuya520/reverse-skill --skill dsl-vm-reverseOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/zhaoxuya520/reverse-skill/main/skills/reverse-engineering/dsl-vm-reverse/SKILL.md -o SKILL.mdConteúdo técnico (SKILL.md)
Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.
🔄 Engenharia Reversa de Máquina Virtual Personalizada DSL (DSL VM Reverse Engineering)
AÇÃO NECESSÁRIA (Execute imediatamente após a leitura)
NOW: Confirme que a tarefa atual é uma VM de opcode JS personalizada / motor de controle de risco, não WASM padrão ou webpack comumNOW:case-initaté quescope.mdesteja pronto; amostras offline useoffline/labACT: Classifique os arquivos da Fase 1 do "Fluxo de Trabalho de Engenharia Reversa Geral", não pare no diretório
Usado para engenharia reversa de máquinas virtuais personalizadas implementadas em JavaScript / motores de controle de risco
Índice
- 1. Escopo de Aplicação
- 2. Características de Identificação de VM DSL
- 3. Fluxo de Trabalho de Engenharia Reversa Geral
- 4. Extração e Classificação de Opcode
- 5. Esquema de Captura em Tempo de Execução
- 6. Códigos de Status Comuns
- 7. Lista de Verificação de Auto-verificação de Habilidade
1. Escopo de Aplicação
Use esta habilidade quando o arquivo de destino atender a qualquer uma das seguintes características:
| # | Característica | Descrição |
|---|---|---|
| 1 | Início IIFE + muitos nomes de variáveis de uma letra | !function(){var U=void 0,y=parseInt,E0=Function,...} |
| 2 | Contém DG() ou função semelhante com loop switch-case |
Loop principal do interpretador, d[7]&31 decodifica o opcode |
| 3 | Arquivo grande (500KB+) mas com < 1% de bytes zero | Não é WASM padrão, JS puro |
| 4 | Contém referências à tabela de constantes C[number] |
Tabela de funções / tabela de strings C[9][xxx] |
| 5 | Código compactado em uma única linha | 583KB em uma linha, nomes de variáveis ofuscados |
Regras de Exclusão
| Condição | Não é esta habilidade | Ir para |
|---|---|---|
O arquivo começa com \x00asm |
Binário WASM padrão | reverse-engineering/languages.md |
O arquivo começa com Uint8Array([0,97,115,109]) contendo a palavra mágica WASM |
WASM embarcado | Extrair .wasm e ir para IDA/Ghidra |
Empacotamento Webpack padrão (function(e,t,n){...}) |
JS comum | js-reverse/ |
| Porcentagem de bytes zero > 20% | Binário WASM | reverse-engineering/languages.md |
2. Características de Identificação de VM DSL
Características do Código
// 特征 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+)
Formato de Codificação de Opcode
Cada instrução é codificada como um inteiro de 32 bits:
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. Fluxo de Trabalho de Engenharia Reversa Geral
Fase 1: Classificação de Arquivos (5 minutos)
# 检查是否为 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
Fase 2: Extração da Tabela de Mapeamento de Variáveis (10 minutos)
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})")
Fase 3: Extração e Classificação de Opcode (15 minutos)
# 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}")
Fase 4: Análise da Tabela de Constantes (30 minutos)
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}")
Fase 5: Rastreamento de Funções Exportadas (1-2 horas)
…
Perguntas frequentes
O que é uma 'máquina virtual personalizada' em JavaScript?
É um código JavaScript que foi escrito para se comportar como um computador menor dentro do seu navegador, executando um conjunto específico de 'comandos' que ele mesmo define, em vez de usar os comandos normais do JavaScript.
O que são 'IIFE' e 'switch-based opcode dispatchers'?
IIFE é uma forma de executar um código JavaScript imediatamente. 'Switch-based opcode dispatchers' são como um grande menu (switch) que decide qual ação (opcode) executar com base em um código numérico.
Por que o código parece ter variáveis com uma única letra?
Isso é uma técnica de ofuscação (tornar o código difícil de ler) usada para proteger o código ou dificultar a engenharia reversa. A ferramenta tenta decifrar essas variáveis.
Detalhes
Descrição original do autor
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.
Popularidade
- Estrelas no GitHub
- 42 mil
- Posição no ranking
- #4785
- Licença
- MIT
- Atualizada em
- 22/09/2026
Comentários
- …
Mais skills deste repositório
competition-ad-certificate-abuse
Ajuda seu agente a analisar ataques a sistemas de certificados digitais. Ele investiga como certificados podem ser usados indevidamente para obter acesso.
zhaoxuya520/reverse-skill
competition-agent-cloud
Faz seu agente analisar desafios de segurança em sistemas de IA e nuvem. Ele investiga como prompts, ferramentas e a nuvem podem ser explorados.
zhaoxuya520/reverse-skill
competition-android-hooking
Ajuda seu agente a investigar aplicativos Android. Ele analisa como os aplicativos funcionam internamente e como podem ser modificados ou explorados.
zhaoxuya520/reverse-skill
competition-browser-persistence
Faz seu agente analisar como sites guardam informações no seu navegador. Ele investiga cookies e outros dados para entender como as sessões funcionam.
zhaoxuya520/reverse-skill
Skills parecidas
benchmark-optimization-loop
Faz seu agente melhorar a velocidade de algo de forma medida. Ele testa várias versões e escolhe a mais rápida que ainda funciona corretamente.
affaan-m/ECC
change-impact
Ajuda seu agente a analisar o impacto de mudanças no código antes de fazê-las. Ele compara o planejado com o real depois, cobrindo caminhos, dados, testes e documentação. É útil para mudanças arriscadas ou que afetam várias partes do sistema.
affaan-m/ECC
click-path-audit
Faz seu agente rastrear todos os botões e interações do usuário para achar bugs. Ele encontra problemas onde funções parecem funcionar sozinhas, mas falham juntas. Útil quando bugs persistem mesmo após depuração.
affaan-m/ECC