.text:0063EE70 public TlsCallback_0
.text:0063EE70 TlsCallback_0: ; DATA XREF: .CRT:TlsCallbacks_0
.text:0063EE70 mov [esi-6Dh], ebx
.text:0063EE73 xlat byte ptr gs:[ebx]
.text:0063EE75 retf 155h
怎么可能?默认情况下,tlscallback中的寄存器是否指向某些节/段?在这里使用了esi,但它具有一些默认值,来自
ntdll:ntdll_LdrShutdownThread+386
。 pro + windbg,tls回调在入口点之前被命中。qsi2010q
esi指向应用程序内的某个
DATA
段,这是默认的os行为吗?此外,这里的TLS目录的定义如下:
您可以看到TLS_end和TLS_start指向图像库。我的问题是,如果没有调试器,此回调如何不会使程序崩溃?当我连接调试器时,为什么会这样呢?这是我无法理解的某种反调试技术
#1 楼
使用TLS回调是一种古老的反调试技巧。在可执行文件入口点和调试器获得控制权之前,将执行TLS中的代码。这允许TLS检查调试器的存在并采取相应的措施。使用OllyDbg绕过它的一种方法是在“系统断点”而不是默认的“ WinMain”暂停Olly Advanced插件允许您破坏TLS。
可能在TLS的开头放置一个INT 3(0xCC)(并替换原始字节)会破坏并允许您逐步查找令人反感的代码,但我不记得这是否真的有效,您必须对其进行测试。
#2 楼
TLS回调可能在附加时执行,因为OS使用软件断点创建了指向DbgUiBreakin
的新线程以停止程序执行,并且新线程导致TLS回调得以执行。#3 楼
TLSCallbacks中的异常已被Windows丢弃,但不再调用进一步的回调,然后将控制权转移到主入口点。但是,为TLSCallback显示的代码看起来像垃圾,这些寄存器是不可预测的,我怀疑您所显示的内容是否已实际执行。数组指针。每个回调依次执行,并且任何回调都可以更改数组中的条目以供以后的回调条目使用。
TlsEnd的标签不正确。零标记前两个字段(要保留的存储区域的开始和结束)中未使用的值。
您可以在我的网站上看到TLS的示例:http://pferrie.host22.com
(假设它今天在起作用),从2008年开始的公司演示部分中。
评论
但是在进程启动时,执行tls回调是否正确?回调在静态反汇编中看起来完全相同,它们是如何做到的,即在进程启动时未执行此回调?并且仅在附加调试器的情况下运行
–BakedPotatoWithCheese
17年11月27日在21:40
此处也有此说明:mov [esi-6Dh],ebx,xlat byte ptr gs:[ebx]不会由于某种原因引起访问冲突,ebx和esi如何指向有效位置?
–BakedPotatoWithCheese
17年11月27日在21:41
我不知道,没有二进制文件很难说。
–伊戈尔·斯科钦斯基♦
17年11月27日在21:42