Forensics/Windows Forensics

Printer Spooler 분석

한희수 2025. 2. 19. 18:07

스풀(Spool)이란 Simultaneous Peripheral Operation On-Line의 줄임말로서 중앙처리장치(CPU)에 비해 프린터 같은 주변장치의 속도가 느려서 발생하는 대기시간을 줄이기 위해 고안된 기법이다. CPU가 프린터 출력을 직접 제어한다면 프린터의 인쇄 작업이 끝날 때까지 다른 일을 할 수 없다. 그러므로 프린터로 전송될 데이터를 하드디스크에 저장하고 필요할 때마다 조금씩 프린터로 보내주는 동안 CPU는 다른 일을 처리할 수 있어 CPU 사용 효율을 향상시킬 수 있다.

 

프린터로 인쇄를 시작하게 되면 자동으로 스풀하는 목적으로 디스크에 파일 형태로 저장하게 된다. 경로는 아래와 같이 레지스트리에서 확인 가능하며 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Print\Printers의 DefaultSpoolDirectory 내 값을 변경하여 경로를 변경할 수 있다.

 

보통 스풀 파일 저장 경로는 C:\Windows\system32\spool\PRINTERS 이다.

 

인쇄할 때마다 생성되는 스풀 파일은 2개이다. SHD 확장자와 SPL 확장자를 가지는 2개의 파일이 생성된다.

  • SHD(Shadow File): 인쇄 정보(사용자명, 프린터명, 출력 파일명, 크기 등)
  • SPL(Spool File): 스풀링 데이터로서 실제 출력하는 데이터로 RAW, EMF 2가지 형식이 있다.
    • RAW: 원시 데이터로 전달하는 방식으로 장치에 따라 다르다.
    • EMF: Enhanced Metafile Format의 약자로 윈도우의 GDI 함수에 의해 생성되며 장치에 독립적이다.

 

SPL

문서의 인쇄 작업이 완료되면 생성된 스풀 데이터(.spl, .shd 파일)는 자동으로 삭제된다. 하지만 삭제된 스풀 파일은 하드디스크의 미할당(Unallocated) 영역과 페이징 파일(Pagefile)에서 복구할 수 있으며, 이를 통해 인쇄된 문서를 복원하는 것이 가능하다.

 

페이징 파일은 실제 메모리보다 더 많은 메모리가 필요할 때 하드디스크를 가상 메모리처럼 사용하는 파일이다. 멀티태스킹 환경에서 실행 중인 프로그램은 실제 메모리를 사용하지만, 백그라운드에서 실행되는 프로그램은 가상 메모리로 이동하여 시스템 속도를 최적화한다.

 

윈도우 운영체제에서 페이징 파일은 pagefile.sys와 swapfile.sys로 관리되며, 이 파일들은 자동으로 생성되고 크기가 10GB 이상으로 설정될 수도 있다.

 

SPL 문서는 Encase 같은 포렌식 분석툴을 이용하여 내용을 확인 가능하며 또한 freeware인 SPLviewer를 이용하여 내용을 알아낼 수 있다.

 

기본적인 스풀 모드는 RAW 방식이며 프린터 속성에 RAW 및 EMF 방식을 설정할 수 있다.

Windows Version Signature
Windows 98 0x494B
Windows NT 0x4966
Windows 2000 0x4967
Windows 2003 0x4968
Windows 10 0x5123
범위(Hex) 크기(Byte) 이름 설명
0x00 - 0x03 4 SpoolShadowFileFormat Win10 : 0x5123
0x04 - 0x07 4 HeaderSize  
0x08 - 0x09 2 Status  
0x0A - 0x0B 2 Padding  
0x0C - 0x0F 4 JobID  
0x10 - 0x17 8 Priority  
0x18 - 0x1F 8 OffsetUserName  
0x20 - 0x27 8 Offset_NotifyName  
0x28 - 0x2F 8 Offset_DocumentName  
0x30 - 0x37 8 Offset_Port  
0x38 - 0x3F 8 Offset_PrinterName  
0x40 - 0x47 8 Offset_DriverName  
0x48 - 0x4F 8 Offset_DEVMODE  
0x50 - 0x57 8 Offset_PrintProcessorName  
0x58 - 0x5F 8 Offset_DataType  
0x68 - 0x69 2 Year  
0x6A - 0x6B 2 Month  
0x6C - 0x6D 2 Day of week  
0x6E - 0x6F 2 Day  
0x70 - 0x71 2 Hour  
0x72 - 0x73 2 Minute  
0x74 - 0x75 2 Second  
0x76 - 0x77 2 Millisecond  
0x80 - 0x83 4 StartTime  
0x84 - 0x87 4 EndTime  
0x88 - 0x8F 8 SpoolFileSize  
0x90 - 0x97 8 PageCount