首页
社区
课程
招聘
Come On! 一起来体验一下TLS CALL的强大吧
发表于: 2005-10-23 01:04 16375

Come On! 一起来体验一下TLS CALL的强大吧

2005-10-23 01:04
16375
收藏
免费 7
支持
分享
最新回复 (15)
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
2
9x下系统忽略TLS么
2005-10-23 01:17
0
雪    币: 245
活跃值: (195)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
3
最初由 forgot 发布
9x下系统忽略TLS么


9X,不可能忽略 TLS....
2005-10-23 01:42
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
4
simonzh的例子枪毙掉TlsDirectory也可以运行啊。

从这里看似乎是支持9x

Thread Local Storage
All threads of a process share its virtual address space. The local variables of a function are unique to each thread that runs the function. However, the static and global variables are shared by all threads in the process. With thread local storage (TLS), you can provide unique data for each thread that the process can access using a global index. One thread allocates the index, which can be used by the other threads to retrieve the unique data associated with the index.

The constant TLS_MINIMUM_AVAILABLE defines the minimum number of TLS indexes available in each process. This minimum is guaranteed to be at least 64 for all systems. The limits are as follows:

System Limit
Windows Server 2003, Windows XP, and Windows 2000 1088 indexes per process
Windows Me/98 80 indexes per process
Windows NT and Windows 95 64 indexes per process

但是,注意看第2句,好像又是nt系列特有的?
6.7. The .tls Section
The .tls section provides direct PE/COFF support for static Thread Local Storage (TLS). TLS is a special storage class supported by Windows NT, in which a data object is not an automatic (stack) variable, yet it is local to each individual thread that runs the code. Thus, each thread can maintain a different value for a variable declared using TLS.
2005-10-23 01:43
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
5
我是一直不了解TLS,看了个图之后这么理解:

程序用个全局变量保存一个 TlsIndex
TlsIndex = TlsAlloc();
之后每个线程可以用TlsGet/SetValue(TlsIndex)来获得对于线程来说透明的某个值(拗口啊),可以是动态内存的指针等等
最后要TlsFree

如果使用静态Tls譬如在PE Header里有
则指定一个地址固定接受系统给的Index

关于其他域我还不明白,我猜是:

这种情况下TlsGet/SetValue操作的就是
Raw Data Start VA 至 Raw Data End VA
并且 Size of Zero Fill 个00
这种内存块的地址.

万望指教。
2005-10-23 01:52
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
6
这段代码会弹出2个msgbox,乖乖
原来结束的时候也要call back

最后发现要执行三次

PROC_ATTACH
THREAD_ATTACH
THREAD_DETACH ;这次可能弹不出了

; 编译模式="CON"

INCLUDE                 INCLUDE\INTRO.INC

                        .DATA

TlsIndex                DD      0

ShowIndex               DB      "Tls Index = ", 0
ShowReason              DB      "Tls Callback Reason = ", 0

                        .CODE

TlsTable:                                               ; RVA = 0x1342
                        DD      0
                        DD      0
                        DD      OFFSET TlsIndex
                        DD      OFFSET TlsCallbacks
                        DD      0
                        DD      0

TlsCallbacks:           
                        DD      OFFSET TLS_CALLBACK
                        DD      0

START:                  LEA     EDX, ShowIndex
                        CALL    dump_edx
                        MOV     EAX, TlsIndex
                        CALL    dump_hexdword
                        CALL    dump_crlf

                        PUSH    0
                        CALL    ExitProcess

TLS_CALLBACK:           LEA     EDX, ShowReason
                        CALL    dump_edx
                        MOV     EAX, [ESP+4*2]
                        CALL    dump_hexdword
                        CALL    dump_crlf

                        PUSH    0
                        @pushsz "Huh"
                        @pushsz "I'm Tls Callback"
                        PUSH    0
                        CALL    MessageBoxA                     
                        RETN    4*3

                        END     START
2005-10-23 02:09
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
7
最初由 forgot 发布
我是一直不了解TLS,看了个图之后这么理解:

程序用个全局变量保存一个 TlsIndex
TlsIndex = TlsAlloc();
之后每个线程可以用TlsGet/SetValue(TlsIndex)来获得对于线程来说透明的某个值(拗口啊),可以是动态内存的指针等等
........


前面三个值很模糊,还没有见过应用的例子,只知道会影响Heap和FS:[2C]
2005-10-23 08:24
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
8
good!
2005-10-23 08:56
0
雪    币: 111
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
好贴~
受教了
2005-10-23 10:37
0
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
10
线程启动和结束的时候都要调用TLSCallback。以前的ExeCryptor执行完后就把thrad函数改成ret了,现在好象没有了?

CodeProject上有篇讲TLSCallback的文章。
2005-10-23 11:24
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
11
最初由 softworm 发布
线程启动和结束的时候都要调用TLSCallback。以前的ExeCryptor执行完后就把thrad函数改成ret了,现在好象没有了?

CodeProject上有篇讲TLSCallback的文章。


学习, 我去找找再研究一下
2005-10-23 11:35
0
雪    币: 207
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
支持!!!!学习!!!!
2005-10-27 11:52
0
雪    币: 124
活跃值: (70)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
发错帖子了,晕
2006-4-18 04:20
0
雪    币: 279
活跃值: (145)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
14
学习,牛!
2006-4-18 07:40
0
雪    币: 86
活跃值: (1258)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
这种境界
2006-4-18 08:30
0
雪    币: 117
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
不好意思,翻下老贴,原来论坛就有TLS的贴子,只不过还是没有看懂,对于TLS,究竟是一个什么东东,我根本都没有概念。
网上搜索也没有找到,希望有哪位给解释一下。
2006-8-29 10:56
0
游客
登录 | 注册 方可回帖
返回
//