Thread Local Storage

2017. 10. 26. 01:340x06 Malware

728x90

하나의 프로세스상 모든 스레드들은 가상의 주소공간과 해당 프로세스의 전역변수들을 공유하게 된다. 스레드 함수상의 지역변수들은 함수가 실행될 동안 각 스레드에 지역변수를 가진다. 

스레드 함수에 사용되는 정적 혹은 전역 변수들은 모든 스레드 상에서 같은 값을 가지게 된다. 


Thread Local Storage를 사용하게 되면 각 스레드를 위한 변수의 독특한 복사본을 생성할 수 있고, TLS를 사용하면 스레드는 인덱스를 할당하며, 그 인덱스는 유일한 복사본을 받기 위한 프로세스의 어떤 스레드에 의해서도 사용된다.


TLS 구현 단계 


1. TlsAlloc : 프로세스, DLL initialize or Tls index allocation. 


2. Tls index와 동적할당 메모리를 연관시키기 위해 TlsSetValue함수를 사용하게 된다.


LPVOID WINAPI TlsGetValue( _IN_ DWORD dwTlsIndex); 


해당 함수가 정상적으로 성공하게 되면 반환 값은 지정된 인덱스와 연관된 호출 스레드의 TLS 슬롯에 저장되게 된다. 


함수 호출에 실패하면 반환 값은 0이 되고, 오류정보를 얻기 위해 GetLastError 함수를 호출 할 수 있다. 


TLS 슬롯에 저장된 데이터는 여전히 초기 값을 가지고 있기 때문에 , 스레드가 TlsSetValue 함수를 0으로 호출했기 때문에 0 값을 가질 수가 있다. 


반환 값이 0이면 GetLastError가 ERROR_SUCCESS를 반환하는지부터 확인해야 한다.


따라서 함수가 실패하면 GetLastError가 반환된다.


실패의 표시를 반환하는 함수로는 SetLastError를 사용하게 된다. 

일반적으로 성공할 때 SetLastError를 호출하진 않는다.



3. TLS 인덱스와 연결된 동적 메모리를 더이상 사용하지 않을 경우는 인덱스를 반드시 해제해야하는데 이때, TlsFree함수를 사용하여 TLS 인덱스를 제거하면 된다.



'0x06 Malware' 카테고리의 다른 글

기초공부 중  (0) 2017.12.03
Good Job  (0) 2017.11.29
레몬 세미나  (0) 2017.10.28
작성중인 자료.  (0) 2017.10.25
[csrcs] 정적분석 공부  (0) 2017.10.01