TLS 回调的 exe 保护,试图了解行为

逆向工程 拆卸 混淆 动态分析 保护 入口点
2021-06-22 07:51:52

我有一个应用程序,被 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

我附上了完整的堆栈跟踪,这是调用此回调的堆栈跟踪,当我在 ida pro+windbg 下运行应用程序时,tls 回调在入口点之前被命中。

堆栈跟踪

esi 指向DATA应用程序内的某个段,这是默认的操作系统行为吗?此外,这里的 TLS 目录定义如下:

tls

如您所见, TLS_end 和 TLS_start 指向镜像库。

所以我的问题是,这个回调如何在没有调试器的情况下不使程序崩溃?为什么当我附加调试器时会出现这种情况?这是某种我无法理解的反调试技术

tls 回调

3个回答

使用 TLS 回调是一个古老的反调试技巧。TLS 中的代码在可执行文件入口点和调试器获得控制之前执行。这允许 TLS 检查调试器的存在并相应地采取行动。

绕过它的一种方法是使用 OllyDbg 是在“系统断点”而不是默认的“WinMain”处暂停,我相信 Olly Advanced 插件允许您中断 TLS。

可能将 INT 3 (0xCC) 放在 TLS 的开头(并替换原始字节)会中断并允许您逐步查找有问题的代码,但我不记得这是否真的有效,您必须进行测试它。

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

但是,您为 TLSCallback 显示的代码看起来像垃圾,寄存器是不可预测的,我怀疑您显示的内容是否已实际执行。

请注意, TLSCallback 字段不是单个回调,它是指向数组的指针,但您的屏幕截图掩盖了数组指针。每个回调依次执行,任何回调都可以更改数组中的条目以供以后的回调条目使用。

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

您可以在我的网站上看到 TLS 的示例:http : //pferrie.host22.com (假设它今天可以使用)在 2008 年的公司介绍部分。

TLS 回调可能会在附加时执行,因为操作系统创建了一个指向DbgUiBreakin软件断点的新线程以停止程序的执行,并且新线程导致 TLS 回调被执行。