Las CallBacks son funciones que se llaman automáticamente al ocurrir cierto evento, la nota decía esto:
Citar
/*
(1) TLS-callback
This anti-debug was not so well-known a few years ago. It consists to instruct the
PE loader that the first entry point of the program is referenced in a Thread Local Storage entry
(10th directory entry number in the PE optional header). By doing so, the program entry-point
won't be executed first. The TLS entry can then perform anti-debug checks in a stealthy way.
Note that in practice, this technique is not widely used.
Though older debuggers (including OllyDbg) are not TLS-aware, counter-measures are quite
easy to take, by the means of plugins of custom patcher tools.
*/
Básicamente, dice que se puede hacer que se ejecute primero un callback TLS antes que el ENTRYPOINT, con lo cual se puede ejecutar código antes que el programa mismo.
La información al respecto:
http://en.wikipedia.org/wiki/Thread-local_storage
http://en.wikipedia.org/wiki/Thread-local_storage#Windows_implementation
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686749(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/6yh4a9k1.aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686991(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686997(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682594(v=vs.85).aspx
http://www.chromium.org/nativeclient/design-documents/thread-local-storage-tls-implementation
El código funcional al respecto de esta técnica, hecho por un programador de nombre Benina. Yo sólamente hice las pruebas y me pareció interesante exponerlo por estos lados, a alguien le puede servir XD.
Código
// // Autor: Benina (REA Team 2010) // Publicado Por: 85 // Para: elhacker.net , etalking.com.ar // 2013 // //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include <windows.h> //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// typedef struct _IMAGE_TLS_DIRECTORY32_ { DWORD StartAddressOfRawData; DWORD EndAddressOfRawData; DWORD AddressOfIndex; DWORD AddressOfCallBacks; DWORD SizeOfZeroFill; DWORD Characteristics; } IMAGE_TLS_DIRECTORY32_, * PIMAGE_TLS_DIRECTORY32_; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// VOID NTAPI on_tls_callback(PVOID handle, DWORD reason, PVOID resv); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #pragma comment(linker, "/INCLUDE:__tls_used") extern "C" { #pragma data_seg(".tls") __declspec(allocate(".tls")) DWORD __tls_start = 0x0; #pragma data_seg(".tls") __declspec(allocate(".tls")) DWORD __tls_end = 0x0; #pragma data_seg(".tls") __declspec(allocate(".tls")) DWORD __tls_index = 0x0; #pragma data_seg(".tls") __declspec(allocate(".tls")) DWORD __tls_func = (DWORD) on_tls_callback; #pragma data_seg(".tls") __declspec(allocate(".tls")) DWORD __tls_size = 0x0; #pragma data_seg(".tls") __declspec(allocate(".tls")) DWORD __tls_flag = 0x0; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #pragma data_seg(".rdata$T") __declspec(allocate(".rdata$T")) extern "C" const _IMAGE_TLS_DIRECTORY32_ _tls_used = { (DWORD) &__tls_start, (DWORD) &__tls_end, (DWORD) &__tls_index, (DWORD ) &__tls_func, (DWORD ) 0, (DWORD ) 0 }; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// VOID NTAPI on_tls_callback(PVOID handle, DWORD reason, PVOID resv) { // Run code here switch (reason ) { case DLL_PROCESS_ATTACH: { MessageBox(NULL, TEXT("Thread attach!"), TEXT("TLS Callback"), 0); break; } case DLL_PROCESS_DETACH: { MessageBox(NULL, TEXT("Thread detach!"), TEXT("TLS Callback"), 0); break; } default: break; }; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// int main() { // TODO: Place code here. MessageBox(NULL, TEXT("Hello, Main Program!"), TEXT("Main Proc"), 0); return 0; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Proyecto: http://www.mediafire.com/?tcbtpoebhd8j4z7
Hasta luego