我敢肯定,你们中许多人所熟悉的通过调用来完成这个经典antidebug招ZwSetInformationThread
用ThreadInformationClass
设置为0×11。尽管存在许多 OllyDbg 模块是为了揭示使用此方法隐藏的线程的存在,但我无法找到有关在 OllyDbg 中用于取消隐藏这些线程的规范技术的任何信息。
该函数是否通常在用户模式下挂钩(例如SetWindowsHookEx
),还是修补直接调用 NTDLL 函数或间接调用它的系统调用的指令更实用?
我敢肯定,你们中许多人所熟悉的通过调用来完成这个经典antidebug招ZwSetInformationThread
用ThreadInformationClass
设置为0×11。尽管存在许多 OllyDbg 模块是为了揭示使用此方法隐藏的线程的存在,但我无法找到有关在 OllyDbg 中用于取消隐藏这些线程的规范技术的任何信息。
该函数是否通常在用户模式下挂钩(例如SetWindowsHookEx
),还是修补直接调用 NTDLL 函数或间接调用它的系统调用的指令更实用?
据我所知, SetWindowsHookEx 并没有真正用于这种挂钩。
您可以在要分析的二进制文件的导入中挂钩 NtSetInformationThread,并使其始终在 ThreadHideFromDebugger 上返回成功,但不会将调用转发到实际函数。这会很弱,因为 GetProcAddress 或手动导入会绕过它。
您可以通过在函数序言中插入对您自己的函数的调用来挂钩 NtSetInformationThread 函数,然后忽略 ThreadHideFromDebugger,同时将其余函数转发到原始函数。
我强烈建议反对它,但为了完整起见,您也可以在系统服务调度表中挂钩 NtSetInformationThread 。对于不同的 Windows 版本,这里有一个很好的表格转储。如果您想自己获取表中的索引,您可以从 ntdll.dll 中反汇编 NtSetInformationThread 导出。
如果您对更多的反调试技术感兴趣,强烈建议您阅读Peter Ferrie 的精彩反调试参考。