您的位置:首页 > 其它

判断是否为PE文件改进版

2016-06-07 22:30 260 查看
原来的程序一遇到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 " xbin1981",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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: