본문으로 건너뛰기

BAM / Registry — 실행 레지스트리 아티팩트 ​

BAM, UserAssist, ShimCache, Amcache는 각각 다른 목적으로 실행 메타를 남긴다. SS는 이 네 소스를 모아 Prefetch·USN과 교차한다. BAM은 "이 사용자가 이 경로를 실행했다"를 SID 단위로 기록한다.

왜 중요한가 ​

Prefetch가 꺼져 있거나 삭제된 환경에서 BAM이 실행 증거의 보조 축을 맡는다. BAM은 사용자 SID 단위로 기록하므로 누가 실행했는지까지 특정할 수 있다. Prefetch에는 사용자 구분이 없다.

네 소스의 성격이 다르다는 점이 핵심이다. BAM과 UserAssist는 "실행"에 가깝고, ShimCache(AppCompatCache)는 호환성 캐시로 "시스템이 그 파일을 인지했다"에 가깝다. 엔트리가 곧 실행 증명은 아니므로 해석에 주의한다. Amcache는 앱 인벤토리로 설치·실행 메타를 담는다. 같은 파일이 넷 중 둘 이상에 걸리면 신뢰도가 올라간다.

무엇인가 ​

BAM ​

  • 경로: HKLM\SYSTEM\CurrentControlSet\Services\bam\State\UserSettings\<SID>\. 초기 빌드는 ...\bam\UserSettings\<SID>\(State 없음).
  • 의미: 백그라운드 활동 모니터링.
  • 확인: 실행 경로 + 마지막 실행 시각(SID별).
  • 보존: 항목은 오래 남지 않는다. 7일 지난 항목(기본값)과, 실행 파일이 원래 위치에서 사라진 항목은 부팅 때 지워진다. 이동식 매체나 네트워크 공유에서 실행한 파일, 명령줄 세션에서 띄운 콘솔 프로그램은 항목이 생기지 않을 수 있다. 분석 대상은 Windows 10 빌드(18363·19592)의 bam.sys다.

DAM ​

  • 경로: HKLM\SYSTEM\CurrentControlSet\Services\dam\UserSettings\<SID>\(버전 의존).
  • 의미: Desktop Activity Moderator.
  • 확인: BAM 보조 기록.

UserAssist ​

  • 경로: HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\ 아래 GUID별 키.
  • 의미: 시작 메뉴·탐색기 사용 통계.
  • 확인: GUI로 실행한 프로그램. 값 이름은 ROT13으로 인코딩돼 있고, 실행 횟수·마지막 실행 시각이 들어 있다.

ShimCache ​

  • 경로: HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache(SYSTEM 하이브).
  • 의미: 호환성 캐시 힌트.
  • 확인: 파일 존재·실행 메타. 캐시 시맨틱이라 해석에 주의한다.
  • 파서: AppCompatCacheParser(Windows 7~11 지원, 잠긴 하이브도 처리).

Amcache ​

  • 경로: C:\Windows\AppCompat\Programs\Amcache.hve.
  • 의미: 앱 인벤토리.
  • 확인: 설치·실행 메타, 파일 SHA1.

MRU 계열 ​

  • 경로: RecentDocs, ComDlg32\OpenSavePidlMRU, AppCompatFlags Compatibility Assistant\Store.
  • 의미: 최근 항목 목록.
  • 확인: 파일 열람·실행 보조.

MUICache ​

  • 경로: HKCU\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache. 파일로는 사용자별 UsrClass.dat(%LocalAppData%\Microsoft\Windows\UsrClass.dat)에 있다.
  • 의미: 탐색기가 프로그램을 실행할 때 실행 파일의 버전 정보에서 읽은 파일 설명·회사 이름을 저장하는 캐시.
  • 확인: 실행 파일 경로와 표시 이름. 실행 시각은 없으므로 시각은 다른 축에서 가져온다.

PCA (Windows 11) ​

  • 경로: C:\Windows\appcompat\pca\의 PcaAppLaunchDic.txt·PcaGeneralDb0.txt·PcaGeneralDb1.txt. Windows 11 22H2부터 생기고, PcaSvc 서비스가 실행 중일 때 기록된다.
  • 의미: 프로그램 호환성 관리자(Program Compatibility Assistant)의 실행 기록.
  • 확인: PcaAppLaunchDic.txt는 실행 파일마다 한 줄에 전체 경로와 마지막 실행 시각(UTC, YYYY-MM-DD HH:MM:SS.f)을 파이프 문자로 나눠 적고, 다시 실행하면 그 줄을 갱신한다. PcaGeneralDb0/1.txt는 실행 시각(UTC), 기록 유형(0 설치 오류, 1 드라이버 차단, 2 비정상 종료, 3 PCA 해결 호출, 4 값 없음), 드라이브 문자 없는 경로, PE 헤더의 제품명·회사명·버전, 프로그램 ID를 담는다. 한 파일이 2MB에 차면 다른 파일과 역할을 바꿔 번갈아 쓴다.
  • 한계: 탐색기로 실행한 것만 기록하고 콘솔에서 띄운 실행은 기록하지 않는다. PcaAppLaunchDic.txt는 ANSI(CP-1252) 파일이라, 이름에 유니코드 문자가 있는 파일을 실행하면 그 뒤로 새 항목이 추가되지 않고 기존 항목만 갱신된다.

자동 기동 흔적 ​

  • Run 키: HKCU·HKLM 아래 Software\Microsoft\Windows\CurrentVersion\Run·RunOnce. 등록된 프로그램은 사용자가 로그온할 때 그 사용자 권한으로 실행된다(MITRE T1547.001). 시작 프로그램 폴더도 같은 역할을 한다.
  • COM 하이잭: HKCU\Software\Classes\CLSID\{CLSID}\InprocServer32에 HKLM의 같은 CLSID를 덮어쓰는 항목을 만들어, 정상 구성 요소가 그 COM 객체를 쓸 때 다른 DLL이 로드되게 한다(MITRE T1546.015). HKCU에 있는 CLSID 항목과 그 DLL 경로를 본다.
  • 예약 작업: 작업마다 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\<작업 이름>(Id·Index·SD 값)과 TaskCache\Tasks\{GUID}(Actions·Path·Triggers)가 생기고, 같은 내용이 C:\Windows\System32\Tasks의 확장자 없는 XML 파일에 남는다. 작업 기록이 켜져 있으면 Microsoft-Windows-TaskScheduler/Operational에 106(등록)·140(갱신)·141(삭제)·200(동작 시작)·201(동작 완료)이 남고, 200·201에는 실행한 파일 경로가 들어 있다.

BAM의 정식 명칭은 Background Activity Moderator다. "Background Application Manager"는 잘못 퍼진 표기다. 도입은 Windows 10 1709부터다. 그 이전 빌드에는 BAM 키 자체가 없으므로 "비어 있음"이 곧 와이프는 아니다. 빌드 번호를 먼저 확인한다.

SS에서 어떻게 쓰나 ​

  1. T+18에 레지스트리 뷰어(regedit·Registry Explorer)나 BAM 파서(BAM-parser·BAMReveal·스캐너 내장 뷰어)로 현재 SID의 BAM 키를 연다. State 경로가 비어 있으면 State 없는 초기 경로도 확인한다. 1709 미만 빌드면 BAM 자체가 없다고 적는다.
  2. 스캐너 히트·Prefetch 이름과 경로를 대조한다.
  3. UserAssist에서 GUI 실행 기록을 확인한다(ROT13 디코딩). 실행 횟수가 "한 번도 안 돌렸다"는 진술과 어긋나는지 본다.
  4. ShimCache(AppCompatCacheParser)·Amcache는 보조로만 쓰고, 단독 판정 근거로 삼지 않는다.
  5. BAM 파서 결과에서 경로 변환, 이번 로그온의 실행 여부, 파일 미존재 시 Deleted 표기, USN을 통한 교체 여부를 본다.
  6. reg.exe·regedit.exe·RegistryExplorer.exe의 최근 실행 기록을 Prefetch·BAM 자체에서 찾는다. 검사 직전의 레지스트리 도구 실행은 조작 정황이다.
  7. Windows 11 22H2 이상이면 C:\Windows\appcompat\pca\의 세 파일을 증거 폴더로 복사해 읽는다. 스캐너 히트·Prefetch 이름의 경로와 마지막 실행 시각(UTC)을 대조한다. 탐색기로 실행한 것만 남으므로 PCA에 없는 항목을 실행 부재로 읽지 않는다.
  8. MUICache에서 실행 파일 경로와 표시 이름을, Run 키·HKCU CLSID·예약 작업(TaskCache와 C:\Windows\System32\Tasks)에서 자동 기동 등록을 확인한다.

우회 기법과 남는 흔적 ​

레지스트리 아티팩트를 지우는 방법은 정해져 있고, 각각 다른 축에 파생 흔적을 남긴다. 검사자는 기법 자체보다 그 기법이 남긴 파생 흔적을 본다.

기법공격자가 하는 일남는 흔적
BAM 값 선택 삭제regedit 수동 탐색, reg delete, CCleaner 계열로 의심 값만 지운다. 수동 삭제를 위해 UserSettings<SID> 키에 관리자 권한을 먼저 부여하는 절차를 거치는 경우가 많다의심 값만 사라지고 시스템 노이즈는 남는 선택적 와이프 패턴. reg.exe·regedit.exe의 Prefetch·BAM 실행 기록, Registry Explorer로 삭제 값 복원, 감사가 켜진 환경에서는 이벤트 4657(레지스트리 값 변경). 권한 부여가 있었다면 대상 키의 ACL이 기본값에서 바뀌어 있으므로 키 보안 탭에서 비기본 ACL을 확인한다
BAM 키 통째 비우기UserSettings<SID> 아래를 몽땅 지운다긴 세션 뒤 BAM이 완전 공백이면 안티포렌식 리드. 단, 1709 미만 빌드·정책 비활성, 7일 지난 항목과 지워진 실행 파일 항목의 부팅 시 정리, 이동식 매체·네트워크 공유 실행을 먼저 배제한다
BAM 타임스탬프 편집편집 도구로 BAM 엔트리의 마지막 실행 시각을 다른 값으로 바꾼다바뀐 시간값이 다른 축의 시간과 어긋난다. 검사자는 BAM의 실행 시각을 Prefetch 실행 시각·USN 타임라인과 교차 비교하고, 편집 도구의 실행 흔적을 찾는다
권한·상속으로 키 은닉키의 상속을 끊거나 읽기 권한을 제한해 뷰어에 안 보이게 한다"상속 사용" 버튼이 떠 있으면 상속 비활성 상태다. 시스템 관련 경로의 이유 없는 상속 비활성은 즉시 조사 대상
IFEO Debugger 걸기HKLM\...\Image File Execution Options 아래 치트 exe명의 키에 Debugger 값을 등록해, 검사자가 파일을 열면 정상 프로그램이 대신 뜨게 한다IFEO 키는 레지스트리에서 직접 열거된다. 치트 이름의 exe에 Debugger 값이 걸린 것 자체가 강한 시그니처다. 검사자는 IFEO 하위 키를 전수 열거해 Debugger 같은 비기본 값이 걸린 exe 이름을 찾는다
RunMRU 값 삭제HKCU\...\Explorer\RunMRU의 값을 지워 Win+R 실행 기록을 없앤다활동은 있었는데 RunMRU가 비어 있거나 세션 직전의 새것만 남은 패턴. 검사자는 RunMRU의 값 목록과 MRUListEx 순서가 연속적인지 보고, regedit 실행 기록과 Registry Explorer 복원으로 지워진 값을 확인한다
최근 문서 기록 끄기"최근 문서" 정책을 켜거나 %AppData%\Microsoft\Windows(Recent의 상위 폴더)에 deny ACL을 걸어 shell:recent 기록을 무력화한다해당 폴더의 비정상 ACL(모든 사용자 접근 차단)과 정책 레지스트리 값이 남는다. 검사자는 폴더 보안 탭의 Deny 항목과 정책 키 값을 확인한다
TabletInputService 비활성TextInputHost를 거치는 입력 기록을 끊기 위해 서비스를 disabled로 바꾼다서비스 상태 변경 이벤트(System 7040·7036)와 sc qc로 확인되는 비활성 상태 자체. 검사자는 서비스 상태와 변경 이벤트의 시각을 세션 타임라인과 대조한다
레지스트리 도구 차단DisableCMD·regedit 접근 차단 정책으로 검사자의 도구 사용을 막는다regedit가 안 열리는 것 자체가 신호다. gpresult /h report.html로 적용 정책 보고서를 만들어 확인하고, 해당 정책 값이 켜진 시각을 다른 축과 대조한다
shell:startup 자동 기동시작 프로그램 폴더에 바로가기·실행 파일을 두어 재부팅 자동 실행을 노리고, explorer.exe 같은 정상 프로세스명으로 위장한다Run 키와 별개 경로지만 시작 폴더 내용물은 전수 열거된다. 사용자 startup 안의 explorer.exe 같은 시스템 이름은 명백한 이상이다. 검사자는 %AppData%\...\Start Menu\Programs\Startup의 내용을 열거한다
예약 작업 숨기기TaskCache\Tree\<작업 이름>의 SD 값을 SYSTEM 권한으로 지워 schtasks /query와 작업 스케줄러 화면에서 작업을 감춘다. 작업은 트리거대로 계속 실행된다SD 값만 없는 Tree 키가 남고, TaskCache\Tasks\{GUID}의 Actions와 C:\Windows\System32\Tasks의 XML이 실행 대상을 보여 준다. 검사자는 Tree 아래 SD 값이 없는 작업을 열거하고, Operational 106·200·201과 Security 4698의 시각을 세션 타임라인과 대조한다
파일 교체치트 실행 후 삭제하고 같은 이름의 정상 파일을 둔다현재 파일의 생성 시각이 BAM의 마지막 실행 시각보다 늦으면 교체 의심. Windows 11 24H2부터는 복사본이 원본 타임스탬프를 물려받아 이 비교로 놓칠 수 있다. USN의 FILE_DELETE → 동일명 CREATE가 결정적

정상 vs 이상 ​

구분정상이상
BAM 키 상태실행 파일 여러 개 기록빈 키(긴 세션 후에도 설명 없음), 의심 값만 빠진 선택적 공백
경로 내용시스템·게임·브라우저스캐너 히트·제보 대상 이름, Temp·AppData 경로
UserAssist일반 앱의심 도구, 진술과 어긋나는 실행 횟수
레지스트리 도구없거나 오래전검사 직전 regedit·reg.exe·RegistryExplorer 실행
빌드1709+에서 BAM 존재1709+인데 키 부재 → 사유 확인
BAM 항목 보존최근 7일 안의 실행이 남고, 오래된 항목과 지워진 실행 파일의 항목은 재부팅 뒤 사라진다재부팅 없이 빠진 특정 값, 다른 축에 있는 7일 안의 실행이 BAM에만 없는 공백(이동식 매체·네트워크 공유·콘솔 실행으로 설명되지 않을 때)
PCA(Windows 11)탐색기로 실행한 프로그램의 경로가 쌓인다제보 시간대의 치트 경로가 PcaAppLaunchDic.txt에 남아 있다
예약 작업업데이터·장치 도구의 작업사용자 경로의 실행 파일을 부르는 작업, SD 값이 없는 Tree 키

오탐 ​

  • 빌드 1709 미만: BAM 키가 원래 없다. 빌드 번호를 먼저 본다.
  • 빌드별 BAM 서비스·정책 차이. 모든 Windows 10/11 빌드에서 동일하지 않다.
  • BAM 보존 정리: 7일 지난 항목과 원래 위치에서 사라진 실행 파일의 항목은 부팅 때 지워진다. 마지막 부팅 시각을 확인하기 전에는 빠진 항목을 와이프로 읽지 않는다. 파일 삭제 자체는 USN에서 본다.
  • BAM이 만들지 않는 항목: 이동식 매체나 네트워크 공유에서 실행한 파일, 명령줄 세션에서 띄운 콘솔 프로그램은 항목이 생기지 않을 수 있다.
  • PCA 기록 멈춤: 이름에 유니코드 문자가 있는 파일을 한 번 실행하면 PcaAppLaunchDic.txt에 새 항목이 더 추가되지 않는다. 콘솔 실행은 처음부터 기록되지 않는다.
  • 포터블 앱·인스톨러. 일회성 경로가 BAM에 남을 수 있다.
  • ShimCache 엔트리는 사용자 대화형 실행 증명이 아니다(캐시 시맨틱 주의).
  • 다중 사용자 PC: 다른 SID의 활동을 현재 사용자 것으로 읽으면 안 된다.

교차 검증 ​

교차 카드확인 내용
R3-PF같은 경로의 Prefetch 존재
R3-USN파일 생성·삭제 기록, 동일명 교체 패턴
R3-SIG경로의 서명 상태
R3-AFBAM 키가 비어 있으면 안티포렌식 여부. 레지스트리 도구 실행과 클러스터

SRUM(C:\Windows\System32\sru\SRUDB.dat)은 앱별 자원·네트워크 사용을 실행 경로·SID와 함께 한 시간 단위로 약 30일 남기는 보조 축이다. BAM 항목이 정리됐거나 생기지 않은 경로가 SRUM에 남아 있는지 본다. 읽는 법과 한계는 Windows 흔적에 있다.

증거 캡처 ​

  1. BAM 키 export 또는 파서 CSV(사용 중인 SID)
  2. UserAssist 의심 엔트리(디코딩된 이름·횟수)
  3. ShimCache·Amcache 히트 리스트(시간 범위 내)
  4. regedit·reg.exe 실행 흔적과 키 상속·권한 화면(조작 의심 시)
  5. Windows 11 22H2 이상이면 C:\Windows\appcompat\pca\의 세 파일 사본
  6. MUICache 의심 항목, 자동 기동 열거(Run 키·HKCU CLSID·TaskCache·C:\Windows\System32\Tasks)

모두 04-registry/에 둔다.

흔한 실수 ​

  • ShimCache 엔트리 하나로 "사용자가 실행했다"고 단정한다.
  • BAM이 비어 있다고 곧바로 와이프라고 판정한다. 서비스 상태와 빌드(1709+), 마지막 부팅 시각과 7일 보존을 먼저 확인한다.
  • UserAssist 값 이름을 디코딩하지 않고 "없다"고 한다.
  • 다른 사용자 SID의 기록을 현재 사용자 것으로 읽는다.

Community. 현장에서는 BAM 엔트리나 스캐너 시그니처 히트만으로 Confirmed를 내리지 않는 것이 강조된다.

BAM 수동 삭제·타임스탬프 편집·RunMRU 정리·IFEO Debugger 걸기 같은 레지스트리 우회가 반복 보고된다. 우회가 남긴 ACL·정책 값·키 자체가 되려 강한 축이 되므로, 지워진 값보다 그 주변의 조작 흔적을 본다.

Sources ​

Next ​