## 개요 윈도우 환경에 익숙한 사용자라면 윈도우(시작) 버튼을 눌렀을 때나 작업 표시줄에 있는 문서 프로그램들을 우클릭 했을 때 “최근 항목”에 최근 작업한 파일들이 저장되는 것을 본 적이 있을 것이다. 이처럼 사용자가 최근에 작업했던 파일은 다시 작업할 확률이 높기 때문에 Microsoft에서 편의기능으로 최근 사용자가 사용했던 파일이나, 프로그램들을 정리해 놓는 기능이 Windows 7 이후로 추가되었다. 하지만 디지털 포렌식 관점에서는 편의 기능을 떠나 사용자가 최근에 열람/수정/생성한 파일에 대한 정보를 얻을 수 있는 중요 아티팩트로 분류할 수 있다. 오늘은 프로그램이나 문서 파일을 실행할 때 남는 점프리스트 아티팩트에 대해 자세히 알아볼 예정이다. > [!Question] 링크 파일(LNK File)이랑 다른 점이 무엇인가요? > > 점프리스트는 기능적인 측면에서 링크파일과 유사하다고 생각할 수 있다. 실제로도 용도 자체는 같다. 그러나 LNK파일은 파일 시스템 내 파일/폴더에 대한 아티팩트라면 점프리스트는 윈도우 작업 표시줄과 시작 메뉴에 있는 파일들에 대한 아티팩트라는 점이 가장 큰 차이점이다. 물론 저장되는 정보나 저장되는 위치도 다르다. ## 경로 Jumplist의 경우 저장되는 경로가 Recent 디렉토리 하위라는 점이 일관된다. 하지만 윈도우 시스템 내에는 다양한 경로에 Recent 디렉토리가 있기 때문에 모든 경우에 대해 확인해줄 필요가 있다. 아래 서술하는 경로 중 `%APPDATA%`는 Appdata 경로로, `C:\Users\%Username%\Appdata\Local` 이나 `C:\Users\%Username%\Appdata\Roaming` 과 같은 경로를 의미한다. ``` %APPDATA%\Microsoft\Windows\Recent\AutomaticDestinations %APPDATA%\Microsoft\Windows\Recent\CustomDestinations %APPDATA%\Roaming\Microsoft\Windows\Recent\AutomaticDestinations %APPDATA%\Roaming\Microsoft\Windows\Recent\CustomDestinations *Jumplist Icon %APPDATA%\Microsoft\Windows\Recent\IconCache.db %APPDATA%\Microsoft\Windows\Explorer\iconcache_*.db (*의 의미는 해당 양식으로 된 모든 파일임을 이야기합니다) ``` Jumplist가 저장되는 경로를 자세히 보면 크게 두가지 유형으로 나뉘는 것을 확인할 수 있다. 바로 `AutomaticDestinations` 랑 `CustomDestinations` 다. 이 두 경로가 어떤 차이점을 가지는지는 데이터 단원에서 자세히 다뤄보도록 하겠다. ## 데이터 먼저 Jumplist 아티팩트에는 편의기능으로 이전에 사용했던 프로그램의 목록이 저장된다는 것을 짧게 설명했다. 그럼 프로그램은 어떤 기준으로 저장되는 것이고, 어떤 카테고리로 구분되어 저장되는지 알아야 한다. 언제나 그렇듯 Jumplist라는 아티팩트가 어떤 경우에, 어떤 환경에서 생성되는지는 하나의 소단원으로 구체적으로 다룰 예정이다. ### Jumplist 유형 및 생성 규칙 Window 11 기준으로 테스트 해 보았을 때 Jumplist는 기본적으로 활성화가 되어있는 기능이다. Windows 10에 대해서도 기본적으로 활성화 되어있는 것을 확인했다. Jumplist 기능을 비활성화 하기 위해서는 `개인 설정 > 시작` 에서 설정할 수 있다. ![[Untitled 31.png]] 또 Jumplist가 하나의 항목이 아니라 여러 항목으로 구분되어 분류되어 있는 것을 볼 수 있다. 이와 관련해서는 `최근에 추가된 앱`, `가장 많이 사용하는 앱` 과 같은 종류를 활성화/비활성화 할 수 있는 것 역시 확인해 볼 수 있는데, 이는 사용자 입장에서 분류되는 정보이다. 자세한 데이터 구조를 분석하기 이전에 사용자 환경에서 사용되는 분류로는 어떤 유형이 있는지 먼저 소개해 보도록 하겠다. - **Recent(최근 항목)** 최근 사용한 폴더/프로그램에 대한 Jumplist이다. 최근 사용과 관련해서 직접 확인할수 있는(시스템이 디스플레이해주는) 점프 목록의 개수는 최대 10개이다. 물론 10개도 기본적으로 설정된 값을 의미하며, 사용자의 설정값에 따라 바뀔 수 있다. 최대로 저장되는 갯수는 60~120개로 알려져 있다.(추후 실험 예정이다) - **Frequent(자주 사용하는/방문하는 항목)** 주로 사용한다고 판단하는 폴더/프로그램에 대한 Jumplist이다. 시스템이 판단하기에 사용자가 주로 사용한다고 판단하며, 이때 “최종 실행/수정 시각”, “프로그램 실행 횟수”, “실행 시간(duration)”과 같은 변수를 활용하며 정확한 가중치 값은 공개되어 있지는 않다. - **Tasks(작업)** 최근 사용한 프로그램/폴더 뿐만 아니라 특정 프로그램에 대해서 수행할 수 있는 동작 역시 미리 지정되어 있을 수 있다. ex) 새 창 열기, 이전 창 복원하기 etc… 이러한 기능을 Tasks라 한다. 한국어판 Windows OS에서는 “작업”이라는 이름으로 확인해볼 수 있다. - **Pinned(고정됨)** 사용자가 직접 고정한 항목이다. 파일탐색기에서 우클릭하는 경우 즐겨찾기에 등록하면 고정된다. 즐겨찾기에 추가, 고정하는 행위 등을 통해 Pinned 항목을 생성할 수 있다. 사용자 입장에서 분류되는 정보는 크게 4 종류였다. 그렇다면 시스템 입장에서 데이터를 저장할때도 위와 같이 4가지 분류로 저장할까? 라는 의문이 들어야 한다. 실제로 데이터를 분류할 수 있는 방법은 다양하기 때문이다. 지금까지 본 윈도우 레지스트리나 파일시스템에서는 이와 같은 상황에서 정보를 저장하는 구조체 내부에 Flag 값을 설정하여 구분하는 모습을 종종 보여주곤 했는데 Jumplist는 특이하게 저장 자체를 구분하여 저장하는 형태를 보여준다. 어느정도 위에서 스포를 한 내용이기도 하다. 에서 볼 수 있다시피 데이터는 주로 `Automatic-Destinations` 와 `Custom-Destinations` 에 각각 나눠져 저장이 되는데 사용자가 직접 Jumplist에 관여하는 Pinned와 같은 분류는 `Custom-Destination`에 구분되어 저장된다. 각각 형식이 조금 다르기 때문에 따로 다루어 보도록 하겠다. ### Automatic-Destinations `.automaticDestinations-ms` 확장자를 가진다. 파일 이름에 양식이 있는데 Hex 값으로 이루어져 있다.16바이트 양식으로 이루어져 있으나, 시작 바이트가 0인 경우 15바이트 HexString으로 표시된다. 이때의 HexString은 전체 경로를 CRC 환산식으로 계산한 Hex 값이다. Path 자체는 Unicode로 변환된 후 계산된 것이라 한다. `Automatic-Destination`파일의 경우 OLECF 파일 형식을 사용한다. [(Object Linking and Embedding Compound File)](https://github.com/libyal/libolecf/blob/master/documentation/OLE%20Compound%20File%20format.asciidoc) OLECF 파일 형식 중 `DestList`와 파일 이름과 같은 HexString을 사용한다. `DestList`는 32바이트 헤더와, 다수의 DestList 엔트리로 구성된다. 자세한 구조체 정보는 [링크](https://github.com/libyal/dtformats/blob/main/documentation/Jump%20lists%20format.asciidoc) 를 참고하자. 하나의 `automaticDestination-ms` 파일을 분석하기 위해서는 OLECF 양식을 이해한 다음, DestList 구조체를 파악하는 것이 중요하다. 구조체 자체를 설명하지 않았으니, 어떤 정보들이 구조체에 저장되는지 정도는 알고 넘어갈 필요가 있겠다. 아래 정리한 내용이 `automaticDestination-ms` 에 포함되는 주요 정보이다. - 파일의 GUID - Hostname - 파일 수정 시각 - 파일 경로 ### Custom-Destinations `.customDestination-ms` 확장자를 가진다. 파일 이름에 양식이 있는데 Hex 값으로 이루어져 있다.16바이트 양식으로 이루어져 있으나, 시작 바이트가 0인 경우 15바이트 HexString으로 표시된다. 이때의 HexString은 전체 경로를 CRC 환산식으로 계산한 Hex 값이다. Path 자체는 Unicode로 변환된 후 계산된 것이라 한다. `Custom-Destination` 파일은 파일 헤더, 링크 파일 엔트리들, 파일 푸터로 구성되는데 간혹 추가적인 데이터가 추가로 생성되는 경우 역시 있다. 하나하나의 구조체에 대해서 짚어보기엔 정확한 구조체 정보가 아직 알려지지 않았다. 각 구조 별로 핵심적인 내용만 짚고 넘어가 보겠다. **파일 헤더** - 해당 파일이 몇개의 엔트리로 구성되었는지 확인할 수 있다. - 32바이트로 구성되어 있다. **링크 파일 엔트리(****[[LNK file]]****)** - LNK 파일에서 확인할 수 있는 GUID값 - LNK파일에서 사용하는 Data Stream - Checksum 값 **파일 푸터** - `0xbabffbab` **추가 데이터** - LNK 파일에서 확인할 수 있는 GUID값 - LNK파일에서 사용하는 Data Stream ## 결론 구조체와 관련하여 많은 정보를 확인해 볼 수 없어서 아쉽긴 하나, 최소한의 정보는 확인해 볼 수 있었다. Jumplist 데이터 자체가 LNK파일과 큰 연관성을 가지고 있다는 것을 알 수 있었으며, [[LNK file]] 에 대한 이해도가 있다면 어느정도 Jumplist를 이해하는데 도움이 되지 않을까 생각해 본다. 사실상 저장되는 데이터보다는 데이터가 생성되는 로직을 이해하는 것이 중요한 아티팩트라 생각되며, 실제 Jumplist 데이터를 통해서는 어떤 파일이 연관되어 있는지, Jumplist 파일이 언제 수정되었는지를 통해 사용자 행위를 식별하는 것이 중요하게 생각된다.