《逆向工程核心原理》——TLS回调函数
pe中TLS(thread local storage)中函数的执行时机早于入口函数(entry point),
相关结构:
- //
- // Thread Local Storage
- //
- typedef VOID
- (NTAPI *PIMAGE_TLS_CALLBACK) (
- PVOID DllHandle,
- DWORD Reason,
- PVOID Reserved
- );
- typedef struct _IMAGE_TLS_DIRECTORY64 {
- ULONGLONG StartAddressOfRawData;
- ULONGLONG EndAddressOfRawData;
- ULONGLONG AddressOfIndex; // PDWORD
- ULONGLONG AddressOfCallBacks; // PIMAGE_TLS_CALLBACK *;
- DWORD SizeOfZeroFill;
- union {
- DWORD Characteristics;
- struct {
- DWORD Reserved0 : 20;
- DWORD Alignment : 4;
- DWORD Reserved1 : 8;
- } DUMMYSTRUCTNAME;
- } DUMMYUNIONNAME;
- } IMAGE_TLS_DIRECTORY64;
- typedef IMAGE_TLS_DIRECTORY64 * PIMAGE_TLS_DIRECTORY64;
- typedef struct _IMAGE_TLS_DIRECTORY32 {
- DWORD StartAddressOfRawData;
- DWORD EndAddressOfRawData;
- DWORD AddressOfIndex; // PDWORD
- DWORD AddressOfCallBacks; // PIMAGE_TLS_CALLBACK *
- DWORD SizeOfZeroFill;
- union {
- DWORD Characteristics;
- struct {
- DWORD Reserved0 : 20;
- DWORD Alignment : 4;
- DWORD Reserved1 : 8;
- } DUMMYSTRUCTNAME;
- } DUMMYUNIONNAME;
- } IMAGE_TLS_DIRECTORY32;
- typedef IMAGE_TLS_DIRECTORY32 * PIMAGE_TLS_DIRECTORY32;
例子:
- #include <iostream>
- #include <Windows.h>
- //TLS回调函数测试
- void NTAPI MY_TLS_CALLBACK(PVOID DllHandle, DWORD Reason, PVOID Reserved)
- {
- printf("CALL TLS 1\n");
- switch (Reason)
- {
- case DLL_PROCESS_ATTACH:
- printf("DLL_PROCESS_ATTACH\ttls 1\n");
- break;
- case DLL_THREAD_ATTACH:
- printf("DLL_THREAD_ATTACH\ttls 1\n");
- break;
- case DLL_THREAD_DETACH:
- printf("DLL_THREAD_DETACH\ttls 1\n");
- break;
- case DLL_PROCESS_DETACH:
- //printf("DLL_PROCESS_DETACH\ttls 1\n");//进程结束时并没有输出,可能关闭了通道??
- break;
- }
- }
- void NTAPI MY_TLS_CALLBACK2(PVOID DllHandle, DWORD Reason, PVOID Reserved)
- {
- printf("CALL TLS 2\n");
- switch (Reason)
- {
- case DLL_PROCESS_ATTACH:
- printf("DLL_PROCESS_ATTACH\ttls 2\n");
- break;
- case DLL_THREAD_ATTACH:
- printf("DLL_THREAD_ATTACH\ttls 2\n");
- break;
- case DLL_THREAD_DETACH:
- printf("DLL_THREAD_DETACH\ttls 2\n");
- break;
- case DLL_PROCESS_DETACH:
- //printf("DLL_PROCESS_DETACH\ttls 2\n");
- break;
- }
- }
- /*
- #ifdef _M_AMD64
- #pragma comment (linker, "/INCLUDE:_tls_used")
- #pragma comment (linker, "/INCLUDE:p_tls_callback1")
- #pragma const_seg(push)
- #pragma const_seg(".CRT$XLX")
- EXTERN_C const PIMAGE_TLS_CALLBACK p_tls_callback1[] = { MY_TLS_CALLBACK,MY_TLS_CALLBACK2,0 };
- #pragma const_seg(pop)
- #endif
- #ifdef _M_IX86
- #pragma comment (linker, "/INCLUDE:__tls_used")
- #pragma comment (linker, "/INCLUDE:_p_tls_callback1")
- #pragma const_seg(push)
- #pragma const_seg(".CRT$XLX")
- EXTERN_C const PIMAGE_TLS_CALLBACK p_tls_callback1[] = { MY_TLS_CALLBACK,MY_TLS_CALLBACK2,0 };
- #pragma const_seg(pop)
- #endif
- */
- #ifdef _M_AMD64
- #pragma comment(linker,"/INCLUDE:_tls_used")
- #pragma const_seg(".CRT$XLX")
- EXTERN_C const PIMAGE_TLS_CALLBACK p_tls_callback1[] = { MY_TLS_CALLBACK,MY_TLS_CALLBACK2,0 };
- #pragma const_seg()
- #endif
- #ifdef _M_IX86
- #pragma comment (linker, "/INCLUDE:__tls_used")
- #pragma const_seg(".CRT$XLX")
- EXTERN_C const PIMAGE_TLS_CALLBACK p_tls_callback1[] = { MY_TLS_CALLBACK,MY_TLS_CALLBACK2,0 };
- #pragma const_seg()
- #endif
- DWORD WINAPI MyThreadFunction(LPVOID lpParam) {
- int nb = *(int*)lpParam;
- for (int i = 0; i < nb; ++i) {
- printf("number: %d\n", i);
- Sleep(1000);
- }
- return 1;
- }
- int main()
- {
- std::cout << "Hello World!\n";
- DWORD dwThreadId=0;
- int number = 3;
- HANDLE hThread= CreateThread(
- NULL, // default security attributes
- 0, // use default stack size
- MyThreadFunction, // thread function name
- &number, // argument to thread function
- 0, // use default creation flags
- &dwThreadId); // returns the thread identifier
- getchar();
- }
输出:
《逆向工程核心原理》——TLS回调函数的更多相关文章
- 通过TLS回调函数的反调试
下面是TLS数据结构的定义 typedef struct _IMAGE_TLS_DIRECTORY { DWORD StartAddressOfRawData; DWORD EndAddressOfR ...
- TLS回调函数
@author: dlive TLS (Thread Local Storage 线程局部存储 )回调函数常用于反调试. TLS回调函数的调用运行要先于EP代码执行,该特性使它可以作为一种反调试技术使 ...
- TLS回调函数以及反调试简单使用
TLS回调函数以及反调试简单使用 0x00 TLS介绍 TLS(Thread Local Storage,线程局部储存),主要用于给线程独立的传值,由于线程不拥有进程的资源,所以几个同一进程的几个线 ...
- Mina、Netty、Twisted一起学(九):异步IO和回调函数
用过JavaScript或者jQuery的同学都知道,JavaScript特别是jQuery中存在大量的回调函数,例如Ajax.jQuery的动画等. $.get(url, function() { ...
- 小兔JS教程(三)-- 彻底攻略JS回调函数
这一讲来谈谈回调函数. 其实一句话就能概括这个东西: 回调函数就是把一个函数当做参数,传入另一个函数中.传进去的目的仅仅是为了在某个时刻去执行它. 如果不执行,那么你传一个函数进去干嘛呢? 就比如说对 ...
- 嵌入式&iOS:回调函数(C)与block(OC)传 参/函数 对比
C的回调函数: callBack.h 1).声明一个doSomeThingCount函数,参数为一个(无返回值,1个int参数的)函数. void DSTCount(void(*CallBack)(i ...
- 嵌入式&iOS:回调函数(C)与block(OC)回调对比
学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...
- 理解 JavaScript 回调函数并使用
JavaScript中,函数是一等(first-class)对象:也就是说,函数是 Object 类型并且可以像其他一等对象(String,Array,Number等)一样使用.它们可以"保 ...
- 关于js的回调函数的一点看法
算了一下又有好几个月没写博客了,最近在忙公司android的项目,所以也就很少抽时间来写些东西了.刚闲下来,我就翻了翻之前看的东西.做了android之后更加感觉到手机端开发的重要性,现在做nativ ...
随机推荐
- PostCSS All In One
PostCSS All In One https://postcss.org/ https://www.webpackjs.com/loaders/postcss-loader/ https://gi ...
- LeetCode 算法面试题汇总
LeetCode 算法面试题汇总 算法面试题 https://leetcode-cn.com/problemset/algorithms/ https://leetcode-cn.com/proble ...
- 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 ...
- 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 ...
- 如何使用 iMovie 去除视频里面的声音
如何使用 iMovie 去除视频里面的声音 视频去除背景音 iMovie https://www.apple.com/imovie/ https://books.apple.com/book/id14 ...
- auto open Chrome DevTools in the command line
auto open Chrome DevTools in the command line --auto-open-devtools-for-tabs # macOS $ /Applications/ ...
- macOS 显示/隐藏 AirPlay
macOS 显示/隐藏 AirPlay AirPlay Sidecar 必须用相同的 Apple ID 登录 mac 和 ipad, 才能使用! https://www.apple.com/macos ...
- 去中心化预言机如何助力NGK DeFi 项目发展?
早在 2014 年前后,协议智能合约就已经出现了,最初协议很笨重,包含了许多不同的部分,每个部分都是一个单独的智能合约,你需要在区块链本身的协议中添加不同的智能合约,这需要几个月甚至几年的时间,而之后 ...
- FTP服务器搭建以及上传下载的学习
首先需要搭建FTP服务步骤如下: 1.在win7上先开启ftp服务:这里点击确定后,可能会要等一会儿,完成后有时系统会提示重启 2.打开 计算机-->管理--> 在这里我们可以看见 ...
- es6 快速入门 —— 函数
其他章节请看: es6 快速入门 系列 函数 函数是所有编程语言的重要组成部分,es6之前函数语法一直没什么变化,遗留了许多问题,javaScript开发者多年来不断抱怨,es6终于决定大力度更新函数 ...