Reversing
Device driver does not install on any devices, use primitive driver if this is intended
깃허브등에서 드라이버를 빌드해야하는 프로젝트를 가져와 빌드할때 가끔 이런 문제가 발생하는데 해당 드라이버 파일의 .inf 파일을 열고 [Manufacturer] 섹션에 있는 데이터들을 날려주면 깔끔하게 빌드가 된다. https://stackoverflow.com/questions/64197518/device-driver-does-not-install-on-any-devices-use-primitive-driver-if-this-is-i
[Windows kernel] Service hiding - InLoadOrderLinks
커널 드라이버 숨기기 서명이 되어있지 않은 or 만료된 드라이버의 경우 대부분의 보안 도구에서 차단함. 취약 드라이버의 경우는 서명이 만료됨 임의로 제작한 드라이버의 경우는 서명이 되어있지 않음. 따라서, 임의로 제작하였거나 취약한 드라이버를 보안도구에서 차단하여 공격을 방어하는것이 목적임. 이러한 보호기법을 우회하기 위해 생성한 서비스와 로드한 드라이버를 숨기는 행위가 필요함. 드라이버와 관련된 정보를 담고있는 객체들을 각각 조작하는 DKOM 을 진행하는 방식으로 커널에 로드된 모듈을 숨긴다. 모듈에 대한 정보는 유저와 커널 모두에서 각각 조회가 가능하므로, 둘 모두에서 알 수 없게 해야한다. 로드된 드라이버가 자기 자신의 정보를 숨기는 식으로 동작하고 , 유저모드에서는 단순히 드라이버를 로드하는 기능..
[Hooking] 8. D3D Hooking : dx9, dx11 후킹 실습
DirectX 후킹 방식과 과정에 대해 다시 정리해보면, EndScene 함수 후킹 한번의 랜더링이 끝날 때 마다 EndScene 함수가 호출됨 해당 함수를 후킹하면 매 렌더 프레임마다 원하는 동작 수행 가능 주로 이를 통해 화면 위에 그림을 그릴 수 있음. 따라서 EndScene 함수의 주소가 필요함. VTable 시작주소 탐색 EndScene 함수는 D3d9.dll의 VTable 공간에 담겨있음. CreateDevice 함수 어셈블리 코드 패턴 탐색을 진행하여 VTable 시작주소를 얻어올 수 있음. VTable 찾아 인덱스 번호 참조하여 EndScene 함수 시작주소 가져올 수 있음. Detour 후킹 원본함수의 실행코드 시작부분을 패치하여 코드 흐름을 바꾸는 Inline 후킹의 한 종류 원본함수의..
[ Window Device Driver ] 7. Windows10 환경에서 PspCidTable 이용한 Process Listing (Traverse) - HANDLE_TABLE_ENTRY 구조
Process Listing Handle? 자원에 대한 '추상적인' 참조 어플리케이션이 다른 시스템에서 관리되는 메모리 블록이나 객체를 참조할 때 사용 파일 디스크립터, 파이프, 소켓, DB 연결 소켓, PID 등등 Objcet Handle 커널 오브젝트에 접근하기 위해 만들어진 핸들 커널 리소스에 직접 접근하는 대신, 핸들을 통해 간접적으로 참조할 수 있음. 커널 오브젝트가 생성되면 생성된 오브젝트를 가리키기 위해 오브젝트 핸들이 반환됨. 프로세스가 초기화 되었을 때 각 프로세스별로 사용할 수 있는 오브젝트 핸들 테이블이 할당되어 테이블의 형태로 오브젝트 핸들을 관리. 프로세스마다 독립적으로 관리됨. Kernel Object Handle Table 커널 오브젝트의 핸들 정보를 저장하는 테이블 핸들을 통..
[ Window Device Driver ] 6. DKOM Process Hide 탐지
DKOM - ActiveProcessLinks 조작 Process Hide 커널 오브젝트에 직접 접근하는 DKOM 기법을 이용 EPROCESS 구조체 ActiveProcessLinks의 FLINK와 BLINK를 변조 연결리스트 형태로 존재하는 프로세스 목록의 연결을 끊어버려 특정 프로세스를 감춤. ZwQuerySystemInformaion() 함수를 이용해 프로세스 데이터를 받아오는 경우 프로세스를 찾을 수 없게 된다. 따라서 ActiveProcessLinks가 아닌 다른 데이터를 가지고 프로세스 리스트를 받아와야한다. HandleTableList EPROCESS 구조체 속 ObjectTable 필드 내부에 존재함 해당 필드는 HANDLE_TABLE 구조를 가짐 ActiveProcessLinks 와 동일..
[ Window Device Driver ] 5. Process Hide - DKOM(디컴) : ActiveProcessLinks
DKOM? Direct Kernel Object Manipulation 직접 커널 객체 조작 커널 오브젝트 - 프로세스, 드라이버, 파일등에 대한 정보를 조작하는 기법 함수 테이블이나 Native API 등에 대한 hooking등을 거치지 않고 커널 오브젝트를 직접적으로 조작한다. 프로세스 리스트를 받아오는 원리가 EPROCESS 구조체에 들어있는 멤버들에 의존적임 따라서 객체 멤버를 조작하는 방식으로 다른 부분에 영향을 미치지 않고 조작가능 오브젝트의 구조와 그 구조체 속 멤버등의 전체 구조, 역할 등을 완벽하게 파악하고 이해해야함. 업데이트시 커널 버전에 따른 변화와 그 영향을 인지하고 있어야함. PEB - Process Environment Block User Mode 에서 프로세스 정보를 가짐 각..
[ Window Device Driver ] 4. 프로세스 리스트 출력 : ZwQuerySystemInformation
목적 이번엔 커널레벨에서 프로세스 목록을 가져와 디버깅 메시지로 출력하는 동작을 수행해보려고 한다. 조건이 몇가지 있는데 오프셋 하드코딩 하지 말것 프로세스별로 오프셋 n바이트 위치에 있는 값을 가져오지 않게 특정할 수 있는 기준 오프셋을 항상 동일하게 뽑을수 있는 경우를 상정하기 호환성 준수할것 OS 버전에 따라 사용하는 구조체나 함수가 최대한 달라지지 않을 것 다른 OS 커널 버전에서 사용하지 않는 구조의 사용은 피할 것 최대한 알려진 구조를 사용할 것 공식 문서에 나와있는 구조체와 함수 사용 아래 웹사이트에서 커널 버전별로 문서화되지 않은 커널 구조들에 대해 찾아볼 수 있다. https://www.vergiliusproject.com Vergilius Project Take a look into t..
[Window Device Driver] 3. IOCTL
IOCTL Input / Output ConTroL 응용 프로그램에서 장치 드라이버와 직접 통신할 수 있는 장치 입출력 제어 인터페이스 DeviceIoControl 함수에서 이를 제공 제어코드 기반으로 드라이버에서 수행할 작업을 지정하여 응용프로그램이 이를 드라이버에 전송, 동작 수행을 제어할 수 있음. DeviceIoControl 컨트롤 코드를 다양한 장치로 보낼 수 있는 범용 인터페이스 각 제어코드는 드라이버에서 수행할 작업을 나타냄 ioapiset.h → Windows.h 안에 포함 IRP (IO Request Packet)에 의해 전송됨. 드라이버에선 DrirverObject→MajorFunction[] 에 의해 수신되어 동작 수행 정의함. 양방향성을 가져 유저모드 어플리케이션과 커널 드라이버 모..
[Window Device Driver] 2. 커널 드라이버 디버깅 - VirtualKD 환경 구성 + CPP 커널 드라이버 로더 제작
진행해볼 순서 드라이버 로더 제작 올라갈 드라이버 제작 환경에 디버거 (VirtualKD) 연결 + 로컬에 winDBG 세팅 실습 환경 가상 OS : Windows10 20H2 - 19042.1237 로컬 OS : Windwos10 21H1 - 19043.1348 VS : Microsoft Visual Studio Community 2019 - 16.10.3 .NET : Microsoft .NET Framework 4.8.04084 CPP : Visual C++ 2019 00435-60000-00000-AA581 DBG : Debugging Tools for Windows 10.0.19030.1000 driver kit : Windows Driver Kit 10.0.19030.1000 1. 드라이버 로더..
[Window Device Driver] 1. 환경구성 및 기초
윈도우 커널 구조 Ring 0 - Kernel Ring 1 - Device Driver Ring 2 - Device Driver Ring 3 - Applications RING 0~2까지가 Kernel-Mode , RING3는 User-Mode로 동작. 응용 프로그램 (Apllication)이 하드웨어 장치에 접근하기 위해서는 드라이버가 필요함. 커널모드는 기본적으로 사용자가 접근 불가능. 현재 윈도우 커널모드에서 RING 1과 2는 사용하지 않고 RING0 만을 사용한다. 대부분의 응용 프로그램들이 RING3에서 유저모드로 동작함. NT 서비스 프로그램 : 윈도우 계정 로그온/로그아웃에 무관하게 항시 동작하게 만드는 프로그램 형태. 디바이스 드라이버는 NT 서비스 형태로 시스템에서 동작하여 항시 상주하..