资源描述:
《Windows下常见的反调试方法.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、仁人教育Windows下常见的反调试方法稍稍总结一下在Crack或Rervese中比较常见的一些反调试方法,实现起来也比较简单,之后有写的Demo源码参考,没有太大的难度。 ①最简单也是最基础的,Windows提供的API接口:IsDebuggerPresent(),这API实际上就是访问PEB的BeingDebugged标志来判断是否处于调试状态。if(IsDebuggerPresent())//API接口{AfxMessageBox(L"检测到调试器");}else{AfxMessageBox(L"没有检测到调试器");}②自己用汇编实现实现IsDebuggerPresent,如何
2、获得PEB呢?在应用层,fs寄存器是指向当前线程的TEB结构的,而在内核层,fs寄存器指向PCR(ProcessorControlRegion)的内存,其数据类型是KPCR。所以可以通过当前线程的TEB获得PEB,再取出BeingDebugged的值。moveax,fs:18h//TEBSelf指针moveax,[eax+30h]//PEBmovzxeax,[eax+2]//PEB->BeingDebugged_asm{pusheax;//TEBmoveax,fs:[0x30];//PEBmovzxeax,byteptr[eax+2];//BeingDebuggedmovdwordpt
3、r[Value],eax;//取值popeax;}if(Value)//判断{AfxMessageBox(L"检测到调试器");}else仁人教育仁人教育{AfxMessageBox(L"没有检测到调试器");}讲个题外话,也是关于FS寄存器的前两天有人是问了我一个问题,说是怎么让dll只被特定的进程加载,了解fs寄存器之后就很简单了,在dll加载的DllMain()函数中对加载的当前进程进行判断,看是否是自己的目标进程,如果不是,就拒绝被加载。下面是一段测试代码,可以获得当前进程的进程名。#include"windows.h"//这段测试代码可以获得当前进程名#include"std
4、io.h"intmain(void){LPSTRname;__asm{moveax,fs:[0x18]//得到Teb当线程运行于用户空间时段寄存器FS指向当前线程的TEB,FS:[0x18]就是指在//Self,其内容就是TEB的起点moveax,[eax+0x30]//Teb偏移0x30处指向Pebmoveax,[eax+0xc]//Peb偏移0xc处指向进程加载的模块的信息_PEB_LDR_DATA结构moveax,[eax+0xc]moveax,[eax+0x30]movname,eax}wprintf(L"%s",name);return0;}③NtGlobalFlag也是
5、类似于BeingDebugged的一个标志,在Peb中取出。如果是调试状态下,NtGlobalFlag的值会是0x70,正常情况下不是。之前是利用fs寄存器获得的Peb基地址,这里使用NativeAPI的方法。HANDLEhProcess=NULL;DWORDProcessId=0;PROCESS_BASIC_INFORMATIONPbi;PFNZwQueryInformationProcesspfunc_ZwQueryInformationProcess=NULL;ProcessId=GetCurrentProcessId();hProcess=OpenProcess(仁人教育仁人教
6、育PROCESS_ALL_ACCESS,FALSE,ProcessId);if(hProcess!=NULL){HMODULEhModule=LoadLibrary(L"ntdll.dll");pfunc_ZwQueryInformationProcess=(PFNZwQueryInformationProcess)GetProcAddress(hModule,"ZwQueryInformationProcess");NTSTATUSStatus=pfunc_ZwQueryInformationProcess(hProcess,ProcessBasicInformation,&Pbi,
7、sizeof(PROCESS_BASIC_INFORMATION),NULL);if(NT_SUCCESS(Status)){DWORDByteRead=0;WORDNtGlobalFlag=0;boolbIsDebug=false;ULONGPebBase=(ULONG)Pbi.PebBaseAddress;if(ReadProcessMemory(hProcess,(LPCVOID)(PebBase+0x68),&NtGlobalFlag,