BAM / DAM¶
BAM과 DAM이란¶
Background Activity Moderator(BAM)와 Desktop Activity Moderator(DAM)는 애플리케이션이 백그라운드에서
수행할 수 있는 작업을 관리하는 Windows 서비스입니다(Windows 10 1709 이상). 이 서비스들은 사용자별로
각 프로그램이 마지막으로 실행된 시간을 SYSTEM 하이브에 보관합니다.
- 사용자당 하나의 키가 있으며, 키 이름은 사용자의 SID입니다.
- 프로그램당 하나의 값이 있으며, 값 이름은 장치상의 프로그램 경로
(
\Device\HarddiskVolume3\Windows\System32\cmd.exe) 또는 패키지 앱의 ID (Microsoft.WindowsCalculator_8wekyb3d8bbwe)입니다. - 값 데이터의 처음 8바이트는 마지막 실행 시간(FILETIME)입니다.
BAM은 사용자 자신의 하이브 없이도 프로그램을 사용자 및 시간과 연결하며, 이동식 장치와 네트워크 장치에서 실행된 프로그램도 나열합니다.
가장 타당한 결론: 이 프로그램의 프로세스가 이 사용자의 세션에서 실행되었으며, 마지막 실행 시간은 이 시간입니다. BAM은 실행 횟수를 세지 않으며, 프로그램이 삭제된 후에도 항목이 남아 있을 수 있습니다.
위치¶
C:\Windows\System32\config\SYSTEM
ControlSet00N\Services\bam\State\UserSettings\<SID> Windows 10 1809 and later
ControlSet00N\Services\bam\UserSettings\<SID> Windows 10 1709 to 1803
ControlSet00N\Services\dam\State\UserSettings\<SID>
ControlSet00N\Services\dam\UserSettings\<SID>
각 사용자의 키에는 Version과 SequenceNumber 값도 있지만, 이는 프로그램이 아니므로 제외됩니다.
1709 또는 1803에서 업그레이드된 시스템에는 두 레이아웃이 모두 존재할 수 있습니다.
SYSTEM을 트랜잭션 로그와 함께 수집하고, 사용자 이름이 들어 있는 시스템의 SAM과 SOFTWARE도
수집하십시오.
분석 시 주의 사항¶
- 프로그램 및 사용자당 하나의 시간. 가장 최근 실행만 보관됩니다. 이전 실행은 Prefetch, Amcache 및 이벤트 로그에서 확인할 수 있습니다.
- 최근 활동. 한동안 실행되지 않은 프로그램의 항목은 Windows 시작 시 제거되는 것으로 알려져 있으므로, BAM은 주로 최근 활동을 보여 줍니다. BAM에 없는 프로그램도 오래전에 실행되었을 수 있습니다.
- 드라이브 문자가 아닌 장치 경로.
\Device\HarddiskVolume3은 Windows가 세 번째로 번호를 매긴 볼륨이며C:가 아닙니다.DevicePath와Path는 장치와 그 장치상의 경로를 분리합니다. 드라이브 문자를 기재하기 전에MountedDevices,$MFT또는 기타 아티팩트로 볼륨을 대조하십시오. - 모든 프로그램이 아닙니다. BAM과 DAM은 사용자 세션의 프로그램을 추적하므로 서비스는 대부분
나타나지 않습니다.
S-1-5-18항목은 일반적으로 설치 및 로그인 화면의 프로세스 (FirstLogonAnim.exe)이고,S-1-5-90-0-<n>항목은 Desktop Window Manager(DWM-<n>)입니다. - 제어 집합. 기본적으로 Windows가 마지막으로 사용한 제어 집합을 읽습니다.
--all-control-sets는 모든 제어 집합을 읽습니다. 이전 제어 집합에는 현재 제어 집합에 더 이상 없는 항목이 남아 있을 수 있습니다. - 사용자 이름. 로컬 계정의 이름은
SAM(컴퓨터의 SID와 계정의 RID)에서, 도메인 계정의 이름은ProfileList의 프로필 폴더에서 얻습니다.UserSource는 그 출처(sam,profile_list,well_known)를 나타냅니다. 이러한 하이브가 없으면 SID만 제공됩니다.SAM에 더 이상 없는 RID (삭제된 계정)는 이름 없이 남습니다.
Juntei로 파싱하기¶
Usage: juntei parse-registry bam <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find SYSTEM hives
-f, --file <FILE> Parse one SYSTEM hive
--log1/--log2 Supply transaction logs explicitly
--no-logs Do not replay logs
Filtering:
--all-control-sets Every control set, not only the one in use
Output:
-o, --output <FILE> Save records
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-registry bam -d evidence/ -o bam.csv
juntei parse-registry bam -f SYSTEM -t jsonl \
| jq 'select(.Path? // "" | test("\\\\(Users|ProgramData|Temp)\\\\"; "i"))'
요약에는 각 사용자가 SID, 이름 및 항목 수와 함께 나열되고, 마지막으로 실행된 프로그램이 최신 순으로 표시됩니다.
출력 필드¶
| 필드 | 해석 |
|---|---|
Host, SourcePath |
호스트와 SYSTEM 하이브입니다. |
ControlSet, IsCurrentControlSet |
항목이 속한 제어 집합과, 그것이 Windows가 마지막으로 사용한 제어 집합인지 여부입니다. |
Moderator |
bam 또는 dam입니다. |
UserSID, User, UserSource |
키 이름인 SID, 사용자 이름, 그리고 이름의 출처(sam, profile_list, well_known)입니다. |
Program |
Windows가 기록한 그대로의 값 이름으로, 장치 경로 또는 패키지 앱의 ID입니다. |
DevicePath, Path |
장치 경로인 경우 장치(\Device\HarddiskVolume3)와 그 장치상의 경로(\Windows\System32\cmd.exe)이며, 패키지 앱인 경우 비어 있습니다. |
LastRunUTC |
프로그램이 마지막으로 실행된 시간입니다(100ns 단위). |
KeyPath, KeyLastWrittenUTC |
사용자의 키와 그 마지막 쓰기 시간으로, 해당 키의 항목 중 하나가 가장 최근에 업데이트된 시간입니다. |
DataRaw |
값에 시간이 들어 있지 않은 경우(REG_BINARY가 아니거나 8바이트 미만) 값의 바이트(16진수)입니다. |
TransactionLogStatus, LogsApplied |
레지스트리 복구 컨텍스트입니다. |
Problems |
시간이 들어 있지 않은 데이터와 읽을 수 없는 값입니다. |
조사 전략¶
LastRunUTC로 정렬하고, 사용자가 쓰기 가능한 위치(\Users\,Downloads,Temp,ProgramData)에 있는 프로그램, 시스템 볼륨 이외의 장치에 있는 프로그램, 관리 및 원격 액세스 도구를 살펴보십시오.- 어떤 사용자가 실행했는지, 그리고 현재 프로필과 일치하지 않는 계정이 있는지 확인하십시오.
- Prefetch(실행 횟수 및 이전 실행), UserAssist(Explorer를 통한 시작), Amcache와 ShimCache(존재),
$MFT(프로그램 파일) 및 이벤트 로그와 상관 분석하십시오. - 삭제된 BAM 값을 찾으려면
--all-control-sets와parse-registry read --recover-deleted를 사용하십시오.
추가 정보¶
- libyal winreg-kb: Background activity moderator (BAM)
- Microsoft: 보안 식별자(잘 알려진 SID)
- ys-registry-parser
범위를 벗어난 마지막 실행 FILETIME은 LastRunUTC를 비워 두고 원래 값을 DataRaw에 보존하며,
Problems에 설명을 남깁니다. 최근 활동 요약은 각 호스트를 식별하고 서로 다른 하이브/사용자 관찰 결과를
구별하여 유지합니다.