동기화 객체

-       멀티 쓰레드 소프트웨어 설계에서 가장 중요한 측면은 데이터 구조체와 데이터의 유효성을 보증하기 위한 동기화 메커니즘을 설계하는 방법임

-       스케줄러는 쓰레드의 대기 상태 조건이 언제 만족되고 그 때 어느 쓰레드가 실행되어야 하는지 알기 위해서 동기화 객체가 존재하는지 알아야만 함

 

Kernel mode

이벤트

· true, false 상태를 갖는 간단한 Boolean 동기화 객체

· 이벤트 객체를 대기하기 위해서 WaitForSingleObject, WaitForMultipleObject 사용)

뮤텍스

· 어느 한 시점에서 하나의 쓰레드만이 점유할 수 있는 객체 → 이미 점유된 뮤텍스를 다른 쓰레드가 점유하고 자 한다면, 해당 쓰레드가 종료되거나 해제할 때 까지 대기해야 함 → 대기하고 있는 쓰레드가 하나 이상일 경우 뮤텍스를 요청한 순서대로 소유권을 넘김

세머포어

· 뮤텍스와 비슷하며, 동시에 세마포어 객체를 소유할 수 있는 쓰레드 수 지정함

세마포어를 소유할 수 있는 쓰레드 개수가 전부 차면 세마포어의 소유권을 요청한 쓰레드는 다른 쓰레가 세머포어의 소유권으르 해지할 때 까지 대기함

User mode

크리티컬 섹션

· 뮤텍스의 최적화된 구현 형태

· 뮤텍스와 논리적으로 동일하지만 하나의 프로세스에서만 유효함

· 실질적으로 대기모드가 필요할 때만 커널 모드로 스위칭됨

[흔히 사용되는 동기화 객체]

 

프로세스 초기화 과정

 

순서

수행 내용

1

프로세스 객체와 새로운 주소공간 생성

프로세스가 CreateProcess Win32 API를 호출 → API는 프로세스 객체와 메모리 주소공간 할당

2

CreateProcess API NTDLL.DLL과 프로그램의 실행 바이너리 파일(.exe file)을 주소공간에 매핑

3

CreateProcess API는 프로세스의 첫번째 쓰레드를 생성 → 이 쓰레드를 위한 스택공간 할당

4

NTDLL.DLL LdrpInitialize함수가 실행됨으로써 프로세스의 첫 번째 쓰레드가 다시 실행

5

LdrpInitialize는 첫 번째 실행 바이너리의 임포트 테이블을 반복적으로 조사해서 실행에 필요한 모든 실행 바이너리를 메모리에 매핑

6

이 시점에서 제어권은 LdrpRunInitializeRoutines로 넘어감

(LdrpRunInitializeRoutines : NTDLL.DLL의 내부 루틴으로, 주소공간에 현재 로드된 모든 정적링크 DLL들을 초기화시키는 역할 수행함. 초기화 작업은 DLL_PROCESS_ATTACH옵션으로 각 DLL의 엔트리 포인트를 호출하는 방식)

7

모든 DLL에 대한 초기화 작업이 이루어지면 LdrpInitialize는 쓰레드의 실제적인 초기화 루틴인 KERNEL32.DLL BaseProcessStart함수를 호출함(BaseProcessStart함수는 프로세스의 초기화 작업이 완료된 시점에 실행 바이너리의 WinMain엔트리 포인트를 호출함)

 

 


'Security > Reverse Engineering' 카테고리의 다른 글

[Reversing]실행 포멧  (0) 2010.05.08
[Reversing]API  (0) 2010.05.04
[Reversing]프로세스와 쓰레드  (0) 2010.05.04
[Reversing]네임드 객체  (0) 2010.05.03
[Reversing]객체와 핸들  (0) 2010.05.03

+ Recent posts