하나의 실행 파일은 다수의 프로세스로 실행 될 수 있습니다. 그리고 고유한 값인 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 해시 함수가 필요합니다.
커널에서 구현한 값을 앱에서 받아 찍어봤습니다. 잘 됩니다.
위 소스의 출처는요
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 |