Pular para o conteúdo
Skillpedia
Segurança48 mil · #4016

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

https://github.com/sickn33/agentic-awesome-skills/blob/main/plugins/agentic-awesome-skills-claude/skills/reverse-engineering/dsl-vm-reverse/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/sickn33/agentic-awesome-skills/blob/main/plugins/agentic-awesome-skills-claude/skills/reverse-engineering/dsl-vm-reverse/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
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-reverse

Ou 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.md
Conteú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

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.

repo: sickn33/agentic-awesome-skills

Popularidade

Estrelas no GitHub
48 mil
Posição no ranking
#4016
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas