
Descompila bytecode V8 serializado (arquivos JSC) em código legível de alto nível semelhante a JavaScript, com suporte para múltiplas versões do V8, saída em árvore e nomenclatura determinística de funções para análise de malware.
View8 é uma ferramenta de análise estática projetada para descompilar objetos de bytecode V8 serializados (arquivos JSC) em código legível de alto nível. Para analisar e desmontar esses objetos serializados, o View8 utiliza um binário V8 compilado com patch. Como resultado, o View8 produz uma saída textual semelhante a JavaScript.
9.4.146.24 (usada no Node V16.x)10.2.154.26 (usada no Node V18.x)11.3.244.8 (usada no Node V20.x)Para versões compiladas, visite a página de lançamentos.
--inp, -i: O nome do arquivo de entrada.--out, -o: Caminho para a saída. Dependendo das opções selecionadas, a saída pode ser um único arquivo ou uma árvore de diretórios.--input_format, -f: Especifica o formato de entrada. As opções são:
raw: a entrada é um arquivo JSC bruto.disassembled: o arquivo de entrada já está desmontado.serialized: a entrada já está descompilada e armazenada em um formato serializado. O formato serializado atual é o pickle do Python; use apenas entrada confiável.--export_format, -e: Especifica o(s) formato(s) de exportação. As opções são v8_opcode, translated, decompiled e serialized. Várias opções podem ser combinadas. Padrão: decompiled.--path, -p: Caminho para o binário do desmontador. Necessário se a entrada estiver no formato bruto e o View8 não conseguir localizar automaticamente o desmontador correspondente.--scope: Propaga argumentos de escopo. Padrão: 1.--normalize: Substitui identificadores de função derivados de endereços por nomes determinísticos baseados na ordem de análise.--normalize-map [CSV]: Ao usar --normalize, grava um CSV mapeando cada nome de função original para seu nome normalizado. Quando o caminho é omitido, o View8 deriva <output>.name_map.csv de --out, ou de --inp quando nenhum caminho de saída é definido.--tree, -t: Divide a saída em uma estrutura de árvore em vez de armazenar todas as funções em um único arquivo. Especifique a função que será usada como raiz da árvore. Para começar pela função principal padrão, use start.--split_mode: Modo de divisão da árvore. As opções são declarers, calls e references. Padrão: declarers.--inline_depth, -d: Nos modos calls e references, inclui funções alcançáveis a partir da raiz da árvore selecionada até a profundidade N no arquivo principal da árvore. Profundidade 0 significa apenas a raiz selecionada; profundidade 1 inclui chamadas/referências diretas; profundidade 2 inclui seus filhos. Não é usado com declarers.--inline_branch_limit, -l: No modo de árvore, incorpora ramificações filhas completas com no máximo N funções no arquivo principal da árvore quando as ramificações filhas são incluídas por --inline_depth. Ramificações maiores são salvas separadamente.--split_depth: Nos modos calls e references, limita a profundidade em que as ramificações de uso exportadas são percorridas. Padrão: 4.--include, -n: Arquivo contendo funções a serem incluídas na saída.--exclude, -x: Arquivo contendo funções a serem excluídas da saída.--func: Exibe uma função selecionada.--show_all: No modo de exibição de função, também mostra linhas marcadas como ocultas.--verbosity, -v: Nível de verbosidade. Intervalo aceito: 0 a 3.Para descompilar um arquivo de bytecode V8 e exportar o código descompilado:
python view8.py -i input_file -o output_file
Por padrão, o View8 detecta a versão do bytecode V8 do arquivo de entrada usando VersionDetector.exe e procura automaticamente um binário de desmontador compatível na pasta Bin. Isso pode ser alterado especificando um binário de desmontador diferente com a opção --path ou -p:
python view8.py -i input_file -o output_file --path /caminho/para/desmontador
Para pular o processo de desmontagem e fornecer um arquivo já desmontado como entrada, use a opção --input_format disassembled ou -f disassembled:
python view8.py -i input_file -o output_file -f disassembled
Use --normalize para substituir nomes de função derivados de endereços por identificadores determinísticos. Para preservar a relação entre os nomes originais e normalizados, adicione --normalize-map:
python view8.py \
--input_format disassembled \
--inp sample.jsc.disasm.txt \
--normalize \
--normalize-map \
--out decompiled/sample.dec.txt \
--export_format decompiled serialized
Isso grava decompiled/sample.dec.name_map.csv com as seguintes colunas:
original_name,normalized_name
func_start_0x268514e9dcd9,func_start_0x100000000
func_rne_0x268514eb0779,func_rne_0x100000001
Um caminho CSV explícito também pode ser fornecido:
python view8.py \
--input_format disassembled \
--inp sample.jsc.disasm.txt \
--normalize \
--normalize-map mappings/sample.names.csv \
--out decompiled/sample.dec.txt
Às vezes é útil descompilar o arquivo em um formato serializado que preserve os objetos e estruturas analisados. Esse tipo de saída pode ser mais fácil de pós-processar do que um formato de texto, por exemplo, durante uma desofuscação adicional. Para criar uma saída serializada, use o formato de exportação serialized:
python view8.py -i input_file -o output_file -e serialized
Aviso de segurança: o formato serializado atual é um arquivo pickle do Python (.pkl). Deserializar dados de fontes não confiáveis pode executar código arbitrário. Carregue apenas arquivos serializados que você mesmo gerou.
Para carregar uma saída serializada de volta e exportá-la em outro formato, use --input_format serialized ou -f serialized:
python view8.py -i input_file -o output_file -f serialized
Especifique o(s) formato(s) de exportação usando a opção --export_format ou -e. Você pode combinar vários formatos:
v8_opcodetranslateddecompiledserialized