原来的程序一遇到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