Сейчас на форуме: tyns777, zombi-vadim, zds (+4 невидимых)

 eXeL@B —› Программирование —› Подключить TlsCallback
Посл.ответ Сообщение

Ранг: 102.0 (ветеран), 18thx
Активность: 0.070.02
Статус: Участник

Создано: 21 мая 2015 17:19
· Личное сообщение · #1

Хотелось бы в своей программе на Си подключить TlsCallback функцию.
Очевидна цель: запуск этой функции до выхода на ОЕР основной программы.
Возможно, подобный вопрос уже рассматривался на форуме, но я не смог найти.
Не смог найти что-то подходящее и в Интернете.
Может кто-нибудь что-то скажет в этой связи?




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 21 мая 2015 17:31
· Личное сообщение · #2

после OEP но до main хватит? тогда достаточно будет банального статического объекта




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 21 мая 2015 17:35 · Поправил: OKOB
· Личное сообщение · #3

должно помочь --> Thread Local Storage - The C++ Way <--
--> Detect debugger with TLS callback <--

-----
127.0.0.1, sweet 127.0.0.1


| Сообщение посчитали полезным: ksol, plutos

Ранг: 102.0 (ветеран), 18thx
Активность: 0.070.02
Статус: Участник

Создано: 21 мая 2015 18:14
· Личное сообщение · #4

reversecode: Нужен запуск этой функции системным загрузчиком
ОКОВ:Спасибо за ссылку - посмотрю.



Ранг: 102.0 (ветеран), 18thx
Активность: 0.070.02
Статус: Участник

Создано: 22 мая 2015 17:40
· Личное сообщение · #5

Нет, не работает код ни по 1-й. ни по 2-й ссылок. MSVC++ никак не реагирует на этот код!
Ниже привожу этот код. Код от 1-й ссылки взят в комменты.
Code:
  1. VOID WINAPI on_tls_func(
  2.   PVOID DllHandle, DWORD Reason, PVOID Reserved)
  3. {
  4.  if(Reason == DLL_PROCESS_DETACH)
  5.   MessageBox(NULL, "in Callback function",
  6.    "Callback", MB_OK);
  7. /*
  8. #pragma data_seg(".CRT$XLB")
  9.  PIMAGE_TLS_CALLBACK p_thread_callback = on_tls_func;
  10. #pragma data_seg() */
  11. #pragma comment(linker,"/include: __tls_used"
  12. #pragma section(".CRT$XLB",read)
  13.  __declspec(allocate(".CRT$XLB")) PIMAGE_TLS_CALLBACK CallbackAddress[] = {on_tls_func,NULL};




Ранг: 53.9 (постоянный), 33thx
Активность: 0.050
Статус: Участник

Создано: 23 мая 2015 19:14
· Личное сообщение · #6

Вот вам мой работающий пример х86/х64
Code:
  1. #include <windows.h>
  2.  
  3. void NTAPI TLSEntry(PVOID DllHandle, DWORD dwReason, PVOID)
  4. {
  5.          if (dwReason == DLL_THREAD_ATTACH)
  6.          {
  7.                  MessageBox(0, L"DLL_THREAD_ATTACH", L"DLL_THREAD_ATTACH", 0);
  8.          }
  9.  
  10.          if (dwReason == DLL_PROCESS_ATTACH)
  11.          {
  12.                  MessageBox(0, L"DLL_PROCESS_ATTACH", L"DLL_PROCESS_ATTACH", 0);
  13.          }
  14. }
  15.  
  16. #ifdef _WIN64
  17. #pragma comment (linker, "/INCLUDE:_tls_used")
  18. #pragma comment (linker, "/INCLUDE:tls_callback")
  19. #else
  20. #pragma comment (linker, "/INCLUDE:__tls_used")
  21. #pragma comment (linker, "/INCLUDE:_tls_callback")
  22. #endif
  23.  
  24. #ifdef _WIN64
  25. #pragma const_seg(".CRT$XLF")
  26. EXTERN_C const
  27. #else
  28. #pragma data_seg(".CRT$XLF")
  29. EXTERN_C
  30. #endif
  31. PIMAGE_TLS_CALLBACK tls_callback = TLSEntry;
  32. #ifdef _WIN64
  33. #pragma const_seg()
  34. #else
  35. #pragma data_seg()
  36. #endif //_WIN64
  37.  
  38. DWORD WINAPI ThreadProc(CONST LPVOID lpParam) 
  39. {
  40.          ExitThread(0);
  41. }
  42.  
  43.  
  44. int main(void)
  45. {
  46.          MessageBox(0, L"hello from main", L"main", 0);
  47.          CreateThread(NULL, 0, &ThreadProc, 0, 0, NULL);
  48.          return 0;
  49. }





Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

Создано: 23 мая 2015 22:42 · Поправил: Rainbow
· Личное сообщение · #7

ну в масме так: просто паблик для компиля.

TLS_DIRECTORY STRUCT
lpTlsDataStart DWORD ?
lpTlsDataEnd DWORD ?
lpTlsIndex DWORD ?
lpTlsCallbacks DWORD ?
ZeroFillSize DWORD ?
Characteristic DWORD ?
TLS_DIRECTORY ENDS

PUBLIC _tls_used
_tls_used TLS_DIRECTORY <?, ?, tls_index, tls_callbacks, ?, ?>



Ранг: 102.0 (ветеран), 18thx
Активность: 0.070.02
Статус: Участник

Создано: 24 мая 2015 16:30
· Личное сообщение · #8

Спасибо deniskore и Rainbow!
Я тоже получил - всё работает. Вот моя настройка -
вставляется между функциями callback и main:

Code:
  1. #pragma comment(linker,"/INCLUDE:__tls_used");
  2. #pragma section(".CRT$XLY",long,read)
  3. extern "C" __declspec(allocate(".CRT$XLY"))
  4.     PIMAGE_TLS_CALLBACK _x1_y = on_tls_func;





Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 03 июня 2015 20:28 · Поправил: plutos
· Личное сообщение · #9

Может кому пригодится.
В статье приводится не только простой пример кода, но и детально разобраны все "внутренние аспекты" TLS.
http://resources.infosecinstitute.com/debugging-tls-callbacks/

-----
Give me a HANDLE and I will move the Earth.


| Сообщение посчитали полезным: ksol

Ранг: 102.0 (ветеран), 18thx
Активность: 0.070.02
Статус: Участник

Создано: 10 июня 2015 17:20
· Личное сообщение · #10

Да, хорошая статья. Для начала знакомства с TLS - то что надо.




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 10 июня 2015 18:05
· Личное сообщение · #11

ksol пишет:
Да, хорошая статья. Для начала знакомства с TLS - то что надо.



Ну если понравилась та статья, то вот еще цикл статей (точнее одна, разбита на 8 частей) от Nynaeve.
http://www.nynaeve.net/?p=190

На мой взгляд, одна из лучших, если не лучшая

-----
Give me a HANDLE and I will move the Earth.




Ранг: 102.0 (ветеран), 18thx
Активность: 0.070.02
Статус: Участник

Создано: 11 июня 2015 17:34
· Личное сообщение · #12

Ну там в основном TLS API и совсем не затрагивается TLS Callback.
Так что из ваших 2-х ссылок прямо к данной теме форума относится 1-я.




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 11 июня 2015 18:09 · Поправил: plutos
· Личное сообщение · #13

ksol пишет:
Ну там в основном TLS API и совсем не затрагивается TLS Callback.


Товарищ, вы всю статью прочли до конца внимательно?
Дело ваше: нравится - читайте, не нравится - не читайте, но только не нужно глупости писать.

-----
Give me a HANDLE and I will move the Earth.



 eXeL@B —› Программирование —› Подключить TlsCallback
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати