※TLS(Thread Local Storage)란?
이미 전에 공부해서 알고 있는 내용들이지만 다시 한번 정리하는 개념으로 TLS에 대한 내용을 진행해보았습니다.
이후 예제코드는 TLS를 이용한 안티디버깅프로그램을 제작해보았습니다.
※TLS(Thread Local Storage)란?
- Thread별로 독립된 데이터 저장공간. 쓰레드내에서 독립적으로 전역변수나 정적변수를 만들어줄때 사용
※DataDirectory
- TLS프로그래밍시 PE포맷에서 optionalHeader의 DataDirectory[9]이 세팅되며 다음의 구조를 가진다.
typedef struct _IMAGE_TLS_DIRECTORY64
{
ULONGLONG StartAddressOfRawData;
ULONGLONG EndAddressOfRawData;
ULONGLONG AddressOfIndex; // PDWORD
ULONGLONG AddressOfCallBacks; // PIMAGE_TLS_CALLBACK* ; // 콜백함수 주소
DWORD SizeOfZeroFill;
DWORD Characteristics;
} IMAGE_TLS_DIRECTORY64;
typedef IMAGE_TLS_DIRECTORY64* PIMAGE_TLS_DIRECTORY64;
// 32비트
typedef struct _IMAGE_TLS_DIRECTORY32
{
DWORD StartAddressOfRawData;
DWORD EndAddressOfRawData;
DWORD AddressOfIndex; // PDWORD
DWORD AddressOfCallBacks; // PIMAGE_TLS_CALLBACK* ; // 콜백함수 주소
DWORD SizeOfZeroFill;
DWORD Characteristics;
} IMAGE_TLS_DIRECTORY32;
typedef IMAGE_TLS_DIRECTORY32* PIMAGE_TLS_DIRECTORY32;
※TLS콜백함수를 이용한 안티디버깅 코드
TLS콜백함수는 쓰레드가 생성되거나 종료될때 자동으로 호출이 됩니다. 아래의 코드는 이를 이용하여 메인쓰레드가 호출되기 이전 디버깅을 탐지하여 분석하지 못 하도록 프로세스를 종료시키는 안티디버깅코드입니다.
코딩이후 디버거에 붙인 실행 결과는 다음과 같습니다.
원래대로라면 "Hello C Wrold"가 찍혀야하지만 디버거가 탐지되었기때문에 위와 같은 출력이 나오는것을 볼 수 있습니다.