利用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@yeah.net 关于: 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