- 서론
윈도우 메모장에서 수업 내용을 필기 하고 , 중요하지 않은 내용인 것 같아 우상단의 X 버튼을 눌러서 메모장을 종료했다.
다음 수업 때 메모장을 다시 쓸 일이 생겨서 확인해보니 필기내용이 그대로 남아 있었다.
저장하지 않았는데도 내용이 남아 있다는 건, 메모장이 어딘가에 기록을 따로 보관하고 있을 것 같고, 이 기록을 포렌식으로 찾아내 증거로 쓰일 수 있을 것 같아, 구글링과 LLM으로 자료를 조사해보고 X-Ways로 직접 확인하였다.
2. 저장 위치
메모장의 상태 파일은 아래 경로에 저장된다.
%LOCALAPPDATA%\Packages\Microsoft.WindowsNotepad_8wekyb3d8bbwe\
| 폴더 | 파일 | 내용 |
| LocalState\TabState | {GUID}.bin | 탭 하나당 파일 하나. 탭 본문이 들어 있음 |
| LocalState\TabState | {GUID}.0.bin, {GUID}.1.bin | 탭의 커서 위치, 보기 설정 등 상태 정보 |
| LocalState\WindowState | *.0.bin, *.1.bin | 열린 탭 개수, 탭 순서, 창 위치 |
| Settings | settings.dat | 메모장 설정 (레지스트리 하이브 형식) |
tip : .0.bin과 .1.bin은 번갈아 가며 갱신된다! 둘 중 Sequence Number가 큰 쪽이 최신 파일이다!
3. X-Ways로 직접 확인해보기
우선 메모장을 켜 아무 내용이나 작성한 다음 메모장을 종료한다.

관리자 권한으로 X-Ways를 실행 한 후 C드라이브를 케이스에 추가한다.
드라이브가 추가되면 %LOCALAPPDATA%\Packages\Microsoft.WindowsNotepad_8wekyb3d8bbwe\ 폴더로 이동한다.


위 두개의 사진 하단의 미리보기를 보면 영어로 된 메모는 잘 나오는데 반해 한국어로 된 메모는 다 깨져서 나온다. 이는 파일이 손상 된 것이 아니라 X-Ways가 ASCII형태로 미리보기를 보여줘 깨져서 출력 되는 것이다.
View -> Character set No. 1 -> Unicode UTF-16 LE, misaligned 를 클릭하여 UTF-16 LE 형태로 미리보기를 출력 형태를 변경하면 깨짐 없이 볼 수 있다!
TIP : 본문이 0x0F, 즉 홀수 오프셋에서 시작한다. 그래서 UTF-16 LE 가 아니라 misaligned에서만 한글이 보인다!


위 과정을 거치면 안녕하살법! 이라는 메모가 그대로 잘 보인다!
NP파일을 바이트 단위로 하나하나 설명을 하자면 아래 표와 같다.
| 오프셋 | 바이트 | 필드 | 해석 |
| 0x00 | 4E 50 | Signature | “NP” |
| 0x02 | 00 | Sequence Number | 0 (탭 본체 파일) |
| 0x03 | 00 | TypeFlag | 0 = 한 번도 저장하지 않은 새 탭 |
| 0x04 | 01 | Unknown | 공개 자료와 같은 고정값 |
| 0x05 | 06 | SelectionStart | 6 |
| 0x06 | 06 | SelectionEnd | 6 (선택 없이 6번째 글자 뒤에 커서) |
| 0x07 | 01 | WordWrap | 자동 줄 바꿈 켜짐 |
| 0x08 | 00 | RightToLeft | 꺼짐 |
| 0x09 | 00 | ShowUnicode | 꺼짐 |
| 0x0A | 03 | MoreOptions 길이 | 뒤에 3바이트가 더 있음 |
| 0x0B | 01 01 | Unknown ×2 | 맞춤법 검사·자동 고침 관련으로 추정 |
| 0x0D | 01 | Formatting | 1 = 서식 없음(일반 텍스트) |
| 0x0E | 06 | ContentLength | 6 (글자 수) |
| 0x0F | 48 C5 … 21 00 | Content (12바이트) | 안 녕 하 살 법 ! |
| 0x1B | 01 | Unsaved | 1 = 저장되지 않은 내용 있음 |
| 0x1C | EF 41 00 97 | CRC32 | 아래에서 검증 |
4. 마무리 글
이번 실험으로 메모장에서 저장하지 않은 내용도 TabState 파일에 그대로 남아 있고, X-Ways로 찾아 확인할 수 있다는 것을 직접 확인했다.
조사하면서 재미있는 점도 하나 알게 됐다. 공개 자료에 따르면 저장하지 않은 편집은 Unsaved Buffer Chunk(커서 위치, 지운 글자 수, 입력한 글자 수, 입력한 글자, CRC32) 단위로 쌓이고, 이 청크를 순서대로 재구성하면 무엇을 쳤다가 지웠는지까지 복원할 수 있다고 한다.
다만 이번에 확인한 파일은 CRC32에서 끝나서 청크가 없었다. 공개 자료에서는 메모장을 닫을 때 청크가 본문에 합쳐진다고 하는데, 어떤 조건에서 청크가 남는지는 다음 실험에서 확인해 볼 예정이다.
참고 문헌
ogmini, Notepad-State-Library, https://github.com/ogmini/Notepad-State-Library
AbdulRhman Alfaifi, notepad_parser, https://github.com/AbdulRhmanAlfaifi/notepad_parser
Velociraptor, TabState artifact, https://docs.velociraptor.app/exchange/artifacts/pages/tabstate

