1.反调试技术的简单总结。根据破解的方法反调试技术大致可以分为静态与动态两组。调试运用了静态调试技术的程序文件的时候,只要在开始破解一次就可以全部解除反调试限制,动态调试要一边调试一边破解。简单的总结如下图所示。
2.静态反调试技术
主要用来检测自身是否处于被调试状态,若处于被调试状态,则执行非常规代码组织。
2.1 PEB
利用PEB可以判断进程是否处于被调试状态,借助FS段寄存器所指的TEB 结构体可以获取进程的PEB结构体,FS[0x30]= address of PEB,或者先获取TEB再获取PEB, FS[0x18]=address of TEB
2.1.1 BeingDebugged(0x2)
BeingDebug成员用来判断进程是否处于被调试状态,被调试的时候他的值为1.
IsDebuggerPresent(),用来对PEB进行判断
破解:直接用od将BeingDebugged设置为0就行了
2.1.2 Process Heap(0x18)
PEB.Process Heap指向HEAP指针结构体
GetProcessHeap()可以访问PEB,ProcessHep成员
程序正常运行时 Heap.Flags成员(0xC)值为0x2,Heap.ForceFlags值为0x0,调试状态的时候这些值会改变
破解:将相应的值正常设置为0x2和0x0就可以了
2.1.3 NtGlobalFlag(0x68)
调试的时候NtGlobalFlag会被设置成0x70,检测改制就可以检测程序是否处于调试状态。
破解,将PEB.NtGlobalFlag值为0就可以了,附加调试的时候,NtGlobalFlag的值是不变的
2.2 NtQueryInformationProcess()
通过该函数可以获取各种与进程相关的信息
设置第二个参数ProcessInformationClass为指定值,并调用该函数,相关信息就会被设置到第三个参数ProcessInformation里面
ProcessInformationClass是枚举类型
2.2.1 ProcessDebugPort(0x7)传入的是值
进程处于调试状态就会为它分配一个调试端口,Debug Port,进程处于调试的时候,变量dwDebugPort被设置为0xffffffff,非调试状态的时候,dwDebugPort被设置为0x0
checkRemoteDebuggerPresent()函数会调用ProcessDebugPort进行检测,不仅仅可以用来检测当前进程,还可以用来检测其它进程是否处于调试状态。
2.2.2 ProcessDebugObjectHandle(0x1E)
调试的时候会生成调试对象(DebugObject),,若进程处于调试状态的时候,调试对象句柄值就存在,处于非调试状态的时候,调试对象句柄值为NULL.
2.2.3 ProcessDebugFlags(0x1f)
检测Debug Flags(调试标志)的值可以判断进程处于调试状态,通过函数第三个参数就可以获取调试标志的值,若为0,则处于调试状态,若为1,则处于非调试状态。
2.2.4破解之法
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2019-2-22 14:57
被wwzzww编辑
,原因: 错字