通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
文章搜索:
热门搜索:红客 黑鹰 红客技术 安全动画 红客培训
首页 文章 软件 动画 资源 励志 论坛 邮箱 会员 军事 科技 博客 爱心红客 最近更新 800g资源
 业内新闻 漏洞公告 病毒公告 电脑知识 网络知识 菜鸟入门 攻防教程 黑客攻防 安全编程 工具使用 综合安全 个人安全 安全相关 Q Q安全 原创精华 红客人物 站内事件
您现在的位置: 爱国者安全网 >> 文章类 >> 红客教程 >> 网络攻防 >> 文章正文
《加密解密 技术内幕》1.21 PE教程2: 检验PE文件的有效性
责任编辑:酷酷の鱼   更新日期:2008-3-10
 

理论:
如何才能校验指定文件是否为一有效PE文件呢? 这个问题很难回答,完全取决于想要的精准程度。您可以检验PE文件格式里的各个数据结构,或者仅校验一些关键数据结构。大多数情况下,没有必要校验文件里的每一个数据结构,只要一些关键数据结构有效,我们就认为是有效的PE文件了。下面我们就来实现前面的假设。

我们要验证的重要数据结构就是 PE header。从编程角度看,PE header 实际就是一个 IMAGE_NT_HEADERS 结构。定义如下:

IMAGE_NT_HEADERS STRUCT 
   Signature dd ? 
   FileHeader IMAGE_FILE_HEADER <> 
   OptionalHeader IMAGE_OPTIONAL_HEADER32 <> 
IMAGE_NT_HEADERS ENDS 

Signature 一dword类型,值为50h, 45h, 00h, 00h(PE\0\0)。 本域为PE标记,我们可以此识别给定文件是否为有效PE文件。
FileHeader 该结构域包含了关于PE文件物理分布的信息, 比如节数目、文件执行机器等。
OptionalHeader 该结构域包含了关于PE文件逻辑分布的信息,虽然域名有"可选"字样,但实际上本结构总是存在的。

我们目的很明确。如果IMAGE_NT_HEADERS的signature域值等于"PE\0\0",那么就是有效的PE文件。实际上,为了比较方便,Microsoft已定义了常量IMAGE_NT_SIGNATURE供我们使用。

IMAGE_DOS_SIGNATURE equ 5A4Dh 
IMAGE_OS2_SIGNATURE equ 454Eh 
IMAGE_OS2_SIGNATURE_LE equ 454Ch 
IMAGE_VXD_SIGNATURE equ 454Ch 
IMAGE_NT_SIGNATURE equ 4550h 

接下来的问题是: 如何定位 PE header? 答案很简单: DOS MZ header 已经包含了指向 PE header 的文件偏移量。DOS MZ header 又定义成结构 IMAGE_DOS_HEADER 。查询windows.inc,我们知道 IMAGE_DOS_HEADER 结构的e_lfanew成员就是指向 PE header 的文件偏移量。 

现在将所有步骤总结如下:

首先检验文件头部第一个字的值是否等于 IMAGE_DOS_SIGNATURE,是则 DOS MZ header 有效。 
一旦证明文件的 DOS header 有效后,就可用e_lfanew来定位 PE header 了。 
比较 PE header 的第一个字的值是否等于 IMAGE_NT_HEADER。如果前后两个值都匹配,那我们就认为该文件是一个有效的PE文件。 
Example:
.386 
.model flat,stdcall 
option casemap:none 
include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc 
include \masm32\include\comdlg32.inc 
include \masm32\include\user32.inc 
includelib \masm32\lib\user32.lib 
includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\comdlg32.lib 

SEH struct 
PrevLink dd ?    ; the address of the previous seh structure 
CurrentHandler dd ?    ; the address of the exception handler 
SafeOffset dd ?    ; The offset where it’s safe to continue execution 
PrevEsp dd ?      ; the old value in esp 
PrevEbp dd ?     ; The old value in ebp 
SEH ends

.data 
AppName db "PE tutorial no.2",0 
ofn OPENFILENAME <> 
FilterString db "Executable Files (*.exe, *.dll)",0,"*.exe;*.dll",0 
                 db "All Files",0,"*.*",0,0 
FileOpenError db "Cannot open the file for reading",0 
FileOpenMappingError db "Cannot open the file for memory mapping",0 
FileMappingError db "Cannot map the file into memory",0 
FileValidPE db "This file is a valid PE",0 
FileInValidPE db "This file is not a valid PE",0 

.data? 
buffer db 512 dup(?) 
hFile dd ? 
hMapping dd ? 
pMapping dd ? 
ValidPE dd ? 

.code 
start proc 
LOCAL seh:SEH 
mov ofn.lStructSize,SIZEOF ofn 
mov ofn.lpstrFilter, OFFSET FilterString 
mov ofn.lpstrFile, OFFSET buffer 
mov ofn.nMaxFile,512 
mov ofn.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY 
invoke GetOpenFileName, ADDR ofn 
.if eax==TRUE 
    invoke CreateFile, addr buffer, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL 
    .if eax!=INVALID_HANDLE_VALUE 
       mov hFile, eax 
       invoke CreateFileMapping, hFile, NULL, PAGE_READONLY,0,0,0 
       .if eax!=NULL 
          mov hMapping, eax 
          invoke MapViewOfFile,hMapping,FILE_MAP_READ,0,0,0 
          .if eax!=NULL 
             mov pMapping,eax 
             assume fs:nothing 
             push fs:[0] 
             pop seh.PrevLink 
             mov seh.CurrentHandler,offset SEHHandler 
             mov seh.SafeOffset,offset FinalExit 
             lea eax,seh 
             mov fs:[0], eax 
             mov seh.PrevEsp,esp 
             mov seh.PrevEbp,ebp 
             mov edi, pMapping 
             assume edi:ptr IMAGE_DOS_HEADER 
             .if [edi].e_magic==IMAGE_DOS_SIGNATURE 
                add edi, [edi].e_lfanew 
                assume edi:ptr IMAGE_NT_HEADERS 
                .if [edi].Signature==IMAGE_NT_SIGNATURE 
                   mov ValidPE, TRUE 
                .else 
                   mov ValidPE, FALSE 
                .endif 
             .else 
                 mov ValidPE,FALSE 
             .endif 

[1] [2] 下一页

  • 上一篇文章:
  • 下一篇文章:
  • 最近更新
    普通文章 瑞星公司03月09日发布 每日计算机病毒及木马播报
    推荐文章 推荐:在网络安全中起重大作用的 Windows 命令
    普通文章 瑞星公司03月08日发布 每日计算机病毒及木马播报
    普通文章 传说中的TXT溢出
    普通文章 火线可骗过Windows 密码验证
    普通文章 台式机技术的ATM易遭黑客入侵
    普通文章 趋势:2007年病毒威胁报告暨2008年预测
    普通文章 微软展示IE 8浏览器 首个beta测试版开放下载
    普通文章 网络病毒向驱动级演变 防毒入侵成重点
    普通文章 近期上网严防“寄生虫”病毒破坏系统
    热门文章
    普通文章瑞星公司03月01日发布 每日计算机病毒及木马播报
    普通文章微软Hotmail故障未解决 用户转用谷歌
    普通文章关注未成年人 欧盟5500万营造安全网络环境
    普通文章德国司法部门在线搜查须获法官许可
    普通文章Safari不在贝宝(paypal)安全浏览器列表中
    普通文章“艳照门”图片长沙再拘人
    普通文章手机版火狐浏览器年内推出 暂瞄准视窗和Linux
    普通文章美国白领社交网站LinkedIn昨晚瘫痪一个小时
    普通文章黑客行为调查:四成以上黑客在研究“免杀”病毒
    普通文章AJAX应用程序容易遭受到新型攻击
    精彩专题