首页
社区
课程
招聘
[求助]关于查找可执行文件,然后判断....
发表于: 2006-10-20 21:10 4651

[求助]关于查找可执行文件,然后判断....

2006-10-20 21:10
4651
   在dos下,文件头由IMAGE_DOS_HEADER结构定义,其中,可执行性文件在定义的IMAGE_DOS_HEADER STRUCT里的标志是 e_magic  WORD   ?  
   在windows下,文件头由IMAGE_NT_HEADERS结构定义,在IMAGE_NT_SIGNATURE中,标志是Signature WORD   ?  

参照这些,我写了一个判断是否为可执行文件的代码:

.386
.model flat, stdcall
option casemap :none
include                windows.inc
include                user32.inc
includelib             user32.lib
include                kernel32.inc
includelib             kernel32.lib
include                comdlg32.inc
includelib             comdlg32.lib
.data?
hWinMain        dd        ?
.data
szFileName db 256 dup(0)
szFilter        db        '选择你要打开的文件(*.*)',0,'*.*',0
szMyTitle db '选择你要打开的文件',0
szMessageTitle db '文件',0
szNoFoud db '你没有选择文件',0
szLong   db '发生错误',0
szCaption db '对不起,该文件并不是有效的可执行文件!',0
szYesPe db '可执行文件查找正确',0
szTitle db '查找正确',0
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_OpenFile        proc
                local        @stOF:OPENFILENAME
                local        @stES:EDITSTREAM

;********************************************************************
; 显示“打开文件”对话框
;********************************************************************
                invoke        RtlZeroMemory,addr @stOF,sizeof @stOF
                mov        @stOF.lStructSize,sizeof @stOF
                push        hWinMain
                pop        @stOF.hwndOwner
                mov        @stOF.lpstrFilter,offset szFilter
                mov        @stOF.lpstrFile,offset szFileName
                mov        @stOF.nMaxFile,MAX_PATH
                mov        @stOF.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST
                mov        @stOF.lpstrDefExt,offset szMessageTitle
                invoke        GetOpenFileName,addr @stOF
                ret

_OpenFile        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;这里判断是否为可执行文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_testPe proc
      local @lpMemory
     mov     esi,@lpMemory
    assume        esi:ptr IMAGE_DOS_HEADER
      .if        [esi].e_magic == IMAGE_DOS_SIGNATURE ;标志符合e_magic
    add        esi,[esi].e_lfanew
    assume        esi:ptr IMAGE_NT_HEADERS
  .if     [esi].Signature == IMAGE_NT_SIGNATURE ;标志符合Signature
invoke MessageBox,NULL,szYesPe,addr szTitle,MB_OK ;确定是可执行文件
.elseif
invoke MessageBox,NULL,szCaption,addr szLong,MB_OK
.endif
.endif
ret         
_testPe endp         
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
      call _OpenFile
      .if eax != NULL ;在对话框中选择了文件
      call _testPe ;开始判断
      .elseif    ;没有选择
      invoke MessageBox,NULL,addr szNoFoud,addr szNoFoud,MB_OK
      .endif
      invoke ExitProcess,NULL 
end start      

程序编译通过,但是打开对话框选择文件后就出现了如下提示:

test.exe 遇到问题需要关闭,我们对此引起的不便表示抱歉

另外我没有选择文件的时候,可以提示,说明在判断可执行文件这个地方出现错误,请朋友们支招...


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 214
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
LZ,首先你的_OpenFile出错了
GetOpenFileName实际上并没有打开文件,他只是把文件的路径存放在了szFileName里面.
你应该在调用了GetOpenFileName之后
再调用CreateFile来打开szFileName
然后可以调用CreateFileMapping,MapViewOfFile
再将MapViewOfFile返回的eax的值作为你_testPe的输入(也就是你函数中的@lpMemory),所以你要把你的@lpMemory设为全局变量或是把他提出来到主函数中去,都可以(你函数中的@lpMemory是个局部变量,而且也没有初始化,就直接给了ESI),当然也可以把这两个函数合并
给你发个例子吧~

IsExeFile proc _addrFileDir
LOCAL @hFile:dword
LOCAL @hMapFile:dword
LOCAL @lpMemory:dword
LOCAL @dwFileSize:dword
    push esi
    mov @hFile,0
    MOV EAX,0
    invoke CreateFile,_addrFileDir,GENERIC_READ+GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,\
                      FILE_ATTRIBUTE_NORMAL,NULL
    .if eax==INVALID_HANDLE_VALUE
        jmp OpenFileErr
    .endif
    mov @hFile,eax
    invoke GetFileSize,eax,NULL
    mov    @dwFileSize,eax
    invoke CreateFileMapping,@hFile,NULL,PAGE_READONLY,0,0,NULL
    .if eax
        mov @hMapFile,eax
        invoke MapViewOfFile,eax,FILE_MAP_READ,0,0,0
        .if eax
            mov @lpMemory,eax
            mov esi,@lpMemory
            assume esi:ptr IMAGE_DOS_HEADER
            cmp [esi].e_magic,IMAGE_DOS_SIGNATURE
            jnz NotPEFile
            add esi,[esi].e_lfanew
            assume esi:ptr IMAGE_NT_HEADERS
            cmp [esi].Signature,IMAGE_NT_SIGNATURE
            jnz NotPEFile
            add esi,16h
            test word ptr [esi],2000h
            jnz IsDllFile
         .else
             jmp OpenFileErr
         .endif
    .else
        jmp OpenFileErr
    .endif
    mov eax,1
    ret
OpenFileErr:
    invoke MessageBox,0,addr szOpenErr,0,0
    mov eax,0
    pop esi
    ret
NotPEFile:
    invoke MessageBox,0,addr szNotPE,0,0
    mov eax,0
    pop esi
    ret
IsDllFile:
    invoke MessageBox,0,addr szIsDll,0,0
    mov eax,0
    pop esi
    ret
IsExeFile endp
2006-10-20 23:09
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
3
HOHO~~~看了几天 终于明白了 ...

原来要创建内存映射,把读取的内存保存到@lpMemory,之后才对文件进行判断

明白!谢了.........

貌似还要创建一个 SEH异常处理....
2006-10-29 17:08
0
游客
登录 | 注册 方可回帖
返回
//