본문 바로가기
Security/Windows System

※TLS(Thread Local Storage)란?

by Winduck 2017. 8. 21.
반응형

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


반응형

댓글