C++ TLS 实现 Shellcode Loader

C++ TLS 实现 Shellcode Loader - 侠者安全社区
C++ TLS 实现 Shellcode Loader
此内容为付费阅读,请付费后查看
会员专属资源
您暂无购买权限,请先开通会员
开通会员
付费阅读

0x0 基础知识

00 TLS 是什么?

线程局部存储(Thread Local Storage,TLS)是一种将数据与特定执行线程关联的机制。当在一个线程内部的各个函数调用之间共享数据,但不让其他线程访问时,可以使用TLS

01 TLS 回调函数

  • TLS提供了一个回调函数,在线程初始化和终止时会被调用,这个回调函数会在程序入口点(即main函数)之前执行,调试器通常会在主函数入口点设置断点,因此TLS回调函数经常被用作反调试手段。
  • TLS回调函数允许我们编写并执行任意代码。TLS有两种类型:静态TLS和动态TLS。静态TLS将TLS相关数据硬编码在PE(Portable Executable)文件中,而动态TLS在运行时分配和管理TLS数据。静态TLS是将TLS相关数据硬编码在PE(Portable Executable,可执行文件)中。静态TLS存储在PE头的IMAGE_DATA_DIRECTORY DataDirectory[9]位置,可以通过该位置找到TLS目录的详细信息。
  • 通过在TLS回调函数中加载和执行shellcode,我们可以在程序的正常执行流之前运行这段代码。这种方法可以绕过调试器设置的断点,增加分析和调试的难度

TLS回调函数遵循特殊的编写约定,与DLL主函数类似。回调函数使用以下类型定义:

typedef VOID
(NTAPI *PIMAGE_TLS_CALLBACK) (
 PVOID DllHandle, //DLL模块的句柄
 DWORD Reason, //调用原因。这个参数与DLL调用时的原因相同,例如:DLL_PROCESS_ATTACH(当进程加载DLL时)、DLL_THREAD_ATTACH(当线程创建时)等
 PVOID Reserved  //保留参数,通常用于区分DLL是显式加载还是隐式加载
 );

0x1 实现代码

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情

    暂无评论内容