핵 대응중, 게임 실행중에 계속 켜놓지 않아도 되는 핵 부류가 많이 있다.
이번 경우엔 한번 데이터 변조만 하면 어떻게든 OK되는 경우였는데,
보안 솔루션이 시작되고 초기화되기 전에 뭔가 핵 동작에 필요한 작업을 슈슈슉 하고 종료가 된다면 이를 탐지 할 방법이 있을까? 라는 생각이 들어 종료된 프로세스 탐지 방법을 찾아보았다.
Prefetch 파일 검사와 Process Carving 이라는 방법이 있다.
Prefetch 파일 검사의 경우 파일을 지운다면 탐지가 불가하기 때문에 제외다.
Process Carving이란 프로세스가 실행 되면서 메모리에 각종 정보들이 로드될 것이고, 프로세스가 종료되더라도 이 모든 정보가 종료되는 순간 전부 사라지지는 않는다는걸 이용한 방법이다.
다만 저 방법은 포렌식에서 사용하는 방법으로 Dump 파일을 뜨고, 몇가지 조건을 걸어 _EPROCESS 구조체 형태에 맞는 메모리를 모두 추출하는 것이었다.
가장 확실한 방법인 것 같긴하지만 이걸 실제 라이브에 적용 할 수 있을지 너무 애매했다.
게임중에 드라이버에서 커널 메모리를 계속 스캔하자니 과부하도 우려되고, 천천히 스캔하게 되면 모든 메모리를 서치하는데 상당한 시간이 소요될게 분명하기 때문이다.
좀더 고민을 하다보니 게임중에(보안 솔루션이 시작된 후) 실행되는 프로세스는 드라이버에서 충분히 감지가 되고, 초기화 과정중에는 CPU에 어느 정도 과부하는 문제가 없겠다라는 생각이 들어 초기에 한번만 수행을 한다면 괜찮을 것 같다는 생각이 들었다.
코드를 작성하고 계속되는 예외처리와 블루스크린을 거치며 테스트를 마쳤다.
결과부터 얘기하자면 실패다. ㅠㅠ
현재 실행되고 있는 프로세스는 물론 종료된 프로세스도 탐지가 되긴 된다.
하지만 종료된 프로세스가 탐지되기 위해서는 그 메모리가 그대로 있어야만 가능했다.
프로세스와 관련된 메모리가 해제된다거나 다른 데이터로 덮여 쓰여진다면 여러가지 추가해놓은 예외처리 조건에 맞지 않기 때문에 실제 일부 정보는 남아 있더라도 감지 할 수가 없었다. 예외처리 조건을 조금 줄인다면 탐지가 가능하긴 했지만 뭔지도 모를 메모리 공간이 너무 많이 잡혀버려 쓸 수가 없었다.
또 하나 걸리는 부분은 32bit 커널의 경우 0x80000000부터 0xFFFFFFFF 까지 비교적 적은 메모리 영역만 탐지를 하면 되지만, 64bit의 경우 범위가 너무 크다. Non Paged Pool 영역의 범위만 해도 상당하다.
실제로 찾으려는 데이터는 일부분이라 전부 탐지 할 필요는 없을 것 같지만 어떠한 환경에서 어디까지 쓸지를 알 길이 없기에 전체를 검색하는게 가장 이상적인 방법으로 보인다.
아래는 Kernel Virtual Address Space에 대한 정보이며 아래에서 2번째 Non-Paged Pool 영역을 보면 512GB이다.
(참조 : http://www.codemachine.com/article_x64kvas.html)
계속 고민하고 다른 방법은 없을지 연구하고 찾아봤지만 내공이 부족해서인지 방법이 떠오르지 않는다.
일단 보류!
'Kernel mode' 카테고리의 다른 글
PspCidTable, ObTypeIndexTable, _HANDLE_TABLE_ENTRY -> ObjectPointerBits (0) | 2013.11.26 |
---|---|
ConfigFlags (0) | 2013.11.15 |
Windows Kernel (0) | 2013.08.20 |
PsLoadedModuleList (0) | 2013.08.19 |
ObjectHook - OpenProcedure (0) | 2013.08.06 |