출처 : http://artisticbit.tistory.com/entry/WaitForSingleObject-%ED%95%A8%EC%88%98

출처 : https://www.joinc.co.kr/w/man/4100/WaitForsingleObject



WaitForSingleObject()

-> 커널 오브젝트의 상태 정보를 확인하는데 사용

-> 해당 리소스의 커널 오브젝트가 Signaled 인지 Non-Signaled 인지 알 수 있다.


DWORD WINAPI WaitForSingleObject(

__in HANDLE hHandle,

__in DWORD dwMilliseconds

);


hHandle 

-> 기다릴 객체의 핸들을 지정한다.


dwMilliseconds

-> 제한시간을 밀리초 단위로 지정한다. 제한시간이 지나면 시그널이 도착하지 않았더라도 반환한다. 0을 지정하면 객체의 상태를 확인하고 바로 반환한다. INFINITE를 지정하면 시그널이 도착할 때까지 기다린다.


반환값 

-> WAIT_ABANDDNED : 지정된 객체가 파기된 뮤텍스 객체다. 뮤텍스를 소유한 쓰레드가 뮤텍스 객체의 소유권을 되돌려 주지 않고 종료했다. 그래서 뮤텍스 객체의 소유권이 호출한 쓰레드로 옮겨졌으며, 뮤텍스는 비시그널 상태가 되었다.


-> WAIT_OBJECT_0 : 지정한 객체에 시그널 상태다.

-> WAIT_TIMEOUT : 제한시간이 지날때 까지 시그널 상태가 되지 않았다.


WaitForSingleObject() 는 다음의 객체를 기다린다.

-> 콘솔 입력

-> 이벤트

-> 메모리 리소스 통지

-> 뮤텍스

-> 프로세스

-> 세마포어

-> Thread(쓰레드)

-> 타이머

EP(Entry Point)

-> 프로그램의 시작점 또는 그 영역

-> 프로그램이 실행되면 가장 먼저 처리되는 부분



TLS 콜백 함수

-> (Thread Local Storage = 스레드 별로 독립된 데이터 저장공간)  

-> 프로세스 스레드가 생성/종료 될때마다 자동으로 호출되는 콜백 함수 (메인 스레드가 생성될 때도 호출된다. EP코드 보다도 먼저 호출 된다.)

-> IMAGE_DATA_DIRECTORY[9]에 TLS 테이블(IMAGE_TLS_DIRECTORY)의 주솟값이 들어있다.(RVA 형태)




IMAGE_TLS_DIRECTORY 구조체

typedef struct _IMAGE_TLS_DIRECTORY64{

ULONGLONG    StartAddressOfRawData

ULONGLONG    EndAddressOfRawData    

ULONGLONG    AddressOfIndex

ULONGLONG    AddressOfCallBacks

DWORD            SizeOfZeroFill

DWORD            Characteristics

}


StartAddressOfRawData와 EndAddressOfRawData

-> 각각 _tls_start와 _tls_start 전역 변수에 대한 번지값을 담고 있다.


AddressOfIndex

-> TLS 슬롯 배열의 인덱스를 담고 있는 변수의 번지를 담고 있다.


AddressOfCallBacks

-> TLS 콜백 함수 주소(VA) 배열을 가르킨다.(배열의 끝은 NULL)




수작업으로 TLS 콜백 함수 추가하기(자세한건 리버싱 핵심원리 책 참조)

1. IMAGE_DATA_DIRECTORY[9]에 주소 입력(IMAGE_TLS_DIRECTORY 구조체 주소)

2. 헥스 에디터로 IMAGE_TLS_DIRECTORY 구조체 멤버값 입력


+ Recent posts