﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Tiany 's Blog-随笔分类-逆向破解</title><link>http://www.cppblog.com/tiany/category/19035.html</link><description>奋斗的路上肯定会遇到很多困难 该不该继续？</description><language>zh-cn</language><lastBuildDate>Thu, 12 Apr 2012 19:18:29 GMT</lastBuildDate><pubDate>Thu, 12 Apr 2012 19:18:29 GMT</pubDate><ttl>60</ttl><item><title>学破解 &lt;二&gt; PE格式之IMAGE_NT_HEADERS</title><link>http://www.cppblog.com/tiany/archive/2012/04/11/170918.html</link><dc:creator>Tiany</dc:creator><author>Tiany</author><pubDate>Wed, 11 Apr 2012 07:09:00 GMT</pubDate><guid>http://www.cppblog.com/tiany/archive/2012/04/11/170918.html</guid><wfw:comment>http://www.cppblog.com/tiany/comments/170918.html</wfw:comment><comments>http://www.cppblog.com/tiany/archive/2012/04/11/170918.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tiany/comments/commentRss/170918.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tiany/services/trackbacks/170918.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这个IMAGE_NT_HEADERS其实就是PE相关结构的映像头，NT据我揣测应该是New Technology的缩写，区分于DOS WIN9X的新技术，您老要是非觉得是NTR什么的也没关系。IMAGE_NT_HEADERS的结构是这个样子的Code highlighting produced by Actipro CodeHighlighter (freeware)http://www....&nbsp;&nbsp;<a href='http://www.cppblog.com/tiany/archive/2012/04/11/170918.html'>阅读全文</a><img src ="http://www.cppblog.com/tiany/aggbug/170918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tiany/" target="_blank">Tiany</a> 2012-04-11 15:09 <a href="http://www.cppblog.com/tiany/archive/2012/04/11/170918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学破解 &lt;一&gt; PE格式之MS-DOS MZ header </title><link>http://www.cppblog.com/tiany/archive/2012/04/08/170495.html</link><dc:creator>Tiany</dc:creator><author>Tiany</author><pubDate>Sun, 08 Apr 2012 14:24:00 GMT</pubDate><guid>http://www.cppblog.com/tiany/archive/2012/04/08/170495.html</guid><wfw:comment>http://www.cppblog.com/tiany/comments/170495.html</wfw:comment><comments>http://www.cppblog.com/tiany/archive/2012/04/08/170495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tiany/comments/commentRss/170495.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tiany/services/trackbacks/170495.html</trackback:ping><description><![CDATA[<p><span style="white-space: pre"></span>PE的意思就是这个 the Protable Executable (PE) file format 微软搞得那么一套东西，字面意思是可移植的，但是现实使用中没见他多么的可移植，PE格式借鉴了UNIX系统中的COFF (Common Object File Format) 格式。而且PE对MS-Dos的兼容，保留了MS-Dos头，在dos下打开会提示 &#8220;这是win32程序在dos下不能跑<span style="font-size: 13px">&#8221; 向下兼容，非常的友好。</span></p>
<p><span style="font-size: 13px">MS-DOS MZ header 的结构是这样的</span></p>
<p><span style="font-family: Simsun; font-size: 16px"></span></p>
<p style="display: inline !important"><span style="font-size: 13px"></span></p><span style="font-family: Simsun; font-size: 16px"></span>
<p style="padding-bottom: 2px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline !important; font-family: Simsun; font-size: 16px; padding-top: 2px"><span style="font-size: 13px"><span style="font-size: 13px">MS-DOS MZ header</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img id="Codehighlighter1_33_1310_Open_Image" onclick="this.style.display='none'; Codehighlighter1_33_1310_Open_Text.style.display='none'; Codehighlighter1_33_1310_Closed_Image.style.display='inline'; Codehighlighter1_33_1310_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_33_1310_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_33_1310_Closed_Text.style.display='none'; Codehighlighter1_33_1310_Open_Image.style.display='inline'; Codehighlighter1_33_1310_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"><span style="color: #000000">typedef&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;_IMAGE_DOS_HEADER&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_33_1310_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_33_1310_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;DOS&nbsp;.EXE&nbsp;header</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;e_magic;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Magic&nbsp;number</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;e_cblp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Bytes&nbsp;on&nbsp;last&nbsp;page&nbsp;of&nbsp;file</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;e_cp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Pages&nbsp;in&nbsp;file</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;e_crlc;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Relocations</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;e_cparhdr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Size&nbsp;of&nbsp;header&nbsp;in&nbsp;paragraphs</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;e_minalloc;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Minimum&nbsp;extra&nbsp;paragraphs&nbsp;needed</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;e_maxalloc;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Maximum&nbsp;extra&nbsp;paragraphs&nbsp;needed</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;e_ss;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Initial&nbsp;(relative)&nbsp;SS&nbsp;value</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;e_sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Initial&nbsp;SP&nbsp;value</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;e_csum;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Checksum</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;e_ip;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Initial&nbsp;IP&nbsp;value</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;e_cs;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Initial&nbsp;(relative)&nbsp;CS&nbsp;value</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;e_lfarlc;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;File&nbsp;address&nbsp;of&nbsp;relocation&nbsp;table</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;e_ovno;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Overlay&nbsp;number</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;e_res[</span><span style="color: #000000">4</span><span style="color: #000000">];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Reserved&nbsp;words</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;e_oemid;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;OEM&nbsp;identifier&nbsp;(for&nbsp;e_oeminfo)</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;e_oeminfo;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;OEM&nbsp;information;&nbsp;e_oemid&nbsp;specific</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;e_res2[</span><span style="color: #000000">10</span><span style="color: #000000">];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Reserved&nbsp;words</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LONG&nbsp;&nbsp;&nbsp;e_lfanew;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;File&nbsp;address&nbsp;of&nbsp;new&nbsp;exe&nbsp;header</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;IMAGE_DOS_HEADER,&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">PIMAGE_DOS_HEADER;</span></div>
<p style="padding-bottom: 2px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline !important; font-family: Simsun; font-size: 16px; padding-top: 2px"></span></span></p><br />
<p>其中比较关键的成员是这个 e_lfanew 它指向了PE文件头在PE文件中的相对虚拟地址RAV(Relative Virtual Addresses)，e_magic的值应该等于 0x5A4D 是MS-DOS MZ header的标志 MZ好像是个程序员名字的缩写 其他成员基本没啥大用，一些加壳软件会修改它的成员为自己的节腾出空间，或者在添加节形式感染时节表尾部的空隙不够写入一个新的解表结构的时候把IMAGE_DOS_HEADE 和 IMAGE_NT_HEADER 融合。</p>
<p>可以自己写一个小程序来输出一下IMAGE_DOS_HEADE</p>
<p>IMAGE_DOS_HEADE这个结构体定义在windows.h中</p>
<p>系统加载PE格式的文件时，会先加载IMAGE_DOS_HEADE这个结构体，再根据结构体里的e_lfanew提供的相对偏移找到PE文件头。</p>
<p><br /></p>
<p>用c语言可以直接读出IMAGE_DOS_HEADE这个结构体，下面开始写。</p>
<p>从文件的开始位置读取IMAGE_DOS_HEADE结构体<br /></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">fread(</span><span style="color: #000000">&amp;</span><span style="color: #000000">mydosheader,</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(mydosheader),</span><span style="color: #000000">1</span><span style="color: #000000">,p);</span></div><br />吧文件指针移动到e_lfanew所指的相对偏移，即PE文件头<br /><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">fseek(p,mydosheader.e_lfanew,SEEK_SET);</span></div><br /><br />读取PE文件标志，这个PE Signature是 PE\0\0 这样一个值，证明它是PE格式的身份。<br /><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">fread(</span><span style="color: #000000">&amp;</span><span style="color: #000000">sig,</span><span style="color: #000000">4</span><span style="color: #000000">,</span><span style="color: #000000">1</span><span style="color: #000000">,p);</span></div><br />这个判断中大写的变量都是，windows.h中的常数 
<p>&nbsp;</p>
<p>IMAGE_NT_SIGNATURE 的值是 PE\0\0</p>
<p>IMAGE_DOS_SIGN</p>
<p>ATURE 的值是 MZ</p>
<p>具体的定义可以自己去windows.h中看</p><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">　</span><span style="color: #0000ff">if</span><span style="color: #000000">((mydosheader.e_magic </span><span style="color: #000000">==</span><span style="color: #000000">IMAGE_DOS_SIGNATURE) </span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />　　　　　　　　(sig </span><span style="color: #000000">==</span><span style="color: #000000"> IMAGE_NT_SIGNATURE))<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />　　　　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">有效的PE文件/n</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />　　　　</span><span style="color: #0000ff">else</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />　　　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">无效的PE文件/n</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />　　　　</span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">;</span></div><br />下面是完整的程序<br /><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">#include </span><span style="color: #000000">"</span><span style="color: #000000">windows.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include </span><span style="color: #000000">"</span><span style="color: #000000">stdio.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000"> main(</span><span style="color: #0000ff">int</span><span style="color: #000000"> argc, </span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000"> argv[])<br /><img id="Codehighlighter1_74_1545_Open_Image" onclick="this.style.display='none'; Codehighlighter1_74_1545_Open_Text.style.display='none'; Codehighlighter1_74_1545_Closed_Image.style.display='inline'; Codehighlighter1_74_1545_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_74_1545_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_74_1545_Closed_Text.style.display='none'; Codehighlighter1_74_1545_Open_Image.style.display='inline'; Codehighlighter1_74_1545_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_74_1545_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_74_1545_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　FILE </span><span style="color: #000000">*</span><span style="color: #000000">p;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　IMAGE_DOS_HEADER mydosheader;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　unsigned </span><span style="color: #0000ff">long</span><span style="color: #000000"> sig;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　p </span><span style="color: #000000">=</span><span style="color: #000000"> fopen(</span><span style="color: #000000">"</span><span style="color: #000000">test1.exe</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">r+b</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　</span><span style="color: #0000ff">if</span><span style="color: #000000">(p </span><span style="color: #000000">==</span><span style="color: #000000"> NULL)</span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　fread(</span><span style="color: #000000">&amp;</span><span style="color: #000000">mydosheader,</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(mydosheader),</span><span style="color: #000000">1</span><span style="color: #000000">,p);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　fseek(p,mydosheader.e_lfanew,SEEK_SET);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　fread(</span><span style="color: #000000">&amp;</span><span style="color: #000000">sig,</span><span style="color: #000000">4</span><span style="color: #000000">,</span><span style="color: #000000">1</span><span style="color: #000000">,p);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　fclose(p);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">IMAGE_DOS_HEADER dump:/n</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">e_magic　 : %04x/n</span><span style="color: #000000">"</span><span style="color: #000000">,mydosheader.e_magic);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">e_cblp　　: %04x/n</span><span style="color: #000000">"</span><span style="color: #000000">,mydosheader.e_cblp);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">e_cp　　　: %04x/n</span><span style="color: #000000">"</span><span style="color: #000000">,mydosheader.e_cp);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">e_crlc　　: %04x/n</span><span style="color: #000000">"</span><span style="color: #000000">,mydosheader.e_crlc);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">e_cparhdr : %04x/n</span><span style="color: #000000">"</span><span style="color: #000000">,mydosheader.e_cparhdr);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">e_minalloc: %04x/n</span><span style="color: #000000">"</span><span style="color: #000000">,mydosheader.e_minalloc);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">e_maxalloc: %04x/n</span><span style="color: #000000">"</span><span style="color: #000000">,mydosheader.e_maxalloc);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">e_ss　　　: %04x/n</span><span style="color: #000000">"</span><span style="color: #000000">,mydosheader.e_ss);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">e_sp　　　: %04x/n</span><span style="color: #000000">"</span><span style="color: #000000">,mydosheader.e_sp);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">e_csum　　: %04x/n</span><span style="color: #000000">"</span><span style="color: #000000">,mydosheader.e_csum);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">e_ip　　　: %04x/n</span><span style="color: #000000">"</span><span style="color: #000000">,mydosheader.e_ip);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">e_cs　　　: %04x/n</span><span style="color: #000000">"</span><span style="color: #000000">,mydosheader.e_cs);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">e_lfarlc　: %04x/n</span><span style="color: #000000">"</span><span style="color: #000000">,mydosheader.e_lfarlc);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">e_ovno　　: %04x/n</span><span style="color: #000000">"</span><span style="color: #000000">,mydosheader.e_ovno);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">e_res[0]　: %04x/n</span><span style="color: #000000">"</span><span style="color: #000000">,mydosheader.e_res[</span><span style="color: #000000">0</span><span style="color: #000000">]);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">e_oemid　 : %04x/n</span><span style="color: #000000">"</span><span style="color: #000000">,mydosheader.e_oemid);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">e_oeminfo : %04x/n</span><span style="color: #000000">"</span><span style="color: #000000">,mydosheader.e_oeminfo);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">res2[0]　 : %04x/n</span><span style="color: #000000">"</span><span style="color: #000000">,mydosheader.e_res2[</span><span style="color: #000000">0</span><span style="color: #000000">]);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">lfanew　　: %08x/n</span><span style="color: #000000">"</span><span style="color: #000000">,mydosheader.e_lfanew);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　</span><span style="color: #0000ff">if</span><span style="color: #000000">((mydosheader.e_magic </span><span style="color: #000000">==</span><span style="color: #000000">IMAGE_DOS_SIGNATURE) </span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　　　　　(sig </span><span style="color: #000000">==</span><span style="color: #000000"> IMAGE_NT_SIGNATURE))<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">有效的PE文件/n</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　</span><span style="color: #0000ff">else</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　　　printf(</span><span style="color: #000000">"</span><span style="color: #000000">无效的PE文件/n</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　　　</span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span></div><br /><br />
<p>最后附上参考文章的地址</p>
<p>&nbsp;</p>
<p><a href="http://xue23.blog.163.com/blog/static/9793442005431142120/">http://xue23.blog.163.com/blog/static/9793442005431142120/</a></p>
<p><a href="http://bbs.fishc.com/home.php?mod=space&amp;uid=9&amp;do=blog&amp;id=558">http://bbs.fishc.com/home.php?mod=space&amp;uid=9&amp;do=blog&amp;id=558</a></p>
<p>Peering Inside the PE.pdf</p>
<p>&nbsp;</p>
<p><a href="http://xue23.blog.163.com/blog/static/9793442005431142120/">http://xue23.blog.163.com/blog/static/9793442005431142120/</a></p><br /><img src ="http://www.cppblog.com/tiany/aggbug/170495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tiany/" target="_blank">Tiany</a> 2012-04-08 22:24 <a href="http://www.cppblog.com/tiany/archive/2012/04/08/170495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>