利用SEH进行反跟踪;我这里不想对 SEH 进行扫盲
;当一个程序被调试时,遇到了int 3,那么调试器会中断。
;当一个程序正常执行时,遇到了int 3,就产生了异常。系统会报错。如果我们设置了SEH,那么系统就
;暂时不会报错,然后把处理权交给 SEH。我们在里面做一些手脚,就可以判断软件是否被跟踪了。
;下面贴上我写的一个例程:
.386
.model flat, stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib
SEHProc proto :DWORD, :DWORD, :DWORD, :DWORD
.data
;常量定义
szDebug db "eRR, hMM, u'R dEbUggIng mE!!!!",0
szTest db "Hearson利用SEH进行反跟踪 例程",0
szFine db "Good boy!",0
.code
start:
;建立 SEH 基本结构
assume fs:nothing
push offset SEHProc
push fs:[0]
mov fs:[0], esp
lea edx, szDebug ;先把 EDX 赋上值,然后在SEH子程序中再赋一次值
int 3 ;产生中断异常
pop fs:[0] ;清除 SEH 链表
invoke MessageBox, NULL, edx, addr szTest, MB_OK or MB_ICONINFORMATION
invoke ExitProcess, NULL
SEHProc proc lpExcept: DWORD, lpFrame: DWORD, lpContext: DWORD, lpDispatch: DWORD
mov eax, lpContext ;为了下面更改EDX和EIP的值
assume eax:ptr CONTEXT
lea edx, szFine
mov [eax].regEdx, edx ;我们为源程序中的EDX再赋一次值
inc [eax].regEip ;让EIP指向下一条命令,否则会进入死循环
assume eax:nothing
mov eax, 0 ;告诉系统处理完了,继续执行程序。
ret
SEHProc endp
end start
;如果还有什么不懂,请给我来信:hearson@
关于:
mov [eax].regEdx, edx ;我们为源程序中的EDX再赋一次值
inc [eax].regEip ;让EIP指向下一条命令,否则会进入死循环
assume eax:nothing
mov eax, 0 ;告诉系统处理完了,继续执行程序。
汇编中的结构原来这么写呀!
CONTEXT STRUCT ; _
ContextFlags DWORD ? ; |--------------- +00
iDr0 DWORD ? ; | +04
iDr1 DWORD ? ; | +08
iDr2 DWORD ? ; >调试寄存器 +0C
iDr3 DWORD ? ; | +10
iDr6 DWORD ? ; | +14
iDr7 DWORD ? ; _| +18
FloatSave FLOATING_SAVE_AREA <> ;浮点寄存器区 +1C~~+88
regGs DWORD ? ;--| +8C
regFs DWORD ? ; |/段寄存器 +90
regEs DWORD ? ; |/ +94
regDs DWORD ? ;--| +98
regEdi DWORD ? ;____________ +9C
regEsi DWORD ? ; | 通用 +A0
regEbx DWORD ? ; | 寄 +A4
regEdx DWORD ? ; | 存 +A8
regEcx DWORD ? ; | 器 +AC
regEax DWORD ? ;_______|___组_ +B0
regEbp DWORD ? ;++++++++++++++++ +B4
regEip DWORD ? ; |控制 +B8
regCs DWORD ? ; |寄存 +BC
regFlag DWORD ? ; |器组 +C0
regEsp DWORD ? ; | +C4
regSs DWORD ? ;+++++++++++++++++ +C8
ExtendedRegisters db MAXIMUM_SUPPORTED_EXTENSION dup(?)
CONTEXT ENDS