|
|
最近学习 yoda 1.2 , 发现 Thread Local Storage(TLS)部分处理不太明白, yoda 只是简单地把IMAGE_TLS_DIRECTORY32 复制到其他地方, 加壳后好象也没什么问题.
IMAGE_TLS_DIRECTORY32 STRUCT
StartAddressOfRawData dd ?
EndAddressOfRawData dd ?
AddressOfIndex dd ?
AddressOfCallBacks dd ?
SizeOfZeroFill dd ?
Characteristics dd ?
IMAGE_TLS_DIRECTORY32 ENDS
后来我在 yoda 的基础上 加了 aPlib, 问题就出来了, 程序不能运行了, 调试后发现问题就出在 TLS 上, 看来仅仅把IMAGE_TLS_DIRECTORY32 复制一份是不够的, 加壳时要完美处理TLS 好象比较困难, 不知各位写壳高手有什么好的办法? 还好, 用到 TLS 的程序好象不多.
下面是我的实验过程
附件:tls.zip
五. 从上面可见, Tls 数据初试化和 TLS回调函数都在 OEP 之前进行, 如果程序加壳, 壳的 Loader 这时还没有起作用, 代码和 IAT 都没有解密, 要执行 回调函数肯定出错.
还要注意, IMAGE_TLS_DIRECTORY32 的数据都是 VA, 不是 RVA, 还涉及到重定位的问题.
不过, 有TLS 回调函数的程序不多, 壳只要简单地复制 IMAGE_TLS_DIRECTORY32 就可以了. |
|