Pular para o conteúdo
Skillpedia
Código em geral42 mil · #4785

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

https://github.com/zhaoxuya520/reverse-skill/blob/main/skills/reverse-engineering/dsl-vm-reverse/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/zhaoxuya520/reverse-skill/blob/main/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 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-reverse

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/zhaoxuya520/reverse-skill/main/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)

AÇÃO NECESSÁRIA (Execute imediatamente após a leitura)

  1. NOW: Confirme que a tarefa atual é uma VM de opcode JS personalizada / motor de controle de risco, não WASM padrão ou webpack comum
  2. NOW: case-init até que scope.md esteja pronto; amostras offline use offline / lab
  3. ACT: 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

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.

repo: zhaoxuya520/reverse-skill

Popularidade

Estrelas no GitHub
42 mil
Posição no ranking
#4785
Licença
MIT
Atualizada em
22/09/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas