
NTFS의 $LogFile용 파서
기능 $LogFile 레코드와 트랜잭션 항목을 디코딩하고 덤프합니다. NTFS 속성 변경을 디코딩합니다. 선택적으로 $LogFile에서 사용 가능한 모든 데이터런 목록 정보를 해석합니다. 옵션: "Reconstruct data runs". $LogFile 내의 슬랙 공간에서 트랜잭션을 복구합니다. 슬랙에서 발견된 트랜잭션의 누락되거나 손상된 헤더를 재구성하도록 선택합니다. 옵션: "Rebuild header". 선택적으로 LSN 오류 수준 값으로 결과를 미세 조정합니다. 옵션: "LSN error level". csv로 로깅하고 여러 테이블이 있는 sqlite 데이터베이스로 가져옵니다. 선택적으로 mft2csv의 csv 출력을 db로 가져옵니다. 6가지 서로 다른 타임스탬프 형식 중에서 선택합니다. 타임스탬프 정밀도 선택: None, MilliSec 및 NanoSec. 밀리초 단위의 정밀도 구분자를 선택합니다. 나노초 단위의 정밀도 구분자를 선택합니다. 타임스탬프에 대한 지역 조정을 선택합니다. 기본값은 타임스탬프를 UTC 0.0으로 표시하는 것입니다. 출력 구분자를 선택합니다. 옵션: "Set separator". 구성 가능한 UNICODE 또는 ANSI 출력. 옵션 "Unicode". 구성 가능한 MFT 레코드 크기 (1024 또는 4096). 옵션 "MFT record size". 선택적으로 개별 트랜잭션 또는 부분 트랜잭션 (조각)을 디코딩합니다. 단일 또는 다중 트랜잭션 (조각)에서 RCRD를 재구성하는 옵션. 손상된 $LogFile을 구성하는 옵션. 입력으로 carved RCRD를 사용할 때 유용합니다. fixup을 건너뛰는 옵션 (손상된 $LogFile, 일반적으로 메모리에서 carved된 경우). debug.log에 상세한 verbose 출력. 특정 트랜잭션에 대한 ultra verbose 정보를 debug.log에 트리거하기 위한 lsn의 구성 가능한 쉼표로 구분된 목록. 32-bit OS를 위한 구성. resident 데이터 업데이트의 바이너리 데이터 추출을 위한 구성. 출력을 MySql 데이터베이스로 가져오기 위한 자동 생성 sql. 전체 파싱 속도를 높이기 위해 모든 sqlite3 관련 작업을 건너뛰는 옵션. 선택적 명령줄 모드. 배치 스크립팅에 적합한 errorlevel을 지원합니다.
배경 NTFS는 복구 가능한 파일 시스템으로 설계되었습니다. 이는 볼륨 구조를 변경하는 모든 트랜잭션의 로깅을 통해 이루어집니다. 따라서 볼륨의 파일에 대한 모든 변경은 $LogFile에도 기록되어야 하며, 이는 언제든 시스템 장애 시 되돌릴 수 있도록 하기 위함입니다. 따라서 이 파일에 많은 정보가 기록되며, 순환 구조이기 때문에 새로운 트랜잭션이 파일의 오래된 레코드를 덮어씁니다. 따라서 이 파일에서 검색할 수 있는 과거 데이터의 양은 다소 제한적입니다. 다시 말하지만, 이는 볼륨 유형과 $LogFile의 크기에 따라 달라집니다. 자주 사용되는 시스템의 시스템 드라이브에서는 몇 시간 분량의 기록만 얻을 수 있는 반면, 백업 파일이 있는 외부/보조 디스크는 더 많은 과거 정보를 포함할 가능성이 높습니다. 그리고 2MB 파일은 256MB 파일보다 훨씬 적은 기록을 포함합니다. 그렇다면 이 파일은 어떤 크기 범위로 구성할 수 있을까요? 256 KB 이상이면 무엇이든 가능합니다. 크기를 2 GB로 구성하는 방법은 "chkdsk D: /L:2097152"와 같습니다. 큰 크기의 로그 파일이 성능에 미치는 영향은 이 문서의 범위를 벗어납니다. 일반적으로 2048보다 낮게 설정하는 것은 불가능합니다. 그러나 untfs.dll을 패치하면 가능합니다: http://code.google.com/p/mft2csv/wiki/Tiny_NTFS
소개 이 파서는 NTFS의 $LogFile에서 많은 트랜잭션 정보를 디코딩하고 덤프합니다. 여러 csv가 생성될 뿐만 아니라 모든 관련 정보를 포함하는 ntfs.db라는 sqlite 데이터베이스도 생성됩니다. 출력은 매우 상세하고 매우 낮은 수준이므로 이를 이해하려면 상당한 NTFS 지식이 필요합니다. 현재 의미 있는 출력 디코딩으로 처리되는 Redo 트랜잭션 유형은 다음과 같습니다:
InitializeFileRecordSegment CreateAttribute DeleteAttribute UpdateResidentValue UpdateNonResidentValue UpdateMappingPairs SetNewAttributeSizes AddindexEntryRoot DeleteindexEntryRoot AddIndexEntryAllocation DeleteIndexEntryAllocation WriteEndOfIndexBuffer SetIndexEntryVcnRoot SetIndexEntryVcnAllocation UpdateFileNameRoot UpdateFileNameAllocation SetBitsInNonresidentBitMap ClearBitsInNonresidentBitMap OpenNonresidentAttribute OpenAttributeTableDump AttributeNamesDump DirtyPageTableDump TransactionTableDump UpdateRecordDataRoot UpdateRecordDataAllocation CompensationlogRecord
현재 지원되는 속성 목록: $STANDARD_INFORMATION $ATTRIBUTE_LIST $FILE_NAME $OBJECT_ID $SECURITY_DESCRIPTOR $VOLUME_NAME $VOLUME_INFORMATION $DATA $INDEX_ROOT $INDEX_ALLOCATION $REPARSE_POINT $EA_INFORMATION $EA $LOGGED_UTILITY_STREAM
따라서 기본적으로 모든 속성이 지원됩니다.
생성된 다양한 출력에 대한 설명:
LogFile.csv: 파서에서 생성된 기본 csv.
LogFile_DataRuns.csv 데이터런 재구성에 필요한 입력 정보
LogFile_DataRunsResolved.csv 재구성된 데이터런의 최종 출력
LogFile_INDX_I30.csv 덤프되고 디코딩된 모든 인덱스 레코드 (IndexRoot/IndexAllocation)
LogFileJoined.csv LogFile.csv와 동일하지만 $UsnJrnl 또는 mft2csv의 csv에서 파일 이름 정보가 조인됨.
MFTRecords.bin InitializeFileRecordSegment 트랜잭션에서 발견된 MFT 레코드를 기반으로 재생성된 더미 $MFT. 이 파일에 mft2csv를 사용할 수 있습니다 ("broken MFT" 및 "Fixups"를 적절히 구성하는 것을 잊지 마세요).
LogFile_lfUsnJrnl.csv $LogFile 내에서 디코딩된 $UsnJrnl에 대한 레코드
LogFile_UndoWipe_INDX_I30.csv 디렉터리 인덱스 (INDX) 지우기에 대한 모든 undo 작업.
LogFile_AllTransactionHeaders.csv 디코딩된 모든 트랜잭션의 헤더.
LogFile_BitsInNonresidentBitMap.csv 디코딩된 모든 SetBitsInNonresidentBitMap 작업.
LogFile_DirtyPageTable32bit.csv 및 LogFile_DirtyPageTable64bit.csv 32bit 및 64bit OS 모두에 대해 디코딩된 모든 DirtyPageTableDump 작업의 모든 항목.
LogFile_Mft_ObjectId_Entries.csv 디코딩된 $ObjectId 속성.
LogFile_ObjIdO.csv 시스템 파일 $ObjId:$O에서 디코딩된 모든 항목.
LogFile_OpenAttributeTable.csv 디코딩된 모든 OpenAttributeTableDump 작업의 모든 항목.
LogFile_QuotaO.csv 시스템 파일 $Quota:$O에서 디코딩된 모든 항목.
LogFile_QuotaQ.csv 시스템 파일 $Quota:$Q에서 디코딩된 모든 항목.
LogFile_RCRD.csv 디코딩된 모든 RCRD 레코드의 헤더.
LogFile_ReparseR.csv 시스템 파일 $Reparse:$R에서 디코딩된 모든 항목.
LogFile_SecureSDH.csv 시스템 파일 $Secure:$SDH에서 디코딩된 모든 항목.
LogFile_SecureSII.csv 시스템 파일 $Secure:$SII에서 디코딩된 모든 항목.
LogFile_SecurityDescriptors.csv 디코딩된 보안 설명자. 소스는 $SECURITY_DESCRIPTOR 또는 $Secure:$SDS일 수 있습니다.
LogFile_SlackAttributeNamesDump.csv 슬랙 공간에서 발견된 디코딩된 AttributeNamesDump 트랜잭션의 모든 항목.
LogFile_SlackOpenAttributeTable.csv 슬랙 공간에서 발견된 디코딩된 OpenAttributeTableDump 트랜잭션의 모든 항목.
LogFile_TransactionTable.csv 디코딩된 TransactionTableDump 트랜잭션.
LogFile_Filenames.csv MftRef, MftRefSeqNo 및 Lsn이 있는 해석된 모든 파일 이름.
LogFile_TxfData.csv $LOGGED_UTILITY_STREAM의 $DATA:$TXF_DATA에서 디코딩된 데이터.
LogFile_UpdateFileName_I30.csv redo 및 undo 작업 모두에 대한 UpdateFileNameRoot 및 UpdateFileNameAllocation의 모든 디코딩.
LogFile_CompensationlogRecord.csv CompensationlogRecord의 모든 디코딩. nt5.x에는 관련 없음.
Ntfs.db 위 csv와 거의 동일한 테이블을 가진 sqlite 데이터베이스 파일. 데이터베이스는 5개의 테이블을 포함합니다: DataRuns IndexEntries LogFile LogFileTmp (데이터런 재생성 시 사용되는 임시 테이블). UsnJrnl
타임스탬프 기본값은 UTC 0.00으로 표시되며 나노초 정밀도입니다. 기본 형식은 YYYY-MM-DD HH:MM:SS:MSMSMS:NSNSNSNS입니다. 이는 구성할 수 있습니다. 다양한 타임스탬프는 다음을 나타냅니다: CTime은 파일 생성 시간을 의미합니다. ATime은 파일 수정 시간을 의미합니다. MTime은 MFT 항목 수정 시간을 의미합니다. RTime은 파일 마지막 접근 시간을 의미합니다.
데이터런 재구성.
파일 시스템의 많은 작업은 $LogFile에 트랜잭션을 트리거합니다. $DATA 속성, 즉 파일 내용과 관련된 것들은 현재 다음과 같이 식별됩니다:
InitializeFileRecordSegment CreateAttribute UpdateMappingPairs SetNewAttributeSizes
이들은 모두 $LogFile에 서로 다른 정보를 남깁니다. Resident 데이터 수정은 다르게 동작하며, 적어도 최신 Windows 버전에서 비롯된 NTFS 볼륨에서는 그렇게 쉽게 재구성할 수 없습니다.
InitializeFileRecordSegment는 새 파일이 생성될 때입니다. 따라서 $FILE_NAME 속성과 데이터런을 포함한 원래 $DATA 속성 내용을 갖습니다. $LogFile은 순환이므로 오래된 이벤트는 새로운 이벤트로 덮어쓰여지며, $LogFile의 과제는 충분히 오래 전의 정보를 얻는 것입니다. 그러나 InitializeFileRecordSegment가 존재한다면, 그 이후에 작성된 모든 레코드도 사용 가능하므로 모든 것을 재구성할 수 있어야 합니다. 또한 데이터런 목록에 대한 오프셋 정보도 갖게 됩니다. 이는 $DATA 속성의 시작부터 계산된 상대 오프셋입니다. 이는 UpdateMappingPairs가 데이터런 목록의 어디에서 수정을 수행했는지 계산할 때 중요한 정보입니다.
CreateAttribute는 처음 생성되었을 때의 원래 속성입니다 (InitializeFileRecordSegment의 일부로 작성되지 않은 경우). 이것도 마찬가지로 모든 트랜잭션이 사용 가능하므로 데이터런을 재구성할 수 있어야 합니다. 그러나 이것 자체는 파일 이름을 제공하지 않습니다. 여기에서도 데이터런 목록에 대한 오프셋이 사용 가능하며, 이는 UpdateMappingPairs를 해결할 때 매우 유용합니다.
UpdateMappingPairs는 $DATA/데이터런에 대한 수정이 수행될 때 (파일 내용이 변경됨)의 트랜잭션입니다. 이 트랜잭션에서 발견되는 정보는 완전하지 않으며, 기존 데이터런 목록에 추가된 새로운 값만 포함합니다. 또한 데이터런 목록의 어디에 변경 사항이 작성되었는지 알려주는 상대 오프셋을 포함합니다. 이 오프셋은 InitializeFileRecordSegment 및 CreateAttribute에서 발견되는 데이터런에 대한 오프셋과 함께 사용됩니다.
SetNewAttributeSizes는 $DATA 속성에 수행된 크기 값 관련 수정에 대한 정보를 포함하는 트랜잭션입니다. 이는 데이터런 변경만 포함하는 UpdateMappingPairs와 밀접하게 연결되어 있습니다.
위의 4가지 서로 다른 redo 작업을 통해 주어진 참조 번호 (고유 파일)에 대해 파일의 파일 시스템 변경 이력 중 일부를 재구성할 수 있습니다. 순환성 때문에 우리는 이력의 일부, 가장 최근의 것만 갖습니다. 검색할 수 있는 이력의 범위는 대상이 어떤 종류의 볼륨인지에 크게 의존합니다. 시스템 볼륨이라면 일주일의 이력은 아마 기대 이상일 것이며, 이동식 또는 외부 또는 보조 디스크는 훨씬 더 많은 이력을 포함할 것입니다. 따라서 삭제된 파일 ($MFT 레코드가 덮어쓰여진)의 전체 이력을 재구성하고, 복구를 수행할 데이터런 목록을 재생성할 수 있습니다. 다른 경우에는 전체 이력을 재구성할 수 없어 부분적인 데이터런 목록만 재구성할 수 있습니다. 조정된 데이터런이 있는 최종 csv 파일인 LogFile_DatarunsModified.csv는 데이터런을 다르게 표시합니다.
설명: "!"로 시작하는 것은 완전한 데이터런 목록이 재생성되었음을 나타냅니다. "?"로 시작하는 것은 부분 복구를 나타내며, "**"의 개수는 원래 데이터런 목록에서 누락된 바이트 수를 나타냅니다.
데이터런을 기반으로 파일 복구를 단순화하기 위해 ExtractFromDataRuns라는 첨부된 PoC를 사용할 수 있습니다. 이는 상당히 자명합니다. 완전한 데이터런 목록, 실제 크기 및 초기 크기, 출력 파일 이름을 입력하기만 하면 됩니다. 선택적으로 이미지 파일 (디스크 또는 파티션)을 처리하도록 선택할 수 있습니다. 압축/스파스 플래그가 감지되었는지도 체크하세요. 부분적으로 재구성된 데이터런 목록을 제공하면 작동하지 않습니다! 대체 데이터 스트림은 데이터 이름의 존재와 주어진 fileref에 대한 OffsetInMft 값의 차이로 구별할 수 있습니다.