Windows 下常见的反调试方法Word格式文档下载.docx

上传人:b****6 文档编号:21743290 上传时间:2023-02-01 格式:DOCX 页数:25 大小:22.77KB
下载 相关 举报
Windows 下常见的反调试方法Word格式文档下载.docx_第1页
第1页 / 共25页
Windows 下常见的反调试方法Word格式文档下载.docx_第2页
第2页 / 共25页
Windows 下常见的反调试方法Word格式文档下载.docx_第3页
第3页 / 共25页
Windows 下常见的反调试方法Word格式文档下载.docx_第4页
第4页 / 共25页
Windows 下常见的反调试方法Word格式文档下载.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

Windows 下常见的反调试方法Word格式文档下载.docx

《Windows 下常见的反调试方法Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Windows 下常见的反调试方法Word格式文档下载.docx(25页珍藏版)》请在冰豆网上搜索。

Windows 下常见的反调试方法Word格式文档下载.docx

movdwordptr[Value],eax;

//取值

popeax;

if(Value)//判断

讲个题外话,也是关于FS寄存器的前两天有人是问了我一个问题,说是怎么让dll只被特定的进程加载,了解fs寄存器之后就很简单了,在dll加载的DllMain()函数中对加载的当前进程进行判断,看是否是自己的目标进程,如果不是,就拒绝被加载。

下面是一段测试代码,可以获得当前进程的进程名。

#include"

windows.h"

//这段测试代码可以获得当前进程名

stdio.h"

intmain(void)

LPSTRname;

__asm{

moveax,fs:

[0x18]//得到Teb当线程运行于用户空间时段寄存器FS指向当前线程的TEB,FS:

[0x18]就是指在//Self,其内容就是TEB的起点

moveax,[eax+0x30]//Teb偏移0x30处指向Peb

moveax,[eax+0xc]//Peb偏移0xc处指向进程加载的模块的信息_PEB_LDR_DATA结构

moveax,[eax+0xc]

moveax,[eax+0x30]

movname,eax

}

wprintf(L"

%s\n"

name);

return0;

③NtGlobalFlag也是类似于BeingDebugged的一个标志,在Peb中取出。

如果是调试状态下,

NtGlobalFlag的值会是0x70,正常情况下不是。

之前是利用fs寄存器获得的Peb基地址,这里使用NativeAPI的方法。

HANDLEhProcess=NULL;

DWORDProcessId=0;

PROCESS_BASIC_INFORMATIONPbi;

PFNZwQueryInformationProcesspfunc_ZwQueryInformationProcess=NULL;

ProcessId=GetCurrentProcessId();

hProcess=OpenProcess(

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,

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,2,&

ByteRead)&

&

ByteRead==2)

//PEB.NtGlobalFlag

//+0x068NtGlobalFlag:

Uint4B

if(NtGlobalFlag==0x70)//判断是否处于调试状态

bIsDebug=true;

if(bIsDebug)

else

CloseHandle(hProcess);

④PEB.ProcessHeap.Flags和ForceFlags

进程堆标志,系统创建进程时会将Flags置为0x02(HEAP_GROWABLE),将ForceFlags置为0。

但是进程被调试时,这两个标志通常被设置为0x50000062h和0x40000060h。

下面是检测代码

HANDLEhProcess=NULL;

DWORDProcessId=0;

PROCESS_BASIC_INFORMATIONPbi;

PFNZwQueryInformationProcesspfunc_pZwQueryInformationProcess=NULL;

ULONGFlags=0;

ULONGForceFlags=0;

switch(g_WinVersion)

caseWINDOWS_VERSION_XP:

Flags=0xC;

ForceFlags=0x10;

break;

caseWINDOWS_VERSION_2K3_SP1_SP2:

caseWINDOWS_VERSION_7:

Flags=0x40;

ForceFlags=0x44;

ProcessId=GetCurrentProcessId();

hProcess=OpenProcess(

if(hProcess!

pfunc_pZwQueryInformationProcess=(PFNZwQueryInformationProcess)GetProcAddress(hModule,"

NTSTATUSStatus=pfunc_pZwQueryInformationProcess(

ULONGProcessHeap=0;

DWORDHeapFlags=0;

DWORDForceFlagsValue=1;

if(ReadProcessMemory(hProcess,(LPCVOID)(PebBase+0x18),&

ProcessHeap,4,&

ByteRead))

if(ReadProcessMemory(hProcess,(LPCVOID)(ProcessHeap+Flags),&

HeapFlags,4,&

//PEB.ProcessHeap.Flags

//nt!

_PEB

//+0x018ProcessHeap:

Ptr32Void_HEAP

_HEAP

//WIN7ProcessHeap还有一个Heap

//+0x018Heap:

Ptr32_HEAP

//WIN7

//+0x040Flags:

//+0x044ForceFlags:

//WIN2K3

//+0x00CFlags:

//+0x010ForceFlags:

//WINXP

if(HeapFlags!

=2)//系统创建进程时会将其设置为HEAP_GROEABLE(0x2)

ReadProcessMemory(hProcess,(LPCVOID)(PebBase+ForceFlags),&

ForceFlagsValue,4,&

ByteRead);

if(ForceFlagsValue!

=0)

⑤检测父进程

一般双击运行的进程的父进程都是explorer.exe,但是如果进程被调试,父进程则是调试器进程,也就是说如果父进程不是explorer.exe,就可以认为有调试器存在。

DWORDExplorerId=0;

PROCESSENTRY32pe32={0};

CStringstr;

BOOLbIsDebug=FALSE;

DWORDProcessId=GetCurrentProcessId();

//获取Explorer进程ID

:

:

GetWindowThreadProcessId(:

FindWindow(L"

Progman"

NULL),&

ExplorerId);

HANDLEhProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);

if(hProcessSnap!

=INVALID_HANDLE_VALUE)

pe32.dwSize=sizeof(PROCESSENTRY32);

if(Process32First(hProcessSnap,&

pe32))

do

if(ProcessId==pe32.th32ProcessID)

str.Format(L"

进程ID:

%d父进程ID:

%dExplorer进程ID:

%d"

ProcessId,pe32.th32ParentProcessID,ExplorerId);

if(pe32.th32ParentProcessID!

=ExplorerId)

bIsDebug=TRUE;

while(Process32Next(hProcessSnap,&

pe32));

AfxMessageBox(str);

CloseHandle(hProcessSnap);

⑥SeDebugPrivilege权限判断

默认情况下进程是没有SeDebugPrivilege权限的,但是当进程通过OD或者xdbg等调试器启动时,由于调试器本身启动了SeDebugPrivilege权限,当调试进程被加载时SeDebugPrivilege也就被继承了。

所以我们可以检测进程的SeDebugPrivilege权限来间接判断是否存在调试器,而对SeDebugPrivilege权限的判断可以用能否打开csrss.exe进程来判断

PROCESSENTRY32Pe32={0};

HANDLEhProcessSnap=:

CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

if(hProcessSnap==INVALID_HANDLE_VALUE)

return;

Pe32.dwSize=sizeof(PROCESSENTRY32);

Pe32))

if(_wcsicmp(L"

csrss.exe"

Pe32.szExeFile)==0)

HANDLEhProcess=OpenProcess(

Pe32.th32ProcessID

if(hProcess)

Pe32));

CloseHandle(hProcessSnap);

⑦检测硬件断点,其实也不能算是完完全全对调试器的检测,只能说是检测硬件断点,通过设置SHE处理例程,然后自己手动触发异常来检测硬件断点。

#pragmadata_seg("

.Hardware"

BOOLHardwarei=FALSE;

DWORDaddr=0;

#pragmadata_seg()

#pragmacomment(linker,"

/section:

.Hardware,RWS"

LONGWINAPIHardwareExceptionFilter(

PEXCEPTION_POINTERSExceptionInfo

if(ExceptionInfo->

ContextRecord->

Dr0!

=0

||ExceptionInfo->

Dr1!

Dr2!

Dr3!

Hardwarei=TRUE;

ExceptionInfo->

Dr0=0;

Dr1=0;

Dr2=0;

Dr3=0;

//设置新的eip让程序调转到safe执行

Eip=addr;

returnEXCEPTION_CONTINUE_EXECUTION;

BOOLIsHardware()

LPTOP_LEVEL_EXCEPTION_FILTERlpsetun;

lpsetun=:

SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)HardwareExceptionFilter);

_asm

movaddr,offsetsafe;

int3;

safe:

SetUnhandledExceptionFilter(lpsetun);

returnHardwarei;

voidCAntiDebugDlg:

OnBnClickedButton12()

char*p="

aaaaaaaaaaaaaaddddddddddddddbbbbbbbbbbbb"

;

if(IsHardware())

检测到硬件执行断点"

没有检测到硬件执行断点"

⑧上面是通过SHE来检测硬件断点,当然还可以通过VEH来检测,思路是一样的,差别就是SHE与VEH,一个是针对线程的,一个是针对进程的。

/************************************************************************/

/*硬件执行断点,VEH*/

.VehHardware"

BOOLVehHardwarei=FALSE;

DWORDVehaddr;

.VehHardware,RWS"

LONGNTAPIVehHardwareExceptionFilter(

VehHardwarei=TRUE;

Eip=Vehaddr;

BOOLIsVehHardware()

PVOIDVEHandle=:

AddVectoredExceptionHandler(1,VehHardwareExceptionFilter);

movVehaddr,offsetvehsafe;

vehsafe:

if(VEHandle!

RemoveVectoredExceptionHandler(VEHandle);

returnVehHardwarei;

OnBnClickedButton16()

//TODO:

在此添加控件通知处理程序代码

if(IsVehHardware())

⑨利用异常处理 

通过我们自己安装异常处理例程,然后手动触发异常,如果存在OD则不会走异常处理

/*异常处理判断是否存在OD*/

.excep"

BOOLExceptioni=FALSE;

.excep,RWS"

LONGWINAPIExceptionFilter(

Exceptioni=TRUE;

//进行异常处理,则不存在OD

BOOLIsException()

ULONGOldProtect=0;

SetUnhandl

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 院校资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1