下面是TLS数据结构的定义

typedef struct _IMAGE_TLS_DIRECTORY
{
DWORD StartAddressOfRawData;
DWORD EndAddressOfRawData;
DWORD AddressOfIndex;
DWORD AddressOfCallBacks; //PIMAGE_TLS_CALLBACK*
DWORD SizeOfZeroFill;
DWORD Characteristics;
}IMAGE_TLS_DIRECTORY;

AddressOfCallBacks是一个数组,表示可以有多个TLS回调函数,所谓的TLS回调函数,就是当创建/终止进程的线程时会自动调用的执行的函数。

创建进程的主线程也会自动调用回调函数,且其调用执行先于EP代码,反调试技术利用的就是TLS回调函数这一特性。

回调函数定义如下

typedef VOID
(NTAPI *PIMAGE_TLS_CALLBACK)(
PVOID DllHandle,
DOWRD Reason, //DLL_PROCESS_ATTACH,DLL_THREAD_ATTACH,DLL_THREAD_DETACH,DLL_PROCESS_DETACH
PVOID Reserved
);

进程调用main前,已注册的TLS回调函数会被调用执行,此时Reason为DLL_PROCESS_ATTACH

之后创建线程,结束线程,进程结束都会调用TLS回调函数,进程周期内TLS回调函数会被调用4次。

#include "stdafx.h"
#include<windows.h>
#include "tlhelp32.h" #pragma comment(linker, "/INCLUDE:__tls_used")
VOID NTAPI TLS_CALLBACK(PVOID DllHandle,DWORD Reason,DWORD Reserved)
{
DWORD Flag;
__asm{
mov eax,fs:[0x30]
movzx eax,BYTE PTR DS:[eax+] //PEB.BingDebugged
mov Flag,eax
}
if(Flag==)
{
MessageBox(NULL,L"Error",L"Error",);
ULONG nProcessID = ;
HWND hFindWindow = FindWindow(NULL,L"OLLYDBG");
::GetWindowThreadProcessId( hFindWindow, &nProcessID );
HANDLE hProcessHandle = ::OpenProcess( PROCESS_TERMINATE, FALSE,nProcessID );
TerminateProcess( hProcessHandle, );
ExitProcess();
}
else
{
MessageBox(NULL,L"OK",L"OK",);
}
} #pragma data_seg(".CRT$XLX")
PIMAGE_TLS_CALLBACK pTLS_CALLBACKs[] ={(PIMAGE_TLS_CALLBACK)TLS_CALLBACK,};
#pragma data_seg() int _tmain(int argc, _TCHAR* argv[])
{
MessageBox(NULL,L"HelloWorld",L"Exit",);
}

这里就是利用TLS回调函数检测是否处于调试状态

通过TLS回调函数的反调试的更多相关文章

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

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

  2. TLS回调函数

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

  3. 《逆向工程核心原理》——TLS回调函数

    pe中TLS(thread local storage)中函数的执行时机早于入口函数(entry point), 相关结构: // // Thread Local Storage // typedef ...

  4. 基于TLS的反调试技术

    TLS(Thread Local Storage 线程局部存储) 一个进程中的每个线程在访问同一个线程局部存储时,访问到的都是独立的绑定于该线程的数据块.在PEB(进程环境块)中TLS存储槽共64个( ...

  5. TLS反调试

    0x01 TLS反调试简介 TLS(Thread Local Storage)原本的目的是解决多线程程序中变量同步的问题.线程本身有独立于其他线程的栈空间,因此线程中的局部变量不用考虑同步问题.多线程 ...

  6. WIN10 X64下通过TLS实现反调试

    目录(?)[-] TLS技术简介 1 TLS回调函数 2 TLS的数据结构 具体实现及原理 1 VS2015 X64 release下的demo 2 回调函数的具体实现 21 使用IsDebugger ...

  7. C/C++ 程序反调试的方法

    C/C++ 要实现程序反调试有多种方法,BeingDebugged,NtGlobalFlag,ProcessHeap,CheckRemoteDebuggerPresent,STARTUPINFO,Is ...

  8. Windows反调试技术(下)

    OD的DBGHELP模块 检测DBGHELP模块,此模块是用来加载调试符号的,所以一般加载此模块的进程的进程就是调试器.绕过方法也很简单,将DBGHELP.DLL改名. #include <Wi ...

  9. Windows 32位-调试与反调试

    1.加载调试符号链接文件并放入d:/symbols目录下. 0:000> .sympath srv*d:\symbols*http://msdl.microsoft.com/download/s ...

随机推荐

  1. .net core webapi 文件上传在 Swagger 文档中的有好提示处理

    前提: 需要nuget   Swashbuckle.AspNetCore 我暂时用的是  4.01 最新版本: 描述:解决 .net core webapi 上传文件使用的是 IFormFile,在S ...

  2. (转)深入研究MiniMVC之后续篇

    今天在园子看到<深入研究 蒋金楠(Artech)老师的 MiniMvc(迷你 MVC),看看 MVC 内部到底是如何运行的>之后,本来是不打算开博来续这个后传,不过,在那边回了个评论之后, ...

  3. 一大波趣图:CSS的力量

    CSS的力量         CSS的作用,一目了然~     见识一下CSS的厉害!   用了CSS,效果显著   HTML5 + CSS3 + Javascript会怎么样?       HTML ...

  4. 基于CAS的单点登录实战(2)-- 搭建cas的php客户端

    在这之前已经搭好了CAS服务端 基于CAS的单点登录实战(1)-- 搭建cas服务器 PHP-Client php-Client是官方支持的,去官网下个最新版就好了.phpCAS 接入很简单,解压放到 ...

  5. MVC进阶篇(二)—路由机制

    前言 这个东西好像,一般也不经常动,都用默认的即可.由于MVC模式在framework里面的解析机制,区别与webform模式,是采用解析路由机制的url.从来实例化视图列对象,然后对该action进 ...

  6. php代码审计2全局变量和超全局变量

    全局变量:就是在函数外面定义的变量,不能在函数中直接使用,因为它的作用域不会到函数内部,所以在函数内部使用的时候尝尝看到类似global $a; 超全局变量:在所有脚本都有效,所以,在函数可以直接使用 ...

  7. Spring之BeanFactory与ApplicationConText

    :BeanFactory基本的工厂解析,管理,实例化所有容器内的bean的接口,spring中所有解析配置文件的类都直接或者间接实现该接口ApplicationContext接口implements ...

  8. 关于fatal error LINK1123:failure during conversion to COFF:file invalid or corrupt

    今天用Visual Studio 2010编译postgresql工程时突然遇到下面这个编译错误: fatal error LINK1123:failure during conversion to ...

  9. js去重方法

    function remove(array){ var obj={}; newarray=[]; for(var i in array){ console.log(i); var arg=array[ ...

  10. luogu3703 [SDOI2017]树点涂色(线段树+树链剖分+动态树)

    link 你谷的第一篇题解没用写LCT,然后没观察懂,但是自己YY了一种不用LCT的做法 我们考虑对于每个点,维护一个fa,代表以1为根时候这个点的父亲 再维护一个bel,由于一个颜色相同的段一定是一 ...