DeviceDriver MajorFunction 후킹 [ netstat ]

2018. 5. 15. 18:03악성코드 분석


DeviceDriver는 로드되면서 여러 형태의 IRP ( I/O Request Packet ) 를 처리하기위한 함수리스트를 초기화한다

MajorFunctionTable을 이용해서 여러 MajorFunction들의 주소를 관리한다 ( -> 변조할 함수의 해당 주소를 찾아내어 변조한다 )

드라이버는 시스템의 매우 낮은 레벨에서 동작하기 때문에 후킹하기 적절한 장소이다


* DeviceObject 검색 -> DriverObject 검색 -> MajorFunctionTable - MajorFunction 변조 의 순으로 후킹이 진행된다

* DeviceObject내에 DriverObject주소가 존재

* DriverObject에는 MajorFunctionTable이 존재하고 Table에는 해당장치에 관련된 MajorFunction들이 존재한다



실습에서는 netstat 명령어에 대한 후킹을 진행한다

[ netstat 작동 원리 ] 

cmd창에서 netstat 명령어 작동 

=> TCP/IP.sys에 포트에 대한 정보를 요청 

=> Kernel을 거쳐 결과물 출력


* TCP/IP.sys에 정보 요청이 들어왔을 때, 함수의 주소가 변조되어 있으므로 악성코드가 실행되고 변조된 정보를 돌려준다


[ Hooking 순서 ]

1. DeviceObject(TCP/IP) 획득

2. DriverObject 획득

3. MajorFunctionTable - MJ_DEVICE_CONTROL 주소 획득

4. 해당 주소를 악성함수로 변조



[1]  DeviceObject - "\\Device\\Tcp" 검색

DeviceObject를 검색한 후 DriverObject를 검색하였다

다음으로, MajorFunction[IRP_MJ_DEVICE_CONTROL] 함수를 실행된다

MJ_DEVICE_CONTROL을 HookedDeviceControl로 변조한다



 * HookedDeviceControl 코드



* HookedDeviceControl의 IoCompletionRoutine에는 netstat명령의 결과를 변조하는 코드가 존재한다

- 패킷의 출발지 포트번호가 80인 패킷을 숨기는 코드이다

- 결과물을 통해서 확인해보자



① sys파일을 build할 수 있는 환경을 구성해야한다 " x86 Checked Build Environment "


Rootkit.c & Rootkit.h 파일을 build해서 sys파일을 생성한다 - DeviceDriver file


③ netstat가 사용하는 함수들을 변조하기 전과 후의 결과이다

출발지 포트가 80번의 네트워크는 보여주지 않아 Driver의 MajorFunction후킹을 통한 루트킷이 성공한 모습이다