根据Spring.W在下贴中的提示
http://bbs.pediy.com/showthread.php?s=&threadid=17132
我用RadASM写了个dll加入了异常处理,只要在你的源程序中加入
include system.inc
includelib system.lib
然后将system.dll放在你程序目录下,编译好你的程序用OD载入,发生异常时OD不能处理这个异常,而DLL中异常处理程序得不到处理权,程序会退出。如果不用OD调试,DLL中的异常处理程序处理异常好,程序能继续运行,各位大侠根据这个原理加入自己的代码来反调试
;***********************system.asm*******************************
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
seh PROTO ;异常处理过程
TestFunc PROTO
.data
app db 'SEH in DLL',0
msg1 db 'DLL_PROCESS_ATTACH',0
msg2 db 'DLL_PROCESS_DETACH',0
msg3 db 'DLL_THREAD_ATTACH',0
msg4 db 'DLL_THREAD_DETACH',0
msg5 db 'DLL_TESTFUNC',0
msg6 db 'DLL_EXCEPTION_PROC',0
num dd 0
flag dd 3
.code
;***********************DLL入口过程*******************************
DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
mov eax,reason
.if eax == DLL_PROCESS_ATTACH
push offset seh
call SetUnhandledExceptionFilter
mov eax,200h
cdq
fine:
div num
invoke MessageBox,NULL,addr msg1,addr app,MB_OK
.elseif eax == DLL_PROCESS_DETACH
invoke MessageBox,NULL,addr msg2,addr app,MB_OK
xor eax,eax
ret
.elseif eax == DLL_THREAD_ATTACH
invoke MessageBox,NULL,addr msg3,addr app,MB_OK
.elseif eax == DLL_THREAD_DETACH
invoke MessageBox,NULL,addr msg4,addr app,MB_OK
xor eax,eax
ret
.endif
mov eax,TRUE
ret
DllEntry Endp
;*************************导出函数*******************************
TestFunc proc para:DWORD
invoke MessageBox,NULL,addr msg5,addr app,MB_OK
ret 4
TestFunc endp
;***********************异常处理过程*******************************
seh proc
.if flag
mov num,1
dec flag
invoke MessageBox,NULL,addr msg6,addr app,MB_OK
mov eax,-1
ret
.else
xor eax,eax
ret
.endif
seh endp
;*******************************************************************
End DllEntry
;***********************system.def*******************************
LIBRARY SYSTEM
EXPORTS TestFunc
;***********************system.inc*******************************
TestFunc PROTO
附件:system.rar
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)