pe中TLS(thread local storage)中函数的执行时机早于入口函数(entry point),

相关结构:

  1. //
  2. // Thread Local Storage
  3. //
  4.  
  5. typedef VOID
  6. (NTAPI *PIMAGE_TLS_CALLBACK) (
  7. PVOID DllHandle,
  8. DWORD Reason,
  9. PVOID Reserved
  10. );
  11.  
  12. typedef struct _IMAGE_TLS_DIRECTORY64 {
  13. ULONGLONG StartAddressOfRawData;
  14. ULONGLONG EndAddressOfRawData;
  15. ULONGLONG AddressOfIndex; // PDWORD
  16. ULONGLONG AddressOfCallBacks; // PIMAGE_TLS_CALLBACK *;
  17. DWORD SizeOfZeroFill;
  18. union {
  19. DWORD Characteristics;
  20. struct {
  21. DWORD Reserved0 : 20;
  22. DWORD Alignment : 4;
  23. DWORD Reserved1 : 8;
  24. } DUMMYSTRUCTNAME;
  25. } DUMMYUNIONNAME;
  26.  
  27. } IMAGE_TLS_DIRECTORY64;
  28.  
  29. typedef IMAGE_TLS_DIRECTORY64 * PIMAGE_TLS_DIRECTORY64;
  30.  
  31. typedef struct _IMAGE_TLS_DIRECTORY32 {
  32. DWORD StartAddressOfRawData;
  33. DWORD EndAddressOfRawData;
  34. DWORD AddressOfIndex; // PDWORD
  35. DWORD AddressOfCallBacks; // PIMAGE_TLS_CALLBACK *
  36. DWORD SizeOfZeroFill;
  37. union {
  38. DWORD Characteristics;
  39. struct {
  40. DWORD Reserved0 : 20;
  41. DWORD Alignment : 4;
  42. DWORD Reserved1 : 8;
  43. } DUMMYSTRUCTNAME;
  44. } DUMMYUNIONNAME;
  45.  
  46. } IMAGE_TLS_DIRECTORY32;
  47. typedef IMAGE_TLS_DIRECTORY32 * PIMAGE_TLS_DIRECTORY32;

例子:

  1. #include <iostream>
  2. #include <Windows.h>
  3.  
  4. //TLS回调函数测试
  5. void NTAPI MY_TLS_CALLBACK(PVOID DllHandle, DWORD Reason, PVOID Reserved)
  6. {
  7. printf("CALL TLS 1\n");
  8. switch (Reason)
  9. {
  10. case DLL_PROCESS_ATTACH:
  11. printf("DLL_PROCESS_ATTACH\ttls 1\n");
  12. break;
  13. case DLL_THREAD_ATTACH:
  14. printf("DLL_THREAD_ATTACH\ttls 1\n");
  15. break;
  16. case DLL_THREAD_DETACH:
  17. printf("DLL_THREAD_DETACH\ttls 1\n");
  18. break;
  19. case DLL_PROCESS_DETACH:
  20. //printf("DLL_PROCESS_DETACH\ttls 1\n");//进程结束时并没有输出,可能关闭了通道??
  21. break;
  22. }
  23. }
  24. void NTAPI MY_TLS_CALLBACK2(PVOID DllHandle, DWORD Reason, PVOID Reserved)
  25. {
  26. printf("CALL TLS 2\n");
  27. switch (Reason)
  28. {
  29. case DLL_PROCESS_ATTACH:
  30. printf("DLL_PROCESS_ATTACH\ttls 2\n");
  31. break;
  32. case DLL_THREAD_ATTACH:
  33. printf("DLL_THREAD_ATTACH\ttls 2\n");
  34. break;
  35. case DLL_THREAD_DETACH:
  36. printf("DLL_THREAD_DETACH\ttls 2\n");
  37. break;
  38. case DLL_PROCESS_DETACH:
  39. //printf("DLL_PROCESS_DETACH\ttls 2\n");
  40. break;
  41. }
  42. }
  43. /*
  44. #ifdef _M_AMD64
  45. #pragma comment (linker, "/INCLUDE:_tls_used")
  46. #pragma comment (linker, "/INCLUDE:p_tls_callback1")
  47. #pragma const_seg(push)
  48. #pragma const_seg(".CRT$XLX")
  49. EXTERN_C const PIMAGE_TLS_CALLBACK p_tls_callback1[] = { MY_TLS_CALLBACK,MY_TLS_CALLBACK2,0 };
  50. #pragma const_seg(pop)
  51. #endif
  52. #ifdef _M_IX86
  53. #pragma comment (linker, "/INCLUDE:__tls_used")
  54. #pragma comment (linker, "/INCLUDE:_p_tls_callback1")
  55. #pragma const_seg(push)
  56. #pragma const_seg(".CRT$XLX")
  57. EXTERN_C const PIMAGE_TLS_CALLBACK p_tls_callback1[] = { MY_TLS_CALLBACK,MY_TLS_CALLBACK2,0 };
  58. #pragma const_seg(pop)
  59. #endif
  60. */
  61.  
  62. #ifdef _M_AMD64
  63. #pragma comment(linker,"/INCLUDE:_tls_used")
  64. #pragma const_seg(".CRT$XLX")
  65. EXTERN_C const PIMAGE_TLS_CALLBACK p_tls_callback1[] = { MY_TLS_CALLBACK,MY_TLS_CALLBACK2,0 };
  66. #pragma const_seg()
  67. #endif
  68.  
  69. #ifdef _M_IX86
  70. #pragma comment (linker, "/INCLUDE:__tls_used")
  71. #pragma const_seg(".CRT$XLX")
  72. EXTERN_C const PIMAGE_TLS_CALLBACK p_tls_callback1[] = { MY_TLS_CALLBACK,MY_TLS_CALLBACK2,0 };
  73. #pragma const_seg()
  74. #endif
  75.  
  76. DWORD WINAPI MyThreadFunction(LPVOID lpParam) {
  77. int nb = *(int*)lpParam;
  78. for (int i = 0; i < nb; ++i) {
  79. printf("number: %d\n", i);
  80. Sleep(1000);
  81. }
  82. return 1;
  83. }
  84. int main()
  85. {
  86. std::cout << "Hello World!\n";
  87. DWORD dwThreadId=0;
  88. int number = 3;
  89.  
  90. HANDLE hThread= CreateThread(
  91. NULL, // default security attributes
  92. 0, // use default stack size
  93. MyThreadFunction, // thread function name
  94. &number, // argument to thread function
  95. 0, // use default creation flags
  96. &dwThreadId); // returns the thread identifier
  97. getchar();
  98. }

输出:

《逆向工程核心原理》——TLS回调函数的更多相关文章

  1. 通过TLS回调函数的反调试

    下面是TLS数据结构的定义 typedef struct _IMAGE_TLS_DIRECTORY { DWORD StartAddressOfRawData; DWORD EndAddressOfR ...

  2. TLS回调函数

    @author: dlive TLS (Thread Local Storage 线程局部存储 )回调函数常用于反调试. TLS回调函数的调用运行要先于EP代码执行,该特性使它可以作为一种反调试技术使 ...

  3. TLS回调函数以及反调试简单使用

    TLS回调函数以及反调试简单使用 0x00  TLS介绍 TLS(Thread Local Storage,线程局部储存),主要用于给线程独立的传值,由于线程不拥有进程的资源,所以几个同一进程的几个线 ...

  4. Mina、Netty、Twisted一起学(九):异步IO和回调函数

    用过JavaScript或者jQuery的同学都知道,JavaScript特别是jQuery中存在大量的回调函数,例如Ajax.jQuery的动画等. $.get(url, function() { ...

  5. 小兔JS教程(三)-- 彻底攻略JS回调函数

    这一讲来谈谈回调函数. 其实一句话就能概括这个东西: 回调函数就是把一个函数当做参数,传入另一个函数中.传进去的目的仅仅是为了在某个时刻去执行它. 如果不执行,那么你传一个函数进去干嘛呢? 就比如说对 ...

  6. 嵌入式&iOS:回调函数(C)与block(OC)传 参/函数 对比

    C的回调函数: callBack.h 1).声明一个doSomeThingCount函数,参数为一个(无返回值,1个int参数的)函数. void DSTCount(void(*CallBack)(i ...

  7. 嵌入式&iOS:回调函数(C)与block(OC)回调对比

    学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...

  8. 理解 JavaScript 回调函数并使用

    JavaScript中,函数是一等(first-class)对象:也就是说,函数是 Object 类型并且可以像其他一等对象(String,Array,Number等)一样使用.它们可以"保 ...

  9. 关于js的回调函数的一点看法

    算了一下又有好几个月没写博客了,最近在忙公司android的项目,所以也就很少抽时间来写些东西了.刚闲下来,我就翻了翻之前看的东西.做了android之后更加感觉到手机端开发的重要性,现在做nativ ...

随机推荐

  1. PostCSS All In One

    PostCSS All In One https://postcss.org/ https://www.webpackjs.com/loaders/postcss-loader/ https://gi ...

  2. LeetCode 算法面试题汇总

    LeetCode 算法面试题汇总 算法面试题 https://leetcode-cn.com/problemset/algorithms/ https://leetcode-cn.com/proble ...

  3. Linux 学习笔记分享: Linux 用户组的权限: drwx------ 700权限(d 目录 ,r=4,w=2,x=1:rwx=7;---=0;---=0)

    Linux 用户组的权限: drwx------ 700权限(d 目录 ,r=4,w=2,x=1:rwx=7;---=0;---=0) 1 1 Linux 用户组的权限: drwx------ 700 ...

  4. The Weekly Web Dev Challenge: Emoji Ratings

    The Weekly Web Dev Challenge: Emoji Ratings /* DESCRIPTION: You job is to enable users to give a rat ...

  5. 如何使用 iMovie 去除视频里面的声音

    如何使用 iMovie 去除视频里面的声音 视频去除背景音 iMovie https://www.apple.com/imovie/ https://books.apple.com/book/id14 ...

  6. auto open Chrome DevTools in the command line

    auto open Chrome DevTools in the command line --auto-open-devtools-for-tabs # macOS $ /Applications/ ...

  7. macOS 显示/隐藏 AirPlay

    macOS 显示/隐藏 AirPlay AirPlay Sidecar 必须用相同的 Apple ID 登录 mac 和 ipad, 才能使用! https://www.apple.com/macos ...

  8. 去中心化预言机如何助力NGK DeFi 项目发展?

    早在 2014 年前后,协议智能合约就已经出现了,最初协议很笨重,包含了许多不同的部分,每个部分都是一个单独的智能合约,你需要在区块链本身的协议中添加不同的智能合约,这需要几个月甚至几年的时间,而之后 ...

  9. FTP服务器搭建以及上传下载的学习

    首先需要搭建FTP服务步骤如下: 1.在win7上先开启ftp服务:这里点击确定后,可能会要等一会儿,完成后有时系统会提示重启 2.打开   计算机-->管理-->   在这里我们可以看见 ...

  10. es6 快速入门 —— 函数

    其他章节请看: es6 快速入门 系列 函数 函数是所有编程语言的重要组成部分,es6之前函数语法一直没什么变化,遗留了许多问题,javaScript开发者多年来不断抱怨,es6终于决定大力度更新函数 ...