首页
社区
课程
招聘
看不懂,有人可以解析一下TLS吗?
发表于: 2006-10-13 17:16 5964

看不懂,有人可以解析一下TLS吗?

2006-10-13 17:16
5964
下面是搜索找到的一些关于TLS的信息,究竟这个和软件加载过程中Anti_debugger有何关系,如果可以,最好能给个VC的例子,谢谢:
////////////////////////////////////////
如果希望每个线程都可以有线程局部(Thread   local)的静态存储数据,可以使用TLS线程局部存储技术。TLS为进程分配一个TLS索引,进程的每个线程通过这个索引存取自己的数据变量的拷贝。   
  TLS对DLL是非常有用的。当一个新的进程使用DLL时,在DLL入口函数DllMain中使用TlsAlloc分配TLS索引,TLS索引就作为进程私有的全局变量被保存;以后,当该进程的新的线程使用DLL时(Attahced   to   DLL),DllMain给它分配动态内存并且使用TlsSetValue把线程私有的数据按索引保存。DLL函数可以使用TlsGetValue按索引读取调用线程的私有数据。   
  TLS函数如下:   
  DWORD   TlsAlloc()   
  在进程或DLL初始化时调用,并且把返回值(索引值)作为全局变量保存。   
  BOOL   TlsSetValue(   
  DWORD   dwTlsIndex, //TLS   index   to   set   value   for     
  LPVOID   lpTlsValue   //value   to   be   stored     
  );   
  其中:   
  dwTlsIndex是TlsAlloc分配的索引。   
  lpTlsValue是线程在TLS槽中存放的数据指针,指针指向线程要保存的数据。   
  线程首先分配动态内存并保存数据到此内存中,然后调用TlsSetValue保存内存指针到TLS槽。   
  LPVOID   TlsGetValue(   
  DWORD   dwTlsIndex   //   TLS   index   to   retrieve   value   for   
  );   
  其中:   
  dwTlsIndex是TlsAlloc分配的索引。   
  当要存取保存的数据时,使用索引得到数据指针。   
  BOOL   TlsFree(   
  DWORD   dwTlsIndex   //   TLS   index   to   free   
  );   
  其中:   
  dwTlsIndex是TlsAlloc分配的索引。   
  当每一个线程都不再使用局部存储数据时,线程释放它分配的动态内存。在TLS索引不再需要时,使用TlsFree释放索引。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
2
http://bbs.pediy.com/showthread.php?threadid=31875
不知是否和你想知道的有关
2006-10-13 18:55
0
雪    币: 12626
活跃值: (3122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
thank you
2006-10-14 08:14
0
雪    币: 272
活跃值: (143)
能力值: ( LV15,RANK:930 )
在线值:
发帖
回帖
粉丝
4
呵呵,那篇源码主要是讲 tls callback 的,不过也处理了替换原始 tls 目录导致的问题

那个程序我采用的是一般壳处理的 tls 方法。没有注释,我简单讲一下吧
首先创建一个原始 IMAGE_TLS_DIRECTORY 的拷贝,修改 IMAGE_DATA_DIRECTORY 中相关数据指向它。修改新的  IMAGE_TLS_DIRECTORY 中的 AddressOfIndex 和 AddressTlsCallback 指向有效空间(注意他们都是 VA),在壳没有把控制权交给员程序时,使用 AddressOfIndex 所指的索引值获取的主线程的局部存储的位置,使用正确的数据把它覆盖掉(如果你加密了 StartAddressOfRawData 和 EndAddressOfRawData 之间的数据),然后把 AddressOfIndex 所指的索引值传递给原始  IMAGE_TLS_DIRECTORY 的 AddressOfIndex 所指位置。

如果被处理程序有 tls callback, 你需要替代系统呼叫 AddressOfCallback 所指 callback 程序

希望讲清楚和点子上
2006-10-14 09:19
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
5
完全不懂
2006-10-14 17:34
0
游客
登录 | 注册 方可回帖
返回
//