我有一个被FSG保护器迷惑的应用程序。当我尝试解压缩它时,我遇到的第一个障碍是,当我使用调试器启动该过程/或稍后附加调试器时,我立即收到ACCESS VIOLATION异常,因为执行了Tls回调,内容如下: >
.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回调得以执行。

评论


但是在进程启动时,执行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

#3 楼

TLSCallbacks中的异常已被Windows丢弃,但不再调用进一步的回调,然后将控制权转移到主入口点。

但是,为TLSCallback显示的代码看起来像垃圾,这些寄存器是不可预测的,我怀疑您所显示的内容是否已实际执行。数组指针。每个回调依次执行,并且任何回调都可以更改数组中的条目以供以后的回调条目使用。

TlsEnd的标签不正确。零标记前两个字段(要保留的存储区域的开始和结束)中未使用的值。

您可以在我的网站上看到TLS的示例:http://pferrie.host22.com
(假设它今天在起作用),从2008年开始的公司演示部分中。