说实在的我本是想从PEB中保存 调试对象句柄 的标志位判断是
否被调试的,可惜搞了个多小时也没搞定 实在算不准偏移到底
是好多、当然可以在WinDbg在DT !PEB不过真的很麻烦,我在
网上找了一些PEB结构的声明,最后我再Nirsoft.NET上找到了
一个很全面地PEB结构声明,说实在话看的我不知所云、好吧
保存调试对象句柄的标志位为 ->ulONG SystemReserved[1];
当然我个体也只记得在什么Reserved[1]中,毕竟我也是很久以
前看过点相关的资料、当然从Reserved[1]中判断是否被调试也
有一定缺点,现在过保护驱动可以过掉 也就是说你不一定还能
检查的出来、你们可以参考下反调试技术揭秘上的资料,当然
有兴趣可以研究!PEB / KernelStruct、它在某些时候的很有用
BeingDeBUGged 当进程被调试器附加时, *** 作系统会自动设置这
个标志位 一般来说 我们只需要在一个额外线程中循环定期检查
就可以了、当然如果要比较好的方法 可能是从HeapFlags判断了
不过都可以从上面的反调试技术揭秘中找到、
上面先通过NtqueryinformationProcess获取PBI(进程基类信息)
这个信息里面包含了,PEB入口点、宿主进程、退出代码、等
当然从PBI中获取PEB入口地址是比较亲民的做法,难道你要在
VB.NET中利用汇编从FS(标志段)寄存器中去获取到PEB吗?
在PEB入口点偏移0x2的位置是BeingDeBUGged、
示例代码:
imports System.Runtime.InteropServicesimports System.Text.RegularExpressionsModule MainModule Declare Function NtqueryinformationProcess lib "ntdll.dll" (ProcessHandle As IntPtr,informationClass As Integer,ByRef Processinformation As PROCESS_BASIC_informatION,ProcessinformationLength As Integer,ReturnLength As Integer) As Integer Declare Function GetCurrentProcess lib "kernel32.dll" () As IntPtr <StructLayout(LayoutKind.Sequential)> Structure PROCESS_BASIC_informatION Public ExitStatus As Integer Public PebBaseAddress As IntPtr Public AffinityMask As Integer Public BasePriority As Integer Public UniqueProcessID As Integer Public inheritedFromUniqueProcessID As Integer End Structure <StructLayout(LayoutKind.Sequential)> Structure PEB Public inheritedAddressspace As Byte Public ReadImagefileExecoptions As Byte Public BeingDeBUGged As Byte Public SpareBool As Byte Public Mutant As IntPtr Public ImageBaseAddress As IntPtr Public Ldr As IntPtr End Structure Const NulL As Integer = 0 Const STATUS_SUCCESS As Integer = NulL Const SystemBasicinformation As Integer = 0 Sub Main() Console.Writeline(IsDeBUGgerPresent()) DeBUGger.Break() End Sub Function IsDeBUGgerPresent() As Boolean Dim pbi = New PROCESS_BASIC_informatION() If (STATUS_SUCCESS <> NtqueryinformationProcess(GetCurrentProcess(),SystemBasicinformation,pbi,Marshal.SizeOf(pbi),NulL)) Then Throw New Exception("Unable to get pbi.") End If Dim peb = CType(Marshal.PtrToStructure(pbi.PebBaseAddress,GetType(PEB)),PEB) Return peb.BeingDeBUGged <> 0 End FunctionEnd Module总结
以上是内存溢出为你收集整理的VB.NET 从PEB->BeingDebugged标志位判断被调试全部内容,希望文章能够帮你解决VB.NET 从PEB->BeingDebugged标志位判断被调试所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)