[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