본문 바로가기

Windows/Kernel

프로세스 고유ID(ProcGuid)/부록: Kernel 모드에서 md5 해시 구하기.

하나의 실행 파일은 다수의 프로세스로 실행 될 수 있습니다. 그리고 고유한 값인 ProcessID를 가집니다.  ProcessID는 동시에 실행 중인 프로세스간 구분이 가능한 고유값이라 볼 수 있습니다. 하지만 종료된 프로세스의 ProcessID는 이 후 실행되는 또 다른 프로세스에 의해 재 사용될 수 있는 값이라 언제나 고유한 값은 아닙니다. 

 

제가 원하는 프로세스의 고유값 ProcGuid는 동일 장비, 동일 시각, 동일 파일이 실행된 프로세스라면 늘 같은 값이고 서로 다른 프로세스간엔 서로 다른 고유한 값을 보장하는 값입니다.

 

수많은 사용자의 수 많은 장비에서 수 많은 프로세스가 매번 실행될 텐데 각 프로세스마다 고유값인 ProcGuid를 주고 싶습니다.  ProcGuid로 누구의 PC에서 무슨 파일이 언제 실행된 것인지 정확히 특정하고 싶은 거죠.

 

간단한 방식으로는 프로세스 실행 시마다 UUID를 생성하고 저장하면 됩니다. 그런데 이 방식은 만들긴 간단해도 사용하긴 만족스럽지 않습니다. 

 

예를 들어

 

1. 프로세스 감지 프로그램 실행

2. 프로세스#1이 생성되어 ProcGuid #1을 UUID로 생성, 저장. 

3. 프로세스 감지 프로그램 종료(업데이트, 시스템 크래시 등등으로 인한)

4. 프로세스 감지 프로그램 실행

5. 프로세스 #1이 이미 동작 중.

 

이때 5의 경우 과연 프로세스 #1이 이전에 저장해둔 ProcGuid #1 이라 확신할 수 있을까요?

윈도의 svchost.exe 는 윈도 부팅 직후 다수가 실행되고 있고 ProcessID도 이전 부팅시와 동일할 가능성이 높습니다. 심지어 System 프로세스는 언제나 ProcessID 4로 실행됩니다. 

 

프로세스의 파일 경로, 생성 시각, ProcessID등의 비교로 이전에 저장해둔 ProcGuid와의 연관성을 찾을 수 있겠죠. 그렇다면 아예 ProcGuid 생성 시 단순 무식한 랜덤값이 아닌 프로세스의 정보들을 바탕으로 생성한다면 매번 확인하는 작업을 안해도 되겠죠?

 

저는 ProcGuid를 통해 어제 출근하고 부팅한 제 PC에서 실행된 System(ProcessID 4) 와 오늘 부팅하고 실행된 System (ProcessID 4)는 분명 서로 다른 프로세스이니 구분하고 싶은거죠.

 

그래서 위 조건을 만족하는 ProcGuid 생성 방법을 생각해봤습니다.

 

ProcGuid 생성시 사용되는 프로세스 정보

MachineGuid 윈도 설치시 설정되는 PC의 고유값. VM 생성 후 여기 저기 배포, 윈도 백업 후 복구 등등을 하면 같은 값이 검출되므로 언제나 고유한 값이라 보긴 어렵다. 
그래서 MachineGuid-BootId-CreateTime과 같은 조합으로 사용한다.
boot id CreateTime으로 대체 가능할 것 같다.
CreateTime 8바이트 정수
프로세스 파일 경로 파일의 구분자
PID 프로세스 아이디
PPID 부모 프로세스 아이디

이렇게 하면 겹칠 일이 없겠죠? 

 

MachineGuid:

 

MachineGuid

윈도가 설치 된 후 고유한 값이 있으면 뭔가 써 먹을 곳이 많겠다는 생각이 들어 검색을 해봤습니다. 그 장비의 고유값이 아니라 그저 윈도 설치 되었을 때만 고유한 값이면 충분합니다. 이후 다

overrun.tistory.com

boot id:

 

bootId 윈도 부팅 순번, 고유번호

개발을 하면서 이번 윈도 부팅 고유 번호 같은 것은 없을까라는 생각이 든 적이 있다. 예를 들면 부팅하고 딱 한번만 정보를 보내고 싶을 때 부팅 고유 번호가 있다면 정보를 보내고 보낸 부팅 ��

overrun.tistory.com

이 정도를 재료로 사용하면 각 프로세스마다 고유한 값이 생성되지 않을까요? 이 값들을 모두 붙여 나열하면 너무 기니까 이것들을 가지고 MD5 해시를 뜹니다. 

 

 

이젠 특정 프로세스의 정보들만 있으면 그것들을 재료로 언제나 동일한 값을 얻을 수 있겠고, 그 값은 다른 프로세스와는 구분되는 값이 되겠죠.

 

필요에 따라 ProcGuid 는 유저모드에서도 커널모드에서도 생성할 수 있어야 겠는데, 유저모드야 별 문제 없지만 커널모드에선 커널 모드 함수로만 구성된 MD5 해시 함수가 필요합니다. 

 

커널에서 구현한 값을 앱에서 받아 찍어봤습니다. 잘 됩니다.

 

md5.zip
0.00MB

위 소스의 출처는요 

 

Windows 드라이버 커널모드에서 파일 해시 구하기

일반적으로 보안 프로그램에 쓰이는 디바이스드라이버들은 파일이벤트, 레지스트리, 프로세스이벤트 등을 탐지하여 자신이 가지고 있는 정책에 따라 차단을 하거나 로깅을 합니다. 특히 특정 �

lucidmaj7.tistory.com

 

Calculate MD5 Hash of file in kernel mode - Programming

Calculate MD5 Hash of file in kernel mode - posted in Programming: Hello Everyone how i get MD5 hash of file on kernel mode driver? : \\?\\C:\\test.txt Thanks

www.rohitab.com

 

'Windows > Kernel' 카테고리의 다른 글

NT vs. Zw  (0) 2020.09.07
Thread Start Address  (0) 2020.09.05
Kernel Callback Functions  (0) 2020.08.01
anti dll injection  (0) 2020.08.01
드라이버 로드 후 파일 삭제하기.  (0) 2020.07.29