通过分析一段木马的汇编代码,我发现了一个字符串"ZwQueryInformationThread"。我认为这是一种反调试技术,因为该过程在点击该行后终止。
但是,我找不到"ZwQueryInformationThread"停止该过程的任何好的解释。对我来说,目的很明确:它试图让我的工作更加努力,但我想获得更多相关信息。
所以,我的问题是:
有没有人可以告诉我是
"ZwQueryInformationThread"做什么的?
通过分析一段木马的汇编代码,我发现了一个字符串"ZwQueryInformationThread"。我认为这是一种反调试技术,因为该过程在点击该行后终止。
但是,我找不到"ZwQueryInformationThread"停止该过程的任何好的解释。对我来说,目的很明确:它试图让我的工作更加努力,但我想获得更多相关信息。
所以,我的问题是:
有没有人可以告诉我是
"ZwQueryInformationThread"做什么的?
相信你看到的是反反调试工具的NtSetInformationThread检测。该技术记录在https://ntquery.wordpress.com/2014/03/29/anti-debug-ntsetinformationthread/#more-6。
我们用错误的参数调用 NtSetInformationThread 两次,这将揭示大多数反反调试插件。由于 Vista 可以使用 NtQueryInformationThread,这使其功能更加强大。目前没有反反调试插件挂钩 NtQueryInformationThread 来阻止此检查。
它是那些“多用途”api 查询之一,其中参数指示您想要的信息(例如,线程退出代码、线程入口点、线程是否可调试等)。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684283%28v=vs.85%29.aspx
threadinfoclass 是 'key' 参数,它没有被很好地记录下来,所以像所有优秀的逆向器一样,我们希望 reactos 有一个参考......它确实如此
http://doxygen.reactos.org/d8/dfb/xdk_2pstypes_8h_ae45f91e457cfd1075daa9a900902a16d.html
所以你需要弄清楚的是你想要的线程信息类所需的 ThreadInformationLength 的大小,所以你只需以通常的方式使用小缓冲区调用它,然后检查调用的返回值(如果它有效) ,其 NT_SUCCESS 为零),否则它将是另一个值,通常表示缓冲区太小(在这种情况下,分配一个大小为您传递的 (ReturnLength) 参数的缓冲区并再次调用...
希望有帮助
编辑:只记得这个...
ThreadHideFromDebugger 是一种常用的反调试,但它有一个警告,(传递的参数是一个指向 TRUE (dword) 的指针...),一旦完成,传递 false 等将不起作用.. 即:一旦该线程的调用成功,无法撤消调试器隐藏)
ZwQueryInformationThread 是处理有关线程信息的查询的低级 API。与恶意软件相关的您可以像 evlncrn8 所说的那样从调试器中隐藏。您还可以使用它来隐藏线程,就像 rootkit 那样通过挂钩 API 来隐藏线程。
您如何在所有常见的出口 API 上设置断点并回顾实际调用出口的内容,以便您可以回到实际发生的事情?仅仅查看 ZwQueryInformationThread 并猜测它是那个 API 是没有意义的。
断点如下:
一旦它退出,您就可以跟踪它回到实际关闭程序的内容。