따라서 스냅 샷이 합리적으로 현대적인 버전으로 제작되면 아마도 올바르게 구문 분석하지 않을 것입니다. 그래도 시도하고 싶다면 #3에서 최소한 수정이 필요할 것입니다.
darter 는 다트 스냅 샷 내부의 데이터를 완전히 구문 분석 할 수있는 파이썬 모듈입니다 (예 : 릴리스 플러터 앱의 libapp.so 파일).
특징:
app.so 또는 .snapshot 파일에서 Blobs를 자동으로 추출합니다.구문 분석 정보로 할 수있는 일의 예 :
참고 : 이것은 바이너리 (IE 아키텍처 의존적) 스냅 샷을 구문 분석하기위한 것임을 명심하십시오. .dill 파일과 일부 .snapshot 파일에는 Kernel AST가 포함되어 있으며, 이는 완전히 다른 형식이며 현재 darter 는 지원하지 않습니다. [자세히 알아보기]
코드의 대부분은 다음을 제외하고는 0 의존성입니다.
parse_elf_snapshot(...) pyelftools가 필요합니다
darter.asm 모듈 (조립 된 코드 분석을 위해)에는 캡 스톤 (및 파이썬 바인딩)이 필요합니다.
darter 자체는 모듈 일 뿐이며 독립형 프로그램이나 CLI가 없습니다.
권장되는 방법은 노트북에 포함시키고 구문 분석 데이터를 사용하는 것입니다.
Jupyter를 설치하고 구문 분석 된 데이터의 기본 연습을 위해 1-introduction 노트북을 엽니 다. 그런 다음 더 흥미로운 사용 예가 포함 된 2-playground 로 향하십시오.
당신이 후에 스냅 샷을 분석하기 전에 먼저 알려진 스냅 샷 (즉, 자신을 구축했거나 코드를 가지고 있음)을 사용하여 먼저 재생하는 것이 좋습니다 .
파서는 여전히 초기 단계에 있으며 모든 경우에 작동하지 않습니다.
이 파서는 1ef83b86ae 에서 DART-SDK를 기반으로 작성되었습니다. 스냅 샷 형식은 VM 내부입니다. 메모리에 나타나는 객체의 일부를 버립니다. VM (아치, 컴파일 플래그)이 구문 분석하기 위해 어떻게 컴파일되었는지 알아야합니다. 형식에 대한 표준 사양 (AFAIK)이 없으므로 버전간에 자주 변경 될 수 있습니다.
모든 도움이나 기부금을 환영합니다.
데이터 섹션 과 지침 섹션 (및 선택적으로 기본 )이 주어지면 :
OneByteString , CodeSourceMap , Instructions 등)를 구문 분석하십시오.정보는 가능한 한 많이 구문 분석하여 조작하기 쉽습니다. 역 참조도 추적되므로 특정 객체가 어디에서 참조되는지 쉽게 알 수 있습니다.
darter 'VM'스냅 샷과 '분리'스냅 샷 (우리가 관심있는 것)을 모두 구문 분석 할 수 있습니다.
darter.asm 모듈은 컴파일 된 코드를 분해하고 분석합니다. 이것은 높은 수준의 바이트 코드를 얻지 못하기 때문에 AOT 스냅 샷에 중요합니다.
Dart/Flutter 리버스 엔지니어링을 처음 접한다면이 소개를 먼저 읽는 것이 좋습니다 : https://mrale.ph/dartvm/
Snapshot Serialization의 관련 코드는 runtime/vm/clustered_snapshot.cc 및 runtime/vm/raw_object.h 에 있습니다.
info 디렉토리에 추가 정보도 있습니다.