TLS线程本地存储进行反调试

[TOC]
反盗版技术中,起最大作用的当属反调试技术。然而传统的反调试技术都存在一个弱点:他们都在程序真正开始执行之后才采取反调试手段。实际上在反调试代码被执行前,调试器有大量的时间来影响程序的执行,甚至可以在程序入口处插入断点命令来调试程序。对于使用C/C++语言编译的程序来说,问题通常会更严重,在执行到main()函数之前,会执行C/C++编译器插入的很大一段代码,这也给调试器带来影响程序执行的机会。

TLS 反调试

TLS 简述

TLS设计的本意,是为了解决多线程程序中变量同步的问题,是Thread Local Storage的缩写,意为线程本地存储。
线程本身有独立于其他线程的栈空间,因此线程中的局部变量不用考虑同步问题。
多线程同步问题在于对全局变量的访问,TLS在操作系统的支持下,通过把全局变量打包到一个特殊的节,当每次创建线程时把这个节中的数据当做副本,拷贝到进程空闲的地址空间中。
以后线程可以像访问局部变量一样访问该异于其他线程的全局变量的副本,而不用加同步控制。

对线程本地存储的全局变量的测试代码

 #include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <iomanip>
using namespace std;
// 定义静态TLS全局变量
__declspec(thread) int value =0xcccccccc;__
DWORD WINAPI NewThread ( LPVOID lParam )
{
    // 设置子线程value,并不影响其他线程
    value = *((int*)lParam);
    while(1)
    {
        printf("%d\n",value);
        Sleep(1000);
    }
    return 0 ;
}

#define THREAD_NUM 3
int main(int argc, char* argv[])
{
    int arry[3]={
  1,2,3};
    // 设置主线程静态TLS的value为5
    value = 5 ;
    // 创建子线程
    HANDLE hThread[THREAD_NUM];
    for (int loop = 0; loop < THREAD_NUM; loop++)
    {
        hThread[loop] = CreateThread ( NULL, 0, NewThread, &arry[loop], 0, NULL );
        Sleep(1000);
    }
    // 等待直到子线程结束
    WaitForMultipleObjects(THREAD_NUM, hThread, TRUE, INFINITE);
    return 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值