▣ 동기화 객체
- 멀티 쓰레드 소프트웨어 설계에서 가장 중요한 측면은 데이터 구조체와 데이터의 유효성을 보증하기 위한 동기화 메커니즘을 설계하는 방법임
- 스케줄러는 쓰레드의 대기 상태 조건이 언제 만족되고 그 때 어느 쓰레드가 실행되어야 하는지 알기 위해서 동기화 객체가 존재하는지 알아야만 함
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 |