原来的程序一遇到0字节的文件就会挂掉,在这里我添加了SEH错误处理代码,完美解决了挂掉的问题!
.
386
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
.data ?
hFile dd ?
hMapFile dd ?
lpFile dd ?
. const
szErr db " 不是有效的32位程序! " , 0
szOK db " 是可执行文件! " , 0
szNO db " 打开文件失败! " , 0
szName db " d: .exe " , 0
Copyright db " www.xbin.cn " , 0
.code
_SEH proc _lpExceptionRecord,_lpSEH,_lpContext,_lpDispatcherContext
pushad
mov esi,_lpExceptionRecord
mov edi,_lpContext
assume esi:ptr EXCEPTION_RECORD,edi:ptr CONTEXT
mov eax,_lpSEH
push [eax + 0ch]
pop [edi].regEbp
push [eax + 8 ]
pop [edi].regEip
push eax
pop [edi].regEsp
assume esi:nothing,edi:nothing
popad
mov eax,ExceptionContinueExecution
ret
_SEH endp
Start:
;设置SEH
assume fs:nothing
push offset _ErrFormat
push offset _SEH
push fs:[ 0 ]
mov fs:[ 0 ],esp
;打开文件
invoke CreateFile,offset szName,GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
. if eax == INVALID_HANDLE_VALUE
invoke MessageBox,NULL,offset szNO,NULL,MB_OK
JMP _END
.endif
mov hFile,eax
;建立映射文件
invoke CreateFileMapping,hFile,NULL,PAGE_READONLY, 0 , 0 ,NULL
mov hMapFile,eax
invoke MapViewOfFile,hMapFile,FILE_MAP_READ, 0 , 0 , 0
mov lpFile,eax
;把映射文件的首地址给ESI
mov esi,eax
assume esi:ptr IMAGE_DOS_HEADER
;判断MZ标志
mov di,[esi].e_magic
mov bx,5a4dh
. if di != bx
invoke MessageBox,NULL,offset szErr,NULL,MB_OK
JMP _END
.endif
;判断PE标志
add esi,[esi].e_lfanew
assume esi:ptr IMAGE_NT_HEADERS
mov edi,[esi].Signature
. if edi != 00004550h
invoke MessageBox,NULL,offset szErr,NULL,MB_OK
JMP _END
.endif
invoke MessageBox,NULL,offset szOK,NULL,MB_OK
assume esi:nothing
JMP _END
_ErrFormat:
invoke MessageBox,NULL,offset szErr,NULL,MB_OK
pop fs:[ 0 ]
add esp,0ch
_END:
invoke UnmapViewOfFile,lpFile
invoke CloseHandle,hMapFile
invoke CloseHandle,hFile
invoke ExitProcess, 0
end Start
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
.data ?
hFile dd ?
hMapFile dd ?
lpFile dd ?
. const
szErr db " 不是有效的32位程序! " , 0
szOK db " 是可执行文件! " , 0
szNO db " 打开文件失败! " , 0
szName db " d: .exe " , 0
Copyright db " www.xbin.cn " , 0
.code
_SEH proc _lpExceptionRecord,_lpSEH,_lpContext,_lpDispatcherContext
pushad
mov esi,_lpExceptionRecord
mov edi,_lpContext
assume esi:ptr EXCEPTION_RECORD,edi:ptr CONTEXT
mov eax,_lpSEH
push [eax + 0ch]
pop [edi].regEbp
push [eax + 8 ]
pop [edi].regEip
push eax
pop [edi].regEsp
assume esi:nothing,edi:nothing
popad
mov eax,ExceptionContinueExecution
ret
_SEH endp
Start:
;设置SEH
assume fs:nothing
push offset _ErrFormat
push offset _SEH
push fs:[ 0 ]
mov fs:[ 0 ],esp
;打开文件
invoke CreateFile,offset szName,GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
. if eax == INVALID_HANDLE_VALUE
invoke MessageBox,NULL,offset szNO,NULL,MB_OK
JMP _END
.endif
mov hFile,eax
;建立映射文件
invoke CreateFileMapping,hFile,NULL,PAGE_READONLY, 0 , 0 ,NULL
mov hMapFile,eax
invoke MapViewOfFile,hMapFile,FILE_MAP_READ, 0 , 0 , 0
mov lpFile,eax
;把映射文件的首地址给ESI
mov esi,eax
assume esi:ptr IMAGE_DOS_HEADER
;判断MZ标志
mov di,[esi].e_magic
mov bx,5a4dh
. if di != bx
invoke MessageBox,NULL,offset szErr,NULL,MB_OK
JMP _END
.endif
;判断PE标志
add esi,[esi].e_lfanew
assume esi:ptr IMAGE_NT_HEADERS
mov edi,[esi].Signature
. if edi != 00004550h
invoke MessageBox,NULL,offset szErr,NULL,MB_OK
JMP _END
.endif
invoke MessageBox,NULL,offset szOK,NULL,MB_OK
assume esi:nothing
JMP _END
_ErrFormat:
invoke MessageBox,NULL,offset szErr,NULL,MB_OK
pop fs:[ 0 ]
add esp,0ch
_END:
invoke UnmapViewOfFile,lpFile
invoke CloseHandle,hMapFile
invoke CloseHandle,hFile
invoke ExitProcess, 0
end Start