⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sehbpm.asm

📁 此为本书的配套光盘.本书结合实例
💻 ASM
字号:
;******************************************
;coded by ljtt
;******************************************
;演示检测BPM断点
;******************************************;---------------------------------------AntiBpm1.asm------------------------------------------------
COMMENT	$
	编译使用:
	\masm32\bin\ml /c /coff antibpx1.asm
	\masm32\bin\Link /SECTION:.text,ERW /SUBSYSTEM:WINDOWS antibpx1.obj
$

.586P
.MODEL FLAT,STDCALL
OPTION CASEMAP:NONE

include		e:\masm32\include\windows.inc
include		e:\masm32\include\kernel32.inc
include		e:\masm32\include\user32.inc
include		e:\masm32\include\comctl32.inc
include		e:\masm32\macros\macros.asm
include		e:\masm32\m32lib\masm32.inc

includelib	e:\masm32\lib\kernel32.lib
includelib	e:\masm32\lib\user32.lib
includelib	e:\masm32\lib\comctl32.lib
includelib	e:\masm32\m32lib\masm32.lib

.RADIX 16

.DATA
szDebugMsg			db	0Dh,0Ah
					db	'你可以通过在程序内部设置BPM断点来进行测试。'
					db	0Dh,0Ah,0
szNoFoundTracerMsg	db	'我没有发现被跟踪...:)',0
szFoundTracerMsg	db	'我发现你了!....你在跟踪我....哈哈...',0
szTitle				db	'样例:利用SEH技术进行反跟踪',0

dwCount				dd	4

.CODE
			assume	fs:nothing
Main:
			; 建立异常处理机制:结构化异常处理
			push	xMyHandler
			push	fs:[0]
			mov		fs:[0],esp

			invoke	MessageBoxA,NULL,addr szDebugMsg,addr szTitle,MB_OK

			; 故意产生一个异常
			int		3
			nop

			mov		eax,12345678h
			mov		ebx,87654321h
			mov		ecx,13572468h
			mov		edx,24681357h

			; 在异常处理函数中将对地址 except1 - except4 设置四个断点
			; 单步通过以下指令或者设置BPM断点,都将会被发现
except1:	sub		ecx,eax
except2:	add		eax,ecx
except3:	add		edx,ebx
except4:	sub		eax,edx
			
			; 正常情况下这里将产生一个除零异常
			xor		edx,edx
			div		[dwCount]
			xor		eax,eax

			; 如果执行到这里将显示发现跟踪者信息
			invoke	MessageBoxA,NULL,addr szFoundTracerMsg,addr szTitle,MB_OK
gm0_exit:
			pop		fs:[0]
			add		esp,4
			invoke	ExitProcess,0

			; 没有设置BPM断点时,则由异常处理函数改变执行到这里
found_tracer:
			invoke	MessageBoxA,NULL,addr szNoFoundTracerMsg,addr szTitle,MB_OK
			jmp		gm0_exit

xMyHandler	proc	C uses ebx esi edi pExcept:DWORD,pFrame:DWORD,pContext:DWORD,pDispatch:DWORD
			mov		esi,pExcept
			assume	esi:ptr EXCEPTION_RECORD
			mov		edi,pContext
			assume	edi:ptr CONTEXT


			; 如果发生严重错误,则不进行处理直接返回,从而转向下一级异常处理程序
			test	[esi].ExceptionFlags,1
			jnz		lm0_continue_search

			; 对"软断点异常"进行处理
			cmp		[esi].ExceptionCode,EXCEPTION_BREAKPOINT
			jz		lm0_start_set_bp

			; 对"单步异常"进行处理
			cmp		[esi].ExceptionCode,EXCEPTION_SINGLE_STEP
			jz		lm0_bp_count

			; 对"除零异常"进行处理
			cmp		[esi].ExceptionCode,EXCEPTION_INT_DIVIDE_BY_ZERO
			jz		lm0_modify_eip

			; 其他情况,都直接返回,转向下一级异常处理程序
lm0_continue_search:
lm0_unwind:	mov		eax,ExceptionContinueSearch
			jmp		lm0_ret

			; 对except1 - except4四个地址设置断点
lm0_start_set_bp:
                        inc             [edi].regEip 
			mov		[edi].iDr0,except4
			mov		[edi].iDr1,except3
			mov		[edi].iDr2,except2
			mov		[edi].iDr3,except1
			and		[edi].iDr6,0FFFF0FF0h
			mov		[edi].iDr7,0155h
			mov		[edi].ContextFlags,CONTEXT_FULL OR CONTEXT_DEBUG_REGISTERS
			jmp		lm0_continue_exec

			; 计数值减一,由于利用调试寄存器设置的指令执行断点是故障异常,因此需要修改线程上下文的EIP
lm0_bp_count:
			dec		[dwCount]
			add		[edi].regEip,2		; 由于 mod reg,reg 指令长度为2,因此这样修改EIP指向下一条指令。
			mov		[edi].ContextFlags,CONTEXT_FULL OR CONTEXT_DEBUG_REGISTERS
			jmp		lm0_continue_exec

			; 当发生除零异常时,修改线程的上下文中的EIP
lm0_modify_eip:
			mov		[edi].regEip,found_tracer
			xor		eax,eax
			mov		[edi].iDr0,eax
			and		[edi].iDr1,eax
			and		[edi].iDr2,eax
			and		[edi].iDr3,eax
			and		[edi].iDr6,0FFFF0FF0h
			and		[edi].iDr7,eax
			mov		[edi].ContextFlags,CONTEXT_FULL OR CONTEXT_DEBUG_REGISTERS
lm0_continue_exec:
			mov		eax,ExceptionContinueExecution
lm0_ret:	ret

xMyHandler	endp

end Main

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -