본문 바로가기

windows34

세션0(session 0) 격리 윈도우 서비스에 미치는 영향 세션0(session 0) 격리 윈도우 서비스에 미치는 영향 윈도우XP, Server 2003을 포함한 이전 버전에서는 모든 서비스가 같은 세션 0에서 실행 되었습니다. 세션 0에서 실행되는 서비스들과 유저 애플리케이션은 보안적인 문제가 있을 수 있었습니다. 서비스는 상승된 권한(Privilege)에서 실행되었으며 이러한 서비스들은 권한 상승을 노리는 악성프로그램에 대한 타겟이 되었기 때문입니다. 윈도우 비스타(Server 2008) 이후 버전에서는 세션0에서 실행되는 서비스들을 격리시키고 세션0를 비 대화식(noninteractive)형태로 만들어 보안적인 위협에 대응하게 되었습니다. 시스템 프로세스들과 서비스들은 오직 세션 0에서 실행 됩니다. 세션 0는 비디오 드라이버에 엑세스 할 수 없기 때문에 .. 2020. 4. 7.
Hyper-V 2세대 VM에서 Com Port 활성화 하기 / Windbg UEFI 부팅환경을 테스트하기 위해 Hyper-V에서 2세대 가상머신을 만들었습니다.. 그리고 커널디버거를 붙이기 위해 Com포트 설정을 해줘야 했습니다. 그런데 2세대 Hyper-V VM에서는 Com Port장치가 보이지 않았는데요. Hyper-V 2세대 VM은 따로 Com 포트에 pipe를 할당해 줘야 장치목록에서 보이게 됩니다. 1. VM종료 먼저 작업을 하기전 VM을 종료해줍니다. 2. Powrshell 관리자 권한으로 실행 Hyper-V VM의 세부 설정은 Powershell 명령어를 통해 할 수 있는데요. Powershell을 관리자 권한으로 실행해 줍니다. 3. set-vmcomport com포트를 활성화 하기 위해 다음 명령어를 실행합니다. set-vmcomport -vmname [VM이름.. 2020. 3. 27.
UINT32[4] IPv6를 스트링으로 변환하기 / MFC, C++ 이전에 쓴 IPv4 UINT32 자료형을 String으로 변환하는 것에 이어 이번에는 UINT32[4] 자료형으로 된 IPv6 String으로 변환해 보는 코드를 작성해 보았다. 물론 ipv6의 축약 포맷은 구현되지 않았다. IPv6는 128비트로 조합된 주소 형식이다. // UINT32 ipv6[4]; CString IPv6ToString(UINT32 ipv6[]) { CString strIPv6; strIPv6.Format(_T("%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x"), (ipv6[3] >> 16) & 0xFFFF, (ipv6[3] >> 0) & 0xFFFF, (ipv6[2] >> 16) & 0xFFFF, (ipv6[2] >> 0) & 0xFFFF, (ipv6[1].. 2020. 2. 19.
insidekernels.blogspot.com / Windows Kernel 관련 inside kernels insidekernels.blogspot.com https://insidekernels.blogspot.com/ Windows 커널 관련 개발 블로그 WFP 등 네트워크 드라이버 개발에 참고 2020. 2. 19.
DeviceIoControl에서 Overlapped I/O 사용하기 DeviceIoControl에서 Overlapped I/O 사용하기 커널드라이버에서 발생한 빈번한 대량의 이벤트를 유저모드에서 하나하나 모니터링 하기위해서 이벤트를 이용하여 동기화, polling으로 이벤트를 계속 수신하거나 하는 방법 등 다양한 방법이 쓰일 수 있다. 문제의 시나리오 비교적 간단한 polling으로 이벤트를 계속 수신한다고 생각해보자. 커널드라이버에서는 발생한 이벤트를 큐에 큐잉하고 유저모드 애플리케이션에서는 IOCTL을 발생시켜 큐의 내용을 꺼내온다. 이런식의 로직에서 유저모드 애플리케이션은 While과 같은 반복문을 수행하며 DeviceIoControl를 호출하여 드라이버와 계속 통신할 것이다. while(true) { BOOL ret = DeviceIoControl(hDevice,.. 2020. 2. 18.
MFC AfxBeginThread 사용시 주의: m_bAutoDelete AfxBeginThread AfxBeginThread는 MFC프로그래밍에서 다중 쓰레드를 생성할 수 있게 해준다. 특히 AfxBeginThread는 객체 하나를 리턴하게 되는데 CWinThread의 인스턴스 리턴하게 된다. 이때 용도에 따라 UI Thread, Worker Thread 로 사용할 수 있다. CWinThread::m_bAutoDelete AfxBeginThread로 생성한 CWinThread 인스턴스는 쓰레드 종료시 주의할 점이 있는데 바로 종료시 자동으로 삭제된다는 점이다. CWinThread의 맴버 변수에는 m_bAutoDelete가 존재하는데 기본적으로 TRUE로 설정 되어있다. 쓰레드 종료시 자동으로 객체를 삭제할지를 설정하는 변수이다. 쓰레드를 종료하고나서 쓰레드의 종료코드를 구한.. 2020. 1. 30.
Windows 커널모드 메모리 할당과 페이지 단편화 -ExAllocatePoolWithTag Windows의 커널모드에서 메모리를 동적 할당을 할때 많이 쓰이는 함수가 바로 ExAllocatePoolWithTag이다. 커널 모드에서는 한정된 커널 메모리 자원을 사용하게 되는데 이때 메모리 할당에 대한 효율성을 따져야 한다. 보통 가상메모리 공간의 Page단위를 할당 받게 되는데 OS과목이나 시스템프로그래밍 과목에서 배운 메모리 단편화 문제가 생기게 된다. Windows WDK에 정의된 PAGE_SIZE는 32비트 기준 0x1000이다. #if defined(_X86_) // // i386 Specific portions of Mm component. // // Define the page size for the Intel 386 as 4096 (0x1000). // #define PAGE_SIZ.. 2020. 1. 14.
DeviceIoControl 버퍼 사용법 DeviceIoControl 사용시 버퍼 방식에 따른 버퍼 접근에 대한 정리이다. METHOD_BUFFERED Input과 Output 버퍼 모두 AssociatedIrp.SystemBuffer를 사용한다. 이때 버퍼의 사이즈는 사용자의 Input과 Output 버퍼사이즈의 최대 사이즈이다. Input과 Output 모두 같은 메모리를 사용하기 때문에 버퍼를 사용할때 Input 버퍼를 먼저 읽고 Output버퍼에 써야 한다. (안그럼 덮어 써진다.) METHOD_IN_DIRECT, METHOED_OUT_DIRECT Input Data는 Irp->AssoicatedIrp.SystemBuffer로 표현된다. Output Data는 MDL로 표현되며 Irp->MdlAddress에 들어간다. 읽기나 쓰기 버퍼의.. 2020. 1. 7.
드라이버와 통신하기 IRP_MJ_DEVICE_CONTROL 드라이버와 통신하기 IRP_MJ_DEVICE_CONTROL 장치 드라이버는 I/O Manager로 부터 File Object로 취급되며 File Operation을 수행 할 수 있다고 하였다. User Application에서 Create, Read, Write, Close Operation를 통해 드라이버와 통신 할 수 있다. 하지만 장치가 쓰기, 읽기 작업만 하지 않을 것 이다. 장치가 동작하는데 다양한 기능들을 수행하기 위해서는 이보다 더 많은 명령이 있어야 할 것이다. 때문에 I/O Control Code를 통해 다양한 명령을 정의하고 수행 할 수 있다. MSDN에 의하면 I/O Control 코드는 User Application과 드라이버간 통신을 가능하게 해준다. 또한 드라이버 사이에 통신을 .. 2020. 1. 7.