ShimCache (AppCompatCache)¶
ShimCache란¶
Windows의 애플리케이션 호환성 하위 시스템은 호환성/shim 동작을 평가하는 동안 실행 파일 경로와 메타데이터를 캐시합니다. 이 캐시는 파일의 이름이 바뀌거나, 제거되거나, 이동식 볼륨과 함께 연결이 끊긴 뒤에도 남아 있습니다. 그 구조와 사용 가능한 필드는 Windows XP부터 Windows 11까지 버전마다 다릅니다.
ShimCache는 과거 경로를 발견하는 데 가치가 있으며, 형식에 신뢰할 수 있는 실행 플래그가 있는 경우 실행을 추가로 뒷받침합니다. 캐시된 시간은 일반적으로 파일의 마지막 수정 시간이며, Windows가 파일을 확인하거나 실행한 시간이 아닙니다.
가장 타당한 결론: Windows가 호환성 처리를 위해 해당 경로를
확인했습니다. 엔트리만으로는 존재/확인의 증거이며, Executed는 지원되는 경우에만 사용하십시오.
위치와 수집¶
바이트는 SYSTEM 레지스트리 하이브에 있으며, 일반적으로 다음 위치에 있습니다.
SYSTEM, SYSTEM.LOG1 및 SYSTEM.LOG2를 수집하십시오. Juntei는 모든 제어 집합을 읽고 가능한 경우
Select\Current를 식별합니다.
가장 최근의 라이브 엔트리는 하이브에 없을 수 있습니다
Windows는 ShimCache 업데이트를 메모리에 보관했다가 종료/재부팅 시 플러시할 수 있습니다. 실행 중인 시스템에서 복사한 하이브에는 가장 최근의 확인 기록이 들어 있지 않을 수 있습니다. 캐시의 레지스트리 마지막 쓰기 시간은 캐시가 저장된 시점을 설명하는 데 도움이 되지만, 엔트리별 실행 시간은 아닙니다.
분석 시 주의 사항¶
- 캐시 엔트리 자체는 실행의 증명이 아닙니다.
Executed는Yes,No또는NA일 수 있으며, 그 의미는 형식/버전에 따라 다릅니다.LastModifiedTimeUTC는 참조된 파일의 시간이며, 확인이나 실행의 시간이 아닙니다.- 순서는 유용하지만 보편적으로 정확한 타임라인은 아닙니다. 제어 집합/슬랙에 걸쳐 중복이 발생합니다.
FromSlack엔트리는 활성 캐시 밖에서 복구된 것이므로 추가적인 주의가 필요합니다.- 사용 가능한 로그가 없는 더티(dirty)
SYSTEM에서는 현재 레코드가 누락될 수 있습니다. 복구 요약을 확인하십시오. - 발견 사항은 의심스러운 이름/경로 패턴을 나타낼 뿐 맬웨어 판정이 아닙니다.
Juntei로 파싱하기¶
Usage: juntei parse-registry shimcache <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find SYSTEM hives
-f, --file <FILE> Parse SYSTEM or a raw AppCompatCache value
--no-logs Do not replay SYSTEM.LOG1/SYSTEM.LOG2
Output:
-o, --output <FILE> Save records
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-registry shimcache -f SYSTEM -o shimcache.csv
juntei parse-registry shimcache -d evidence/ -t jsonl \
| jq 'select(.Executed == true or (.Findings | length > 0))'
출력 필드¶
| 필드 | 해석 |
|---|---|
ControlSet |
캐시가 들어 있는 제어 집합의 번호입니다. 하나를 선택하기 전에 IsCurrent를 비교하십시오. |
CacheEntryPosition |
디코딩된 캐시 내 위치/순서입니다. 상대적인 순서 파악에 유용하지만 시간이 아닙니다. |
Path |
캐시된 실행 파일/패키지 경로입니다. 주요 헌팅 피벗입니다. |
LastModifiedTimeUTC |
엔트리에 저장된 파일 수정 시간이며, 실행/확인 시간이 아닙니다. |
Executed |
지원되는 형식 플래그에 따라 Yes, No 또는 NA입니다. 버전 컨텍스트와 함께만 사용하십시오. |
Duplicate |
같은 엔트리가 이전 제어 집합이나 슬랙에서 이미 확인되었음을 나타냅니다. 중복 집계를 방지하는 데 도움이 됩니다. |
SourceFile |
입력 하이브/원시 값입니다. 여러 호스트를 다룰 때 필수적입니다. |
FromSlack |
활성 목록이 아니라 캐시 값의 슬랙에서 복구된 엔트리입니다. 신뢰도가 낮고 더 오래된 것일 수 있습니다. |
CacheFormat |
디코딩된 Windows/캐시 구조입니다. 필드의 가용성과 의미를 결정합니다. |
CacheLastWrittenUTC |
레지스트리 키/캐시 저장 시간입니다. 공유 컨텍스트이며, 각 엔트리의 실행 시간이 아닙니다. |
InsertFlags, ShimFlags |
원시 호환성 플래그입니다. Executed는 지원되는 경우 Juntei가 해석한 결과입니다. |
DataSize |
이 엔트리 데이터의 크기로, 구조 검증에 유용합니다. |
Machine |
최신 형식에 기록된 아키텍처(x64, x86, ARM64)입니다. |
FileSize, LastUpdateTimeUTC |
존재하는 경우 Windows XP 고유의 캐시된 메타데이터입니다. |
PackageName, PackageVersion, PackagePublisherID |
지원되는 엔트리의 패키지 애플리케이션 식별 정보입니다. 게시자 ID는 컨텍스트이며 서명의 증명이 아닙니다. |
Findings |
위치가 바뀐 시스템 바이너리나 의심스러운 스테이징 경로 같은 Juntei 이상 징후 코드입니다. 단서로만 사용하십시오. |
RegistryPath, RegistryValueName |
정확한 하이브 키/값 출처입니다. 검증을 위해 보존하십시오. |
CacheValueSize |
레지스트리 값 전체의 크기이며, 개별 엔트리의 DataSize가 아닙니다. |
IsCurrent |
이 엔트리의 제어 집합이 SYSTEM\Select\Current와 같은지 여부입니다. 확실히 알 수 없으면 비어 있습니다. |
SelectCurrent, SelectDefault, SelectLastKnownGood, SelectFailed |
컨텍스트 및 복구 분석을 위한 원시 SYSTEM\Select 제어 집합 번호입니다. |
JSON/JSONL은 추가로 엔트리 데이터, 태그, 패키지 앱 하위 레코드, 구조화된 발견 사항, 캐시 문제 및 복구 세부 정보를 보존합니다.
조사 전략¶
- 현재 제어 집합을 우선하되, 다른 제어 집합과 슬랙도 과거 증거로 보존하십시오.
- 경로와 발견 사항을 검색하십시오.
LastModifiedTimeUTC를 실행 시간으로 사용하지 마십시오. Executed == Yes인 경우 Prefetch, SRUM, 이벤트 로그 또는 기타 런타임 흔적으로 뒷받침하십시오.- 경로를
$MFT/USN과 매칭하여 생성, 삭제 및 메타데이터 이력을 확인하십시오. - 트랜잭션 로그가 재생되었는지, 그리고 라이브 캐시가 플러시되지 않았을 가능성이 있는지 보고하십시오.