gpt4 book ai didi

c++ - 反调试器技术 : How to hide a thread from the debugger using VB. NET?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:02:27 27 4
gpt4 key购买 nike

几天来,我一直在尝试记录自己的反调试器技术。

所以我找到了很多不同的方法来实现这一点。在这些技术中,我发现了从调试器中隐藏线程的可能性,这要归功于 NtSetInformationThread 方法。 我的项目是在我用 VB.NET 编写的代码中使用此方法。

下面是对我在研究中发现的技术的描述,我觉得解释得很好:

In Windows 2000, a new class of thread information transferred to theNtSetInformationThread function appeared – ThreadHideFromDebugger.This was one of the first anti-debugging techniques provided byWindows in Microsoft's search for how to prevent reverse engineering,and it's very powerful. If this flag is set for a thread, then thatthread stops sending notifications about debug events

From this website

所以我从这个 site 找到了一个来源为了达成这个。这是他在 C++ 中使用的方法:

typedef enum _THREADINFOCLASS {

ThreadHideFromDebugger=17

} THREADINFOCLASS;

extern "C" ULONG __stdcall NtSetInformationThread(
__in HANDLE ThreadHandle,
__in THREADINFOCLASS ThreadInformationClass,
__in_bcount(ThreadInformationLength) PVOID ThreadInformation,
__in ULONG ThreadInformationLength
);

ULONG main()
{
ULONG Status;

Status=NtSetInformationThread(GetCurrentThread(), ThreadHideFromDebugger, NULL, 0);

if(Status)
printf("Error with NtSetInformationThread : 0x%xn", Status);

__asm {int 3}
return 0;
}

所以我尝试用我的 C++ 初学者知识来翻译这段代码(老实说,我对这种语言不太了解)。这是它给出的:

Private Declare Function NtSetInformationThread Lib "Ntdll.dll" (ByVal hThread As Long, ByVal ThreadInformationClass As Long, ByVal ThreadInformation As Long, ByVal ThreadInformationLength As Long) As Long
<DllImport("kernel32.dll")>

Public Shared Function GetCurrentThreadId() As UInteger
End Function

Shared Function HideFromDebugger() As UInteger
Dim Status As UInteger

Status = NtSetInformationThread(GetCurrentThreadId(), 17, Nothing, 0)

If Status <> 0 Then

Console.Write("Error with NtSetInformationThread : 0x{0:x}n", Status)
Debugger.Break()
Return 0
End If
End Function

但是,我觉得我哪里错了。例如,我不明白参数“17”的用途。你能告诉我我的方向是否正确吗?

每个答案对我来说都很有值(value):)

最佳答案

您快完成了,但是您当前的代码有两个问题:

首先,您对 NtSetInformationThread 函数的 P/Invoke 声明不太正确,我建议您坚持使用 DllImport 作为大多数 Declare Function 您在 Internet 上找到的声明是为 VB6 编写的,与 VB.NET 不兼容。

修改后的版本:

<DllImport("Ntdll.dll")>
Public Shared Function NtSetInformationThread(ByVal hThread As IntPtr, ByVal ThreadInformationClass As Integer, ByVal ThreadInformation As IntPtr, ByVal ThreadInformationLength As UInteger) As UInteger
End Function

其次,请注意 C++ 代码如何使用函数 GetCurrentThread()不是 GetCurrentThreadId()。这两者的不同之处在于,前者为您提供了一个更像是指向线程的指针的句柄,而后者仅为您提供了分配给该线程的数字 ID。

您需要改用 GetCurrentThread 函数:

<DllImport("Kernel32.dll")>
Public Shared Function GetCurrentThread() As IntPtr
End Function

I do not understand what the argument "17" is for.

17ThreadHideFromDebugger 的值,实际上没有任何特殊来源或意义。它只是告诉 NtSetInformationThread() 要更改有关线程的哪些信息。

关于c++ - 反调试器技术 : How to hide a thread from the debugger using VB. NET?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57118618/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com