본문 바로가기

reversing/Windows Driver

(16)
Buffered I/O Buffered I/O 방식 운영체제는 유저의 어플리케이션 버퍼와 같은 사이즈의 Non페이지한 시스템 버퍼를 할당한다. 쓰기 작업이 발생할 때는 드라이버 스택을 호출하기 전에 I/O 관리자는 유저의 데이터를 시스템 버퍼에 복사한다. 읽기 작업이 발생할 때는 드라이버 스택의 요청 작업이 완료된 후 시스템 버퍼를 유저 영역에 복사 한다 즉, 유저 영역의 데이터를 드라이버의 버퍼로 가져올 때, 드라이버 스택 전에 복사를 마친후 호출한다 [유저 -> 시스템 버퍼(IRP)] 반면에 시스템 드라이버의 버퍼에서 유저 영역의 버퍼로 데이터를 복사할 때는 드라이버에서의 활동이 모두 마친 후, 유저 영역의 데이터로 복사 [시스템 버퍼-> 유저] 서비스와 상호 동작하거나 느린 디바이스 또는 한번에 상대적으로 적은 양의 데이..
I/O Control Codes [IOCTL] 정리 IOCTL 관련 번역 I/O control code는 유저모드와 드라이버간에 통신을 위해서 사용되었고 같은 스택의 드라이버간에 통신을 위해서 사용되었다. I/O control code는 IRP를 이용해서 전달되어진다.유저 모드의 어플리케이션은 DeviceControl 함수를 호출함으로써 드라이버에 IOCTL을 전달한다고 MS SDK 문서에 설명되어있다.DeviceControl 함수를 호출 하는것은 I/O Manager가 IRP_MJ_DEVICE_CONTROL을 생성을 발생시키고 최상위에 있는 드라이버에게 전달한다.추가적으로, 상대적으로 상위에 있는 드라이버는 하위에 있는 드라이버에게 IRP_MJ_DEVICE_CONTROL와 IRP_MJ_INTERNAL_DEVICE_CONTROL의 IOCTL을 전송할 수 ..
MDL(Memory Descriptor List)[1] MDL의 구조체는 다음과 같이 구성되어있다. 12345678910111213typedef struct _MDL{ PMDL Next; SHORT Size; SHORT MdlFlags; PEPROCESS Process; PVOID MappedSystemVa; PVOID StartVa; ULONG ByteCount; ULONG ByteOffset;} MDL, *PMDL; cs 그리고 이제 아래 그림을 통해서 MDL을 설명한다. [그림1]그리고 해당 구조체 다음에 바로 유저의 가상 메모리와 매핑되는 물리 메모리를 가리키는 포인터가 존재한다.MDL에 어떠한 유저 프로세스에서 접근하는지 알 수 있는 eprocess 포인터 값과 MDL 간의 관계를 표현하기 위한 리스트(PMDL)도 존재한다.그리고 해당 MDL에서 설..
WinDBG 명령어 [CallStack] 콜 스택(call stack) 이란 컴퓨터 과학에서 실행할 컴퓨터 프로그램 코드 정보를 저장하는 스택 자료구조 라고 설명한다. Windbg에서 많이 사용되는 명령어가 call stack 과 관련된 명령어라고한다. 개인의 실력차에 따라서, stack frame을 변경하여서 디버깅이 가능하지만, 간단하게 사용법을 정리하려 한다. 블루 스크린이 났을때 많이 사용하지만, 동일한 원리에서 시작하기 때문에 ... The k*\** commands display the stack frame of the given thread, together with related information.. 위와 같이 설명되어 있다. k command 는 주어진 스택 프레임을 관련 정보와 함께 보여준다. 즉 현재 문맥의 스레드의 스택..
IRP, I/O Stack 관련 내용 정리 [3] [코드 출처] : https://www.youtube.com/watch?v=6gIbmod6Dpo&t=3807s 코드 설명 추가 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145..
IRP, I/O Stack 관련 내용 정리 [2] I/O Stack과 IRP관련 함수 정리 IoGetCurrentIrpStackLocation() 함수 Irp의 현재 스택을 위치를 가져옴, CurrentStackLocation 값 IoGetNextIrpStackLocation() 함수 Irp의 다음 스택 주소를 가져옴 IoSetNextIrpStackLocation 함수 IoSetNextIrpStackLocation 루틴은 호출자의 드라이버에 할당 된 IRP의 IRP 스택 위치를 설정 함 IoCallDriver 함수는 내부적으로 IoSetNextIrpStackLocation 함수를 호출 함 IoSkipCurrentIrpStackLocation 함수 IRP의 이전 스택 주소를 현재 스택 주소로 지정함 IoSkipCurrentIrpStackLocation 함..
Security Descriptors 보안 설명자(Security Descriptor)는 보안 오브젝트의 보안 관련 정보를 가지고 있다. 보안 설명자는 SECURITY_DESCRIPTOR 구조체로 구성되어 있다. 해당 구조체는 보안 정보와 관련되어 있다. 하나의 보안 설명자는 아래의 보안 정보를 포함하고 있다. 1. 오브젝트의 소유자와 그룹의 Security identifiers (SIDs)를 포함2. 특정 유저와 그룹의 접근/거부를 지정할 수 있는 DACL을 포함DACL? [https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa446597(v=vs.85).aspx]Discretionary Access Control List를 나타냄. 임의의 접근 제어 리스트이다. 리스트...해당 리스트의..
Minifilter - User Mode Communication 1. Filter Communication Port Object 보안을 고려하고, 다중 통신 채널을 구성하기 위해서, 미니필터 통신 포트(minifilter communication port)라는 새로운 오브젝트가 소개 됨.해당 오브젝트는 커널 유저 통신을 위해 사용된다. 커널 커널 통신은 현재는 지원되지 않고 있다. 하나의 포트는 보안 설명자(sd)가 있는 이름 있는 NT 오브젝트이다.필터 매니저는 새로운 오브젝트 타입인 FilterConnectionPort를 위와 같은 통신을 가능하기 위해서 만든다.필터 매니저는 이 새로운 오브젝트 타입을 만드는데, 어떤 미니필터가 로드 되기 전인, 드라이버의 시작 초기 루틴이 진행되는 동안에 만들어 진다. 커널 모드의 드라이버만 미니필터 통신 포트를 생성할 수 있음..