Portanto, se o seu instantâneo foi produzido por uma versão razoavelmente moderna, provavelmente não analisará [corretamente]. Ainda assim, se você quiser tentar, provavelmente precisará de pelo menos a correção no número 3.
darter é um módulo Python que pode analisar completamente os dados dentro de um instantâneo de dardo (ou seja, o arquivo libapp.so em um aplicativo de flutter de liberação).
Características:
app.so ou .snapshot automaticamente.Exemplos do que você pode fazer com as informações analisadas:
NOTA: Lembre-se de que isso é para analisar instantâneos binários (ou seja, dependente da arquitetura). Os arquivos .dill e alguns arquivos .snapshot contêm kernel ast, que é um formato completamente diferente e atualmente não é suportado pelo darter . [Saber mais]
A maior parte do código é dependência zero, exceto::
parse_elf_snapshot(...) requer pyelftools
O módulo darter.asm (para analisar o código montado) requer Capstone (e sua ligação Python)
darter por si só é apenas um módulo, não possui programa ou CLI independente.
A maneira recomendada de usá -lo é incluí -lo em um caderno e tocar com os dados analisados.
Instale o Jupyter e abra o Notebook 1-introduction para obter um passo a passo básico dos dados analisados; Em seguida, vá para 2-playground , que contém exemplos de uso mais interessantes.
É altamente recomendável que você jogue pela primeira vez com um instantâneo conhecido (ou seja, que você construiu ou tenha o código), antes de analisar o instantâneo que procura.
O analisador ainda está em um estágio inicial e não funcionará em todos os casos.
Este analisador foi escrito com base no DART-SDK em 1ef83b86ae . O formato instantâneo é interno à VM. Ele despeja alguns dos objetos à medida que aparecem na memória; Você precisa saber como a VM (arco, sinalizadores compiladores) foi compilada para analisá -la. Ele pode mudar frequentemente entre as versões, pois não há uma especificação padrão (AFAIK) para o formato.
Qualquer ajuda ou doações são bem -vindas.
Dada uma seção de dados e uma seção de instruções (e opcionalmente uma base ):
OneByteString , CodeSourceMap , Instructions , etc.).As informações são retornadas o máximo possível, para que seja fácil de manipular. As referências de fundo também são rastreadas, para que seja fácil saber de onde um determinado objeto é referenciado.
darter pode analisar os instantâneos 'VM' e os 'isolar' (os que nos preocupamos).
O módulo darter.asm desmonta o código compilado e o analisa. Isso é crucial para instantâneos AOT, porque não temos um bytecode de alto nível.
Se você é novo no Dart/Flutter Reverse-Engineering, é uma boa ideia ler esta introdução primeiro: https://mrale.ph/dartvm/
O código relevante na serialização do instantâneo está no runtime/vm/clustered_snapshot.cc e runtime/vm/raw_object.h .
Também há informações adicionais no diretório info .