📄 sehbpm.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 + -