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

 

FinalExit: 
             .if ValidPE==TRUE 
                 invoke MessageBox, 0, addr FileValidPE, addr AppName, MB_OK+MB_ICONINFORMATION 
             .else 
                invoke MessageBox, 0, addr FileInValidPE, addr AppName, MB_OK+MB_ICONINFORMATION 
             .endif 
             push seh.PrevLink 
             pop fs:[0] 
             invoke UnmapViewOfFile, pMapping 
          .else 
             invoke MessageBox, 0, addr FileMappingError, addr AppName, MB_OK+MB_ICONERROR 
          .endif 
          invoke CloseHandle,hMapping 
       .else 
          invoke MessageBox, 0, addr FileOpenMappingError, addr AppName, MB_OK+MB_ICONERROR 
       .endif 
       invoke CloseHandle, hFile 
    .else 
       invoke MessageBox, 0, addr FileOpenError, addr AppName, MB_OK+MB_ICONERROR 
    .endif 
.endif 
invoke ExitProcess, 0 
start endp 

SEHHandler proc uses edx pExcept:DWORD, pFrame:DWORD, pContext:DWORD, pDispatch:DWORD 
    mov edx,pFrame 
    assume edx:ptr SEH 
    mov eax,pContext 
    assume eax:ptr CONTEXT 
    push [edx].SafeOffset 
    pop [eax].regEip 
    push [edx].PrevEsp 
    pop [eax].regEsp 
    push [edx].PrevEbp 
    pop [eax].regEbp 
    mov ValidPE, FALSE 
    mov eax,ExceptionContinueExecution 
    ret 
SEHHandler endp 
end start 

分析:
本例程打开一文件,先检验DOS header是否有效,有效就接着检验PE header的有效性,ok就认为是有效的PE文件了。这里,我们还运用了结构异常处理(SEH),这样就不必检查每个可能的错误: 如果有错误出现,就认为PE检测失效所致,于是给出我们的报错信息。其实Windows内部普遍使用SEH来检验参数传递的有效性。若对SEH感兴趣的话,可阅读Jeremy Gordon的 文章。

程序调用打开文件通用对话框,用户选定执行文件后,程序便打开文件并映射到内存。并在有效性检验前建立一 SEH:

   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 

一开始就假设寄存器 fs为空(assume fs:nothing)。 记住这一步不能省却,因为MASM假设fs寄存器为ERROR。接下来保存 Windows使用的旧SEH处理函数地址到我们自己定义的结构中,同时保存我们的SEH处理函数地址和异常处理时的执行恢复地址,这样一旦错误发生就能由异常处理函数安全地恢复执行了。同时还保存当前esp及ebp的值,以便我们的SEH处理函数将堆栈恢复到正常状态。

   mov edi, pMapping 
   assume edi:ptr IMAGE_DOS_HEADER 
   .if [edi].e_magic==IMAGE_DOS_SIGNATURE 

成功建立SEH后继续校验工作。置目标文件的首字节地址给edi,使其指向DOS header的首字节。为便于比较,我们告诉编译器可以假定edi正指向IMAGE_DOS_HEADER结构(事实亦是如此)。然后比较DOS header的首字是否等于字符串"MZ",这里利用了windows.inc中定义的IMAGE_DOS_SIGNATURE常量。若比较成功,继续转到PE header,否则设ValidPE 值为FALSE,意味着文件不是有效PE文件。

      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 

要定位到PE header,需要读取DOS header中的e_lfanew域值。该域含有PE header在文件中相对文件首部的偏移量。edi加上该值正好定位到PE header的首字节。这儿可能会出错,如果文件不是PE文件,e_lfanew值就不正确,加上该值作为指针就可能导致异常。若不用SEH,我们必须校验e_lfanew值是否超出文件尺寸,这不是一个好办法。如果一切OK,我们就比较PE header的首字是否是字符串"PE"。这里在此用到了常量IMAGE_NT_SIGNATURE,相等则认为是有效的PE文件。
如果e_lfanew的值不正确导致异常,我们的SEH处理函数就得到执行控制权,简单恢复堆栈指针和基栈指针后,就根据safeoffset的值恢复执行到FinalExit标签处。

FinalExit: 
   .if ValidPE==TRUE 
      invoke MessageBox, 0, addr FileValidPE, addr AppName, MB_OK+MB_ICONINFORMATION 
   .else 
      invoke MessageBox, 0, addr FileInValidPE, addr AppName, MB_OK+MB_ICONINFORMATION 
   .endif 

上述代码简单明确,根据ValidPE的值显示相应信息。

   push seh.PrevLink 
   pop fs:[0] 

一旦SEH不再使用,必须从SEH链上断开。

上一页  [1] [2] 

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