실행도중 메모리에 접근(임계영역) 및 수정하는데 있어서 인터럽트가 발생하여 해당 메모리값이 유효하지 않은 값이 되며 발생하는 오류들을 제거하기 위함.
말이 조금 어려울수 있으니 간단한 예를 통하여 설명하겠습니다.
예) DISPATCH_LEVEL(2)실행도중 인터럽트가 발생하여 DIRQLs(8)루틴실행시 발생하는 오류
설명을 하자면 MOV eax,0x8가 실행된 직후 인터럽트가 발생하여 DIRQLs(7)이실행되며 EAX값이 EDI의 주소값으로 바뀐다.
이후 다시 DISPATCH_LEVEL로 복귀하였을 때 유효하지 않은 EAX값을 파라미터로 넘기고 함수를 호출하기 때문에 에러가 발생하게 된다.
※동기화 문제 해결책
①IRQL조작을 조작한다.
KeRaiseIrql(),와 KeLowerIrql()로 해당 루틴의 IRQL을 조작하여 임계영역 실행 시 인터럽트가 발생하지 않도록 한다.
하지만 이 경우는 cpu가 single core일때만 사용한다. 이유는 여러게의 CPU가 있을 때 IRQL은 CPU마다 정해지기 때문에 남은
CPU는 동기화의 영향을받지 않기때문입니다.
②해당 메모리 접근에 있어 CPU하나만 메모리에 접근 가능하도록 한다.
KeRaiseIrql(), KeLowerIrql(), InterlockedIncrement(), InterlockedDecrement(), InterlockedExchange()함수를 사용한다.
③SpinLock을 이용한 방법.
KeInitializeSpinLock(), KeAccquireSpinLock(), KeReleaseSpinLock()를 사용한다. 위 Internlock~~()함수의 사용법과 비슷하지만
IRQL 변환코드를 사용하지 않아 코드가 간단하다.
④KeSynchronizeExecution()을 이용한 방법.
KeSynchronizeExecution(), IoConnectInterrupt(), IoDisconnectIterrupt를 사용한다.
'Security > Windows System' 카테고리의 다른 글
윈도우 부팅과정(Windows Boot Process) (0) | 2017.08.21 |
---|---|
MBR부팅과정 디버깅 (0) | 2017.08.08 |
IRQL(Interrupt Request Level)이란?(1) (0) | 2017.08.03 |
DeviceObject란?(2) - DeviceTack편 (0) | 2017.07.30 |
DeviceObject이란?(1) (0) | 2017.07.30 |
댓글