본문 바로가기
Security/Windows System

IRQL(Interrupt Request Level)-동기화방법(2)

by Winduck 2017. 8. 3.
반응형

 

 

 

※ 동기화가 필요한 이유

 

실행도중 메모리에 접근(임계영역) 및 수정하는데 있어서 인터럽트가 발생하여 해당 메모리값이 유효하지 않은 값이 되며 발생하는 오류들을 제거하기 위함.

말이 조금 어려울수 있으니 간단한 예를 통하여 설명하겠습니다. 

 

예) 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

댓글