Security/Windows System

※TLS(Thread Local Storage)란?

Winduck 2017. 8. 21. 21:41
반응형

이미 전에 공부해서 알고 있는 내용들이지만 다시 한번 정리하는 개념으로 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"가 찍혀야하지만 디버거가 탐지되었기때문에 위와 같은 출력이 나오는것을 볼 수 있습니다.


반응형