dsl-vm-reverse
Faz seu agente analisar sistemas que usam JavaScript para criar linguagens próprias. Ele identifica como o código funciona internamente e extrai informações importantes.
O que ela faz
Esta ferramenta ajuda a entender códigos JavaScript complexos que foram disfarçados para proteger informações. Ela analisa o código para descobrir como ele funciona internamente, como se fosse um tradutor para códigos difíceis.
Quando usar
- ✓Quando um site usa um sistema interno para verificar se você não é um robô.
- ✓Para entender como um código JavaScript personalizado executa suas instruções.
- ✓Ao tentar recuperar a lógica de um programa JavaScript ofuscado.
Exemplo do que pedir para a IA
“Analise este código JavaScript e me diga o que ele faz:”
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 por padrões específicos no código JavaScript, como estruturas de 'switch' ou funções auto-executáveis, que são comuns em sistemas de proteção. Ela então tenta extrair as instruções e entender a lógica por trás delas.
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 sickn33/agentic-awesome-skills --skill dsl-vm-reverseOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/sickn33/agentic-awesome-skills/main/plugins/agentic-awesome-skills-claude/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)
Quando Usar
- Um ativo web protegido executa uma VM de bytecode personalizada (mecanismos de controle de risco/captcha).
- Recuperando semânticas de opcode de um loop de interpretador JS.
Sumário
- 1. Escopo de Aplicação
- 2. Características de Identificação de VM DSL
- 3. Fluxo de Trabalho Geral de Engenharia Reversa
- 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 Habilidades
1. Escopo de Aplicação
Use esta habilidade quando o arquivo alvo atender a qualquer uma das seguintes características:
| # | Característica | Descrição |
|---|---|---|
| 1 | Início IIFE + Nomes de variáveis de uma letra em grande quantidade | !function(){var U=void 0,y=parseInt,E0=Function,...} |
| 2 | Contém DG() ou função similar 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 a tabelas 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 |
|---|---|---|
Arquivo começa com \x00asm |
Binário WASM padrão | reverse-engineering/languages.md |
Arquivo começa com Uint8Array([0,97,115,109]) contendo palavra mágica WASM |
WASM embutido | Extrair .wasm e ir para IDA/Ghidra |
Empacotamento Webpack padrão (function(e,t,n){...}) |
JS comum | js-reverse/ |
| Mais de 20% de bytes zero | 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 Geral de Engenharia Reversa
Fase 1: Classificação de Arquivo (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)
Funções exportadas (como getToken) são localizadas pelos seguintes caminhos:
1. Encontrar AWSCInner.register() ou chamadas de registro similares
2. Determinar o módulo registrado e a função de fábrica
3. Encontrar o objeto retornado pela função de fábrica → Local da definição da função exportada
…
Perguntas frequentes
O que é um 'DSL VM'?
É um 'intérprete' de linguagem customizada, como se fosse um pequeno programa dentro de outro programa que entende um conjunto específico de comandos (bytecode) para realizar tarefas, muitas vezes para segurança.
O que são 'opcodes'?
São os 'códigos de operação', os comandos básicos que a 'máquina virtual' (o intérprete) entende e executa. Pense neles como as palavras de um vocabulário muito pequeno e específico.
Por que o código JavaScript é disfarçado?
Geralmente para dificultar que outras pessoas copiem a tecnologia, entendam os segredos do negócio ou criem trapaças em jogos e sistemas de segurança.
Detalhes
Descrição original do autor
Reverse JavaScript-based custom DSL/VM interpreters and risk-control engines: identify IIFE/switch-based opcode dispatch, extract opcode tables, and capture runtime semantics.
Popularidade
- Estrelas no GitHub
- 48 mil
- Posição no ranking
- #4016
- Licença
- MIT
- Atualizada em
- 15/10/2026
Comentários
- …
Mais skills deste repositório
00-andruia-consultant
Ajuda seu agente a iniciar ou melhorar projetos de IA. Ele analisa código, sugere ferramentas e cria planos de ação em espanhol.
sickn33/agentic-awesome-skills
007
Faz seu agente realizar auditorias de segurança e modelagem de ameaças. É útil para proteger projetos contra ataques e vulnerabilidades.
sickn33/agentic-awesome-skills
10-andruia-skill-smith
Ajuda seu agente a criar ou melhorar ferramentas de IA. Ele define como as ferramentas funcionam, escreve a documentação e valida a estrutura.
sickn33/agentic-awesome-skills
20-andruia-niche-intelligence
Faz seu agente criar um resumo sobre um setor específico. É útil para entender o contexto, regras, padrões de uso e riscos de um projeto, usando fontes confiáveis.
sickn33/agentic-awesome-skills
Skills parecidas
django-security
Ajuda seu agente a implementar práticas de segurança em aplicações Django. Ele foca em autenticação, autorização e prevenção contra ataques comuns, garantindo um código mais seguro.
affaan-m/ECC
laravel-security
Ajuda seu agente a proteger aplicações Laravel contra ameaças. Implementa práticas de segurança para autenticação, autorização e prevenção de ataques comuns.
affaan-m/ECC
module-regression
Ajuda seu agente a gerenciar mudanças em projetos grandes. Garante que alterações em uma parte do código não quebrem outras partes.
affaan-m/ECC