逆向笔记3

来源:互联网 发布:java语言编译器win10 编辑:程序博客网 时间:2024/05/19 13:45
反调试技术


静态调试技术
1,PEB结构体信息可以判断当前进程是否处于反调试技术
#1,Beingdebugged(+0X2),破解之法,将PEB.BeingdeBugged值修改为0(FALSE)即可。
#2,Ldr(+OXC),破解之法,只要将0xFEEEFEEE值的区域全部覆写为NULL即可。
#3,ProcessHeap(+0x18),破解之法,只要将HEAP.Flags与HEAP.ForceFlags的值重新设置为2与0即可
#4,NtGlobalFlag(+0x68),破解之法,重设PEB.NtGlobalFlag的值为0即可
#5,NtQueryInformationProcess()API,破解之法ProcessInforamtionClass参数值分别修改为0,0,1.
#6,NtQuerySystemInformation(),破解之法,WinXp下编boot.ini文件,删除“/debugport=com1/baudre=115200/Debug”值。在Windows7系统的命令行窗口执行“bcdedit/debug off”命令即可。
#7,NtQueryObject(),破解之法,ntdll.ZwQueryObject()API,查看栈,第二个参数的值为ObjectAllTypesInformation(3),将该值修改为0。
#ZwSetInformationThread(),破解之法,查找存储在栈中的第二个参数ThreadInformationClass值,若其值为ThreadHideFromDebugger(0x11),则修改为0.
#8,ETC,破解之法,使用NULL覆盖WindowsClass名称字符串缓冲区。将GetDesktopWindows()与GetWindows()API的返回值修改为NULL值或FindWindows()API与GetWindows()API


动态调试技术


1,SEH,
#1,SEH的异常处理,破解之法,用OD设置忽略被调试进程中发生的异常。
#2,SEH未处理或注册的SEH根本不存在,此时会调用执行系统的kernel32!UnhandledExceptionFilter()API,(kernel32!UnhandledExceptionFilter()API内部调用了ntdll!NtQueryInformationProcessAPI,以判断是否正在调试进程。若进程正常运行(非调试运行),则运行系统最后的异常处理器;若进程处于调试中,则将异常派送给调试器)破解之法,通过kernel32!SetUnhandledExceptionFilter()可以修改系统最后的异常处理器(TopLevelExceptionFilter)


2,ThmingCheck,破解之法,直接操作获取的时间信息或比较时间的语句即可。
#1,RDTSC,是一条汇编指令,用来将TSC值读入EDX:EAX寄存器(TSC为64位,其高32位保存至EDX寄存器,低32位被保存至EAX寄存器),两次调用RDTSC之间有一定的时间间隔。通过计算时间间隔来判断进程是否处于反调试状态。
破解之法,##1,不用跟踪指令,直接使用RUN越过相关代码。##2,操作第二个RDTSC的结果值(EDX:EAX),使之与第一个结果值相同,从而顺利通过CMP语句。
##3,操作条件分支指令(CMP/Jcc),将CF与ZF之一的值修改为1,JA指令即失效。
##4,利用内核模式驱动程序使RDTSC指令失效。
3,陷阱标志,指EFLAGS寄存器的第九个(Index8)比特位
4,OxCC,断点对应的X86指令为0xCC ,若能检测到该指令,即可判断是否处于调试状态。
#1,比较特定代码区域的校验和值


高级反调试技术
1,垃圾代码
2,扰乱代码对齐
0 0
原创粉丝点击