안티포렌식 — 왜 지우고 무엇이 남는가
기록을 없애려는 이유는 SS를 대비해서다. 그런데 없애는 행위 자체가 또 다른 기록을 만든다. 아래는 지우는 방법이 아니라 지운 자리에 남는 공백을 읽는 법이다.
왜 지우려 하나
유저모드 치트는 실행·파일 흔적을 많이 남긴다. 검사자가 Prefetch·USN·BAM을 본다는 사실이 알려진 뒤로 동기는 단순해졌다.
- 실행 후보를 목록에서 빼기
- 삭제나 교체를 "원래 없던 것"처럼 보이기
- 스캐너가 디스크 시그니처를 못 찾게 하기
- 의심 파일을 정상 파일처럼 위장하기
지우면 남는 것
| 대상 | 시도가 남기는 것 | 카드 |
|---|---|---|
| Prefetch | .pf DELETE / 읽기전용, EnablePrefetcher=0 | R3-PF, R3-AF |
| USN | Application 3079, 저널 생성 시각 > 부팅 시각(CheckDeletedUSN) | R3-USN |
| 이벤트 | 1102 Security, 104 System | R3-AF |
| BAM | 키 공백. 미실행과 구분 필요 | R3-BAM |
| 휴지통 | $Recycle.Bin 시각이 freeze 시점과 맞음 | R3-AF |
| 이벤트 채널 | 채널이 비활성 상태라는 사실 자체, 비기본 로그 경로 | R3-AF |
| 명령 히스토리 | 파일 공백·부분 공백, 저장 설정 변경, 파일 권한(ACL) 거부 | R3-AF |
| 셸·앱 기록 | RunMRU·Recent·앱 로그의 공백 또는 새 생성시각 | R3-REC, R3-AF |
| 파일 교체 | USN DELETE 직후 같은 이름 CREATE, 현재 파일 생성 시각 > PF 마지막 실행 시각 | R3-USN, R3-SIG |
| Defender | 1013(보호 기록 삭제), 5001(실시간 보호 꺼짐), 5007(예외 추가를 포함한 설정 변경), 예외 레지스트리 값 | R3-AF |
| 볼륨 섀도 복사본 | vssadmin list shadows에 남은 목록, 삭제 도구(vssadmin.exe·wmic.exe·PowerShell)의 실행 흔적 | R3-AF |
이름과 위장으로 숨기기
파일을 지우는 대신 정상 파일처럼 보이게 만드는 부류다.
| 기법 | 하는 일 | 남는 것 | 대응 |
|---|---|---|---|
| 확장자 위장 | .exe를 .jpg·.txt로 바꾼다 | Prefetch는 실제 실행 파일만 기록, USN RENAME | .pf와 USN 파일명 대조. "그림 파일인데 Prefetch가 있다"는 모순 |
| 유니코드·경로 위장 | RLO·동형문자·공백으로 이름을 속인다 | USN에 원래 유니코드 경로가 남음, 바이트 대조 시 다른 이름 | 파서로 원본 경로 확인, hex 뷰로 바이트 비교 |
| ADS(대체 데이터 스트림) | 파일 뒤에 데이터를 숨긴다 | USN에 :$DATA 스트림 변경, dir /r·streams로 열거 | 폴더 크기와 파일 크기 불일치, ADS 열거 도구 |
| 파일 속성·읽기전용 | .pf나 로그를 읽기전용으로 건다 | USN BASIC_INFO_CHANGE, attrib 명령 기록 | USN에서 속성 변경 플래그 확인 |
| hex·바이너리 교체 | 파일 안의 문자열을 바꿔 스캐너 시그니처를 피한다 | 파일 해시가 공식 배포본과 다름, 서명이 깨짐 | 해시 비교, 서명 검증 |
이 흔적들에도 정상 설명이 있다. ADS는 정상 프로그램도 쓰고(Zone.Identifier), 읽기전용은 정리 도구나 사용자 습관일 수 있다. 한 가지만 보지 말고 실행 흔적과 교차한다.
삭제와 교체
| 기법 | 하는 일 | 남는 것 | 대응 |
|---|---|---|---|
| 삭제 | 파일을 지운다 | USN DELETE, Prefetch·BAM 잔여 | 저널·레지스트리 교차 |
| 교체 | 지우고 같은 이름으로 다시 쓴다 | USN DELETE→CREATE, 현재 파일 생성 시각 > PF 마지막 실행 시각 | 시각 불일치 |
| 휴지통 | 삭제 후 휴지통에 두거나, "즉시 삭제"로 설정해 아예 거치지 않게 한다 | $Recycle.Bin 메타데이터에 원본 경로와 삭제 시각. 즉시 삭제 설정은 레지스트리 값으로 남고, 휴지통이 비어 있어도 USN DELETE는 그대로다 | 휴지통 파서로 원본 복원, 휴지통 설정 값 확인 |
| 타임스탬프 조작 | 파일의 생성·수정 시각을 바꾼다(.pf의 LastWriteTime 포함) | USN에 실제 변경 시각이 남아 속성과 불일치, $SI 조작 흔적 | 저널 시각 vs 파일 속성 비교 |
| 스테가노·숨김 내용 | 정상 파일 안에 데이터를 숨긴다 | 파일 크기·엔트로피 이상, 추출 도구의 실행 흔적 | 파일 크기 베이스라인 대조, 실행 흔적 |
파일이 지워져도 "지워졌다"는 기록은 남는다. 그 기록을 지우면 또 다른 기록이 생긴다.
로그와 저널을 지울 때
로그가 있는가보다 로그가 손대지 않았는가가 먼저다. 채널이 활성 상태인가, 저장 경로가 기본인가, 권한이 기본인가, 이벤트 순서와 시각이 맞는가, 공백이 어디 있는가. 이 무결성이 로그의 내용보다 먼저다.
| 기법 | 하는 일 | 남는 것 | 대응 |
|---|---|---|---|
| 이벤트 로그 삭제 | Security·System 로그를 지운다 | 1102 Security, 104 System 이벤트 | 삭제 이벤트 자체가 신호 |
| USN 저널 삭제·재생성 | 저널을 지우고 다시 만든다 | 저널 생성 시각 > 부팅 시각, Application 3079 | fsutil로 저널 상태 확인, 부팅 시각과 비교 |
| Prefetch 삭제·억제 | .pf를 지우거나 SysMain을 끈다 | Prefetch 공백 + SysMain ON/서비스 상태, EnablePrefetcher 레지스트리 | Prefetch 폴더가 비었는데 서비스는 켜져 있으면 신호 |
.pf 내용 비우기 | .pf를 지우지 않고 파일 안의 내용만 지운다 | 파일은 있는데 내용이 빈다. USN에 DATA_TRUNCATION(내용을 잘라낸 변경 플래그), 파일 시각과 내부에 기록된 실행 시각의 불일치 | 파서로 연 .pf가 공백인지 확인, 저널 변경 플래그 |
| BAM 정리 | BAM 키를 지운다. 수동으로 지우려면 먼저 키 권한을 바꿔야 한다 | BAM 공백 + 대상 키의 권한 변경(기본에 없는 ACL 항목), regedit 실행 시점. 그러나 미실행과 구분이 어렵다 | 다른 실행 축(PF·USN·4688)과 교차, 키 권한 화면 |
| BAM 시각 편집 | 삭제 대신 실행 시각 값만 바꾸는 도구를 쓴다 | BAM의 시각과 Prefetch·USN의 시각이 어긋난다. 편집 도구 자체의 실행 흔적 | 축 간 시각 불일치, 도구 실행 기록 |
뷰어의 날짜·시간 열을 숨기는 시도도 있다. 보기 설정만 바뀔 뿐 로그 파일은 그대로라 실효는 없지만, 시도 자체는 태도의 신호다.
명령 기록을 지울 때
PowerShell은 실행한 명령을 ConsoleHost_history.txt에 남긴다. 스크립트로 치트를 실행한 사용자의 다음 목표는 이 파일이다.
| 기법 | 하는 일 | 남는 것 | 대응 |
|---|---|---|---|
| 저장 끄기·경로 변경 | Set-PSReadLineOption -HistorySavePath 같은 설정으로 저장을 끄거나 다른 경로로 돌린다 | $PROFILE의 설정 문자열, 히스토리 파일 부재·공백과 PowerShell 사용량의 불일치 | 프로필의 설정 변경, 비기본 히스토리 경로 |
| 기록 회피 주석 | password 같은 단어가 든 줄을 PSReadLine이 기본으로 기록하지 않는 점을 써서, 명령 끝에 그런 주석을 붙인다 | 파일은 있는데 세션 명령 일부만 빠진 패턴, 주석 문자열 자체 | 히스토리의 불연속 구간, 해당 문자열 검색 |
| 히스토리 선택 삭제 | 파일을 통째 지우지 않고 명령 일부만 뺀다 | 세션의 특정 구간만 빠진 패턴 | 다른 흔적의 실행 기록과 히스토리 내용의 불일치 |
| 다른 호스트 사용 | 이 히스토리를 안 쓰는 호스트(powershell_ise, PowerShell 2.0 등)에서 실행한다. Windows 11 24H2는 2025년 8월 릴리스부터 2.0이 빠져 -Version 2를 붙여도 5.1로 실행된다 | 대체 호스트 자체의 .pf, 호스트별 별개 히스토리 파일. 2.0이 빠진 빌드에서 2.0 엔진이 동작하면 재설치 흔적(ps2DLC.zip·loadGAC.ps1)이 있다 | powershell 외 호스트의 실행 흔적, 빌드에 맞지 않는 2.0 동작 |
셸과 앱의 기록을 지울 때
Windows와 각 앱이 따로 남기는 기록이다. OS 로그가 온전해도 이쪽만 비어 있으면 같은 결론이다.
| 기법 | 하는 일 | 남는 것 | 대응 |
|---|---|---|---|
| RunMRU 삭제 | Win+R 실행 목록(RunMRU)의 값을 지운다 | 최근 실행이 있는데 RunMRU가 비었거나 새 값만 있다 | 레지스트리 값 목록과 실행 흔적의 불일치 |
| 최근 문서 끄기 | 최근 문서를 안 남기는 정책을 켜거나 폴더 권한을 막는다 | 정책 레지스트리 값 자체, 폴더의 비정상 권한 | shell:recent가 비었는데 다른 축엔 열람 흔적이 남는 불일치 |
| 게임 로그 삭제 | .minecraft의 logs 폴더나 계정·모드 json을 통째 지운다 | 폴더가 통째 없거나 생성시각이 새 것, 있어야 할 json 부재, USN 삭제 체인 | 폴더 시각과 USN 교차 |
| 원격 도구 기록 삭제 | AnyDesk 같은 원격 도구의 appdata를 지워 연결 기록과 식별자를 없앤다 | 설정 파일만 골라 남은 선택적 삭제 패턴, trace·연결 로그 부재, 갑자기 바뀐 식별자 | 남은 파일의 선택성, 이전 연결의 다른 축 잔재 |
안 지우고 동작을 바꿀 때
| 기법 | 하는 일 | 남는 것 | 대응 |
|---|---|---|---|
| 채널 비활성화 | 이벤트 채널(로그 종류별 저장소)을 통째로 "사용 안 함"으로 둔다 | 채널이 비활성 상태라는 사실 자체, 비활성 시점 이후의 로그 공백, 재활성화 흔적 | 채널 등록정보의 활성 상태 확인 |
| 로그 경로 변경 | 로그 파일의 저장 경로를 바꿨다가 되돌린다 | 채널 등록정보의 비기본 경로, 경로 변경 구간의 타임라인 공백, 로그 디렉터리의 비표준 파일 | 로그 경로가 기본인지 확인 |
| 서비스 스레드 억제 | SysMain·로깅 서비스를 멈추지 않고 스레드만 정지 | 서비스 Running + Suspended 스레드, 기록은 끊김 | 서비스 상태와 로그 공백의 불일치 |
| 서비스 비활성화 | 기록을 남기는 서비스를 통째로 끈다 | System 7040/7036 서비스 상태 변경 이벤트, sc qc의 시작 유형, 비활성 상태 자체, sc config TabletInputService 계열 명령의 실행 흔적 | 서비스 상태와 그 시점 이후의 기록 공백 |
| 기록 경로 ACL 거부 | Prefetch 폴더·히스토리 파일·스캐너가 여는 경로를 icacls …/deny 계열로 쓰기·읽기 거부 | 정상 상태에 없는 Deny 항목, USN의 SECURITY_CHANGE, icacls.exe의 .pf | 폴더 보안 탭의 Deny 항목 확인 |
| 시계 조작 | 부팅 시각으로 되돌리거나 시스템 시계를 바꾼다. 로그 경로 변경과 겹쳐 "예전에 지웠다"로 위장하기도 한다 | 이벤트 4616(시스템 시간 변경)과 Kernel-General 1, USN이 부팅 시각에 몰림, 이벤트 순서와 타임스탬프 불일치 | 이벤트 로그에서 4616, 타임라인 비일관성 |
| 설정 변경 | HVCI·IOMMU·감사 정책을 끈다 | 설정 값 자체가 환경 노트에 남음, CodeIntegrity 이벤트 | msinfo32·코어 격리·감사 정책 확인 |
| 개인정보 설정 끄기 | 활동 기록을 남기는 Windows 개인정보 설정을 끈다 | 설정 값 자체(레지스트리), 기록이 갑자기 끊긴 시점 | 설정 상태와 기록이 끊긴 지점의 대조 |
커널에서 저널 구조를 직접 고치려는 시도는 PatchGuard에 걸리거나 BSOD로 실패했다는 보고가 있다.
격리된 볼륨과 파일시스템
| 기법 | 하는 일 | 남는 것 | 대응 |
|---|---|---|---|
| VHD·마운트 해제 | 가상 디스크에서 작업하고 분리한다 | 사라진 드라이브 문자, VHD 마운트 도구의 Prefetch·USN | 드라이브 문자 불일치, 마운트 도구 실행 흔적 |
| FAT32·exFAT | 저널이 없는 파일시스템을 쓴다 | 저널 자체가 없음. 파일시스템 타입이 기록에 남음 | 볼륨 파일시스템 확인, 다른 축(PF·BAM·이벤트)에 의존 |
| 가상 머신 | 치트나 정리 작업을 가상 머신 안에서 하거나, 게임을 게스트에서 돌리고 SS를 게스트에서 받아 호스트를 가린다 | 게스트 안에서 한 일은 게스트 디스크에만 남는다. 호스트에는 가상화 프로그램의 실행 기록과 드라이버·가상 NIC가 남고, 게스트에는 가상 하드웨어가 보인다 | SS가 도는 쪽이 게스트인지 먼저 확인한다(시스템 정보와 장치 목록의 가상 하드웨어). 가상화 드라이버는 FP 베이스라인에 있다 |
| Windows Sandbox | 일회용 샌드박스(Windows 10 1903 이상, Pro·Enterprise·Education)에서 실행하고 닫는다 | 샌드박스는 별도 커널로 도는 일회용 가상 환경이라 닫으면 안의 파일·상태가 모두 지워지고, 안에서 실행한 것은 호스트 Prefetch·SRUM에 남지 않는다. 호스트에는 선택적 기능 활성 상태(Containers-DisposableClientVM), .wsb 구성 파일(공유한 HostFolder, LogonCommand), 샌드박스를 띄운 실행 기록이 남는다. 공유한 호스트 폴더의 변경은 호스트 파일시스템에서 일어난다 | 기능 상태와 .wsb 파일 확인. Windows 11 24H2에서 스토어로 받는 새 버전은 wsb 명령을 제공해 wsb list로 실행 중인 샌드박스를 볼 수 있다. Home 에디션에는 이 기능이 없다 |
너무 깨끗함
정상 PC도 깨끗할 수 있다. 새로 설치했거나, 프라이버시 도구를 쓰거나, 개발용 이미지인 경우다. 그래서 다음을 확인한다.
- 게임·런처·Discord의 Prefetch는 있는가? 그것들은 있는데 치트 후보만 없다면 이야기가 다르다.
- 제보된 매치 시각에 실행 후보가 전부 비어 있는가?
- 서비스나 프리페처가 의도적으로 꺼져 있는가?
- 이벤트 채널이 활성 상태이고 로그 경로·권한이 기본인가? 로그가 있는 것과 로그가 온전한 것은 다르다.
- 스캐너가 원래 조용한(Silent) 것인가, 아니면 히트를 지운 것인가?
공백을 Clean으로 메우지 않는다. 이런 경우 Insufficient가 정직한 라벨일 때가 많다.
공백을 읽는 법
공백은 데이터다. 다만 읽는 법이 있다.
- 공백 + 다른 축 정상 = 그 축만 비어 있다는 뜻이다. 왜 비었는지 기록한다.
- 공백 + 삭제 이벤트 = 지워진 것이다. 안티포렌식 신호다.
- 공백 + 로그 상태 변경 = 채널 비활성·경로 변경·권한 거부처럼 로그를 건드린 흔적이다. 내용보다 로그의 상태를 먼저 본다.
- 공백 + 모든 축 공백 = 새 설치, 프라이버시 도구, 또는 매우 철저한 정리다. Insufficient가 맞는 결론이다.
- 공백 없음 + 치트 없음 = 정상이다.
한 축의 공백은 Suspicious의 재료일 뿐 Confirmed의 근거가 아니다. 공백이 여러 축에 같은 시간 창에 모이고, 삭제 이벤트나 서비스 불일치가 동반될 때 Suspicious가 된다.
Community
Community. 아래는 커뮤니티 진술의 의역이며 규범이 아니다.
- 저널을 지우면 티가 난다는 것을 알기 때문에, 아예 기록을 안 남기거나 시각만 속이려 한다는 이야기가 반복된다.
- "디스크만 가리면 된다"고 시작했다가, 같은 글에서 BAM·ShimCache·Amcache가 남는다고 스스로 인정하는 경우가 있다.
- Echo·Napse 같은 도구를 디스크 스캐너로 부르는데, 조용하면 메모리를 봐야 한다는 뜻이다.
- 흔적 제거 도구가 상품으로 유통되지만, 그 도구 자체의 Prefetch가 남는다.
- 서비스는 Running인데 스레드가 죽어 있으면 디스크를 안 건드리고 막은 것이라는 이야기가 있다.
- 원격 도구의 appdata를 지우되 설정 파일 하나만 남기면 서버가 보는 식별자까지 리셋된다는 조언이 있다. 선택적으로 남은 파일과 갑자기 바뀐 식별자가 그대로 흔적이다.
- 게임 폴더의 logs와 json을 통째 지우라는 조언이 반복된다. 폴더 생성시각이 새 것이면 그대로 드러난다.
- 게임은 가상 머신 게스트에서 돌리고 치트는 호스트에서 돌려 SS를 게스트에서 받게 하는 우회가 가이드에 소개된다. 대응으로는 msinfo32의 시스템 모델·BIOS 버전,
vmtoolsd.exe·VBoxService.exe같은 게스트 도구 프로세스를 보라고 안내한다.
흔한 실수
- "공백이 있으니 Confirmed"라고 결론 낸다.
- 3079 하나만 보고 밴을 단정한다. 서버 정책은 서버의 몫이고, 루브릭은 교차를 요구한다.
- "스캐너가 조용하니 Clean"이라고 닫는다. Silent는 Clean이 아니다.
- 새 설치 PC를 "너무 깨끗하니 의심"으로 읽는다. 설치 시각을 먼저 본다.
Sources
- 이벤트 1102 · 이벤트 4616 · USN Change Journals · PSReadLine
- MITRE ATT&CK: T1070 지표 제거 · T1070/001 로그 삭제 · T1070/003 명령 기록 삭제 · T1070/004 파일 삭제 · T1070/006 타임스탬프 · T1562/002 이벤트 로깅 무력화 · T1564 아티팩트 숨기기 · T1564/004 NTFS 파일 속성
- MS Learn Windows Sandbox: 개요(에디션·일회용 환경) · 설치(Windows 10 1903 이상,
Containers-DisposableClientVM) ·.wsb구성 파일 · 명령줄wsb(Windows 11 24H2) · 버전 - Microsoft Defender Antivirus 이벤트 ID · vssadmin list shadows · KB5065506: Windows에서 PowerShell 2.0 제거
- RedLotus Guide: 가상 머신 우회
- 안티포렌식 카드
