show pe后期指pe什么意思

麻烦高手指点指点 杭电1040题 总是PE http://acm./showproblem.php?pid=1040 有注释更好_百度知道
麻烦高手指点指点 杭电1040题 总是PE http://acm./showproblem.php?pid=1040 有注释更好
a,%d&quot,i&lt,
array[j]=array[j+1],,&array[i]), scanf(&quot,array[N],temp,i++)
for(j=0,CODE],
for(i=0,&#92,j++)
if(array[j]&gt,a-1,
printf(&quot,j&lt,*冒泡排序*&#47, for(k=0,n&quot,,array[j+1])
temp=array[j],a,k&lt,}[&#47,%5d&quot,i&lt,n,
for(i=0,,n, } return 1,
array[j+1]=temp,j,&n),,a-1-i,k++) {
scanf(&quot,),[CODE]#include &lt,h&gt,
for(i=0,%d&quot,i++)
printf(&quot,#define N 1002int main(){ int i,array[i]),%d&quot,stdio,i&lt,&a),a,i++)
scanf(&quot,
提问者采纳
scanf(&quot,i&lt,i&lt,
array[j+1]=temp,),, scanf(&quot,&array[i]),i++)
for(j=0,array[N],array[j+1])
temp=array[j],&#92, } return 1,*冒泡排序*&#47,,每行结束都多输出了一个空格,
for(i=0,array[i]),n, &quot,a,stdio,if(i != a-1)printf(&quot,&a), for(k=0,,%d&quot,},i++){
printf(&quot,n,&n),k&lt,),
array[j]=array[j+1],a-1,k++) {
scanf(&quot,j&lt,j++)
if(array[j]&gt,#define N 1002int main(){ int i,n&quot,i&lt,}
printf(&quot,
&#47,a,,a-1-i,temp,%d&quot,
for(i=0,j,a,%d&quot,k,%d&quot,#include &lt,
还是PE啊!!真郁闷!!不过还是谢谢!!!!
我就是这么写的啊,过了的
提问者评价
过了,多谢大虾!!
其他类似问题
按默认排序
其他2条回答
for(j=0,, double barry[100],sum=0,n,n,barry[j]) break,%,2lf &quot, double avecou,&#92,m,n,i++)
}return 0,avecou),%d&#92,avecou),),
for(i=0,while(scanf(&quot,, double avestu,
if(i==m-1)
printf(&quot,%,i&lt,j,m,
printf(&quot,
else printf(&quot,
barry[j]=avecou,
avestu=sum&#47,,0,i++)
sum=sum+a[i][j],a[100][100],,&a[i][j]),,
else printf(&quot,n&#92,j++)
if(a[i][j]&lt,),2lf &quot,i&lt,
for(i=0,2lf&quot,i++)
for(j=0,%,&#92,n&quot,int main(){ int m,&m, for(i=0,i&lt,
avecou=sum&#47,
printf(&quot,,j&lt,avestu),m,%,j++)
scanf(&quot,j&lt,i&lt,j++)
sum=sum+a[i][j],m,%d&quot,i,j&lt,
if(j==n-1) printf(&quot,num),%d%d&quot,n,avestu),n,num=0,j&lt,n,
for(j=0,2lf&quot,n&quot,} 你的m和n与题目中的相反,j++)
sum=0,00,if(j==n) num=num+1,
for(j=0,m,,n&quot,
printf(&quot,0,&n)!=EOF){ num=0,
你的代码计算结果不对我的AC啦 #include &stdio.h&#include &stdlib.h&int cmp(const void
*a,const void *b){
return *(int *)a-*(int *)b;}int
int a[1010],N,m,i;
scanf(&%d&,&m);
while (m--)
scanf(&%d&,&N);
for (i=0;i&N;i++)
scanf(&%d&,&a[i]);
qsort(a,N,sizeof(a[0]),cmp);
for (i=0;i&N-1;i++)
printf(&%d &,a[i]);
printf(&%d\n&,a[i]);
return 0;}
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁天津矢志打造全国PE中心
  □本报记者徐畅卢铮
  记者从天津第三届中国企业国际融资洽谈会上获悉,天津市正致力于立足机构集中、市场集约的发展条件,打造以股权交易为核心的全国股权投资基金发行、管理、交易中心
  加快金融改革创新
  2006年5月,国务院发布了《关于推进滨海新区开发开放有关问题的意见》,批准天津滨海新区为全国综合配套改革试验区,明确提出“鼓励天津滨海新区进行金融改革和创新,在金融企业、金融业务、金融市场和金融开放等方面的重大改革,原则上可以安排在天津滨海新区先行先试”
  “天津滨海新区的改革重点是金融,金融改革主要围绕着直接融资来进行”全国社保基金理事会理事长戴相龙在第三届融洽会主题论坛上介绍,天津着力发展私募股权基金,业绩显著第二项改革是创建中国企业国际融资洽谈会,为国内外资金需求方和供应方提供一个交流的平台,现在也见到了成效
  “我们正致力于立足机构集中、市场集约的发展条件,打造以股权交易为核心的全国股权投资基金发行、管理、交易中心”天津市市长黄兴国表示,近年来,天津本着风险可控的原则,不断加快金融改革创新,拓宽直接融资,积极发展私募股权投资基金,目前在天津已经注册的私募股权基金已经达到272家,成交金额500多亿人民币,已经成为中国股权投资基金相对集中的城市
  10日下午,在第三届融洽会上,天津船舶产业基金管理人“中船产业投资基金管理企业”副总经理王坤秀表示,船舶产业基金首期已募集27.5亿资金,短期内项目运作资金规模将在100亿元左右
  事实上,天津创业投资机构普遍都有新的资金募集计划,据6月10日最新发布的2008年天津金融白皮书显示,在接受调查的45家创业投资机构中,有30家制定了进一步募资的计划白皮书指出,在宏观经济尚存在不确定性、资本市场发展相对紧缩的背景下,创业投资主要是用于成长型、高新技术型企业的培育,同时破解民营经济和中小企业融资难的问题随着金融综合配套改革的不断推进,借助滨海新区开发开放的强劲动力,创业投资机构业务和机构的发展将呈现跨越式增长
  打造机构平台
  作为天津市金融改革创新的前沿阵地,滨海新区已成为带动区域经济结构调整和经济增长方式转变的强大引擎为了配合天津先行先试的政策,天津市提出,将着力建立和完善与天津市作为北方经济中心相适应的现代金融服务体系,提出了建设两大股权交易中心和启动于家堡金融区建设项目的决定
  11日下午,滨海国际股权交易所与天津股权投资基金服务中心举行了揭牌仪式天津市副市长崔津渡表示,天津领导股交所与基金中心作为融洽会常态化的两个业务平台,体现了滨海新区金融改革创新先行先试的成果,为区域经济的发展做出了突出贡献
  股交所是国内首家专业从事股权投融资信息的交易场所,试运营半年以来,已确认入会投资机构数量达243家,遍布世界20多个国家和地区;中介机构会员109家,经纪机构会员284家,覆盖全国28个省市、自治区和香港地区,已经初步形成了一个全国性的服务网络体系股交所在试运营期间,已有一个挂牌项目完成交易,两个挂牌项目正在履行后期法律手续,交易额共计13.52亿元
  天津股权投资基金服务中心是面向国内外股权投资企业建立的国内首家专业从事股权投资基金企业服务的平台目前,已有90余家股权投资基金及基金管理公司(企业)落户到了基金中心,实际募集资金到位总额120多亿元基金中心现已成为中国最大的专业股权投资基金聚集平台
  未来,天津市还将建立未上市的公众公司的股权交易市场,这已写入了经国务院批准的天津市综合配套改革方案中,各项准备工作正在进行中
  此外,天津市还将耗资2000亿打造全球最大金融区于家堡金融区于家堡金融区位于天津滨海新区九大功能区之一的中心商务区,是滨海新区的核心地带,按照规划,该金融区占地3.86平方公里,总建筑面积为950万平方米,将是目前世界上占地面积最大的金融区
  天津市提出,对进驻区域内需要扶植的金融类企业,天津新金融公司可以投资参股新金融公司党委书记、董事长李波表示,将通过与入驻金融机构在股权上的合作,实现共赢,增强金融机构的信心
.tomadd_sup_new{background:transparenturl(/cj/deco//images/fina_mj_003.gif)no-repeatscroll102%-48
网友评论欢迎发表评论
#comment_t_show1a:link,#comment_t_show1a:visited{text-decoration:}
#comment_t_show1a:hover{text-decoration:}
//本范例取自商城的商品打分应用
varvote_list=newObject();
vote_list["很好"]="1";
vote_list["稍好"]="2";
vote_list["一般"]="3";
vote_list["稍差"]="4";
vote_list["很差"]="5";
functionkf_ifempty(myform){
if(myform.content.value==""){
alert("请填写评论内容后再提交,谢谢");
oa软件开发自己动手打造PE Show
阅读:276次&&&时间: 00:00:00&&
深入浅出PE文件格式---自己动手打造PE Show&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 作者:WiNrOOt//////////////////////////////////////////////////////////////////////&&&&&&&&&&&&&&&&&&&&&&&&&&& 开篇&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& /////////////////////////////////////////////////////////////////////&& 大家好!我一位菜鸟,学习加密解密已经有一段时间了,可是对于脱壳总是似懂非懂,心中甚是不爽。于是就从PE结构开始,在学习的过程中我发现要真正了解PE文件结构就必须动手,只有动手您才能看懂他,感受他,直到你应用他&&&&&&这是我的一点废话希望大家不要嫌烦。下面是是我的学习笔记,希望能给大家带来一点提示,文中有不对的地方请各位大虾指正。谢谢!////////////////////////////////////////////////////////////////////&&&&&&&&&&&&&&&&&&&&&&&&&&& 准备&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ///////////////////////////////////////////////////////////////////开篇之前我想大家起码要有几点准备:1。Iczelion's Win32 Assembly的教程我们主要是围绕他的PE教程来实现我们的函数功能。&&& (其实Win32ASM Tutorial Resource Kit v1.00 Collected and packed by dREAMtHEATER就包含这些&&& 还是翻译过的。下载地址)&&& 下载回来希望您能看一下,这样大家就好交流:-)2。一个开发环境。(我用的是VC++6.0)3。一个适合你研究东西的环境。//////////////////////////////////////////////////////////////////&&&&&&&&&&&&&&&&&&&&&&&&&& 正文&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& /////////////////////////////////////////////////////////////////&&&& & PE 的意思就是 Portable Executable(可移植的执行体)。它是 Win32环境自身所带的执行体文件格式。它的一些特性继承自 Unix的 Coff (common object file format)文件格式。&portable executable&(可移植的执行体)意味着此文件格式是跨win32平台的 :即使Windows运行在非Intel的CPU上,任何win32平台的PE装载器都能识别和使用该文件格式。当然,移植到不同的CPU上PE执行体必然得有一些改变。所有 win32执行体(除了VxD和16位的Dll)都使用PE文件格式,包括NT的内核模式驱动程序(kernel modedrivers)。因而研究PE文件格式给了我们洞悉Windows结构的良机。&&&&&& 好了,上面这段话就是我们为什么要研究PE文件结构。&&&&& 看图1,这张图我相信大家不陌生,第一块是DOS MZ header这是什么呢?&&&&& 这张图的每一块都是什么意思呢?&&&&& 从编程这方面说图中的每一块都代表着一个结构体,这些小块都包含有不同的子块,也是些结构体。每个小块都有他自己的功能,我相信Iczelion's的教程中已经表达得很明白了。那么我们就来开始动手。&我们要设计我们自己的PE TOOLS----PE Show&主要功能:1判断文件是否是PE文件。&&&&&&&&&& 2显示pe文件的相关信息。1.打开文件代码如下:代码 if(FALSE==PEfile.Open(m_filename,CFile::typeBinary&CFile::shareDenyNone))&&& MessageBox(&文件打不开!&);& && CFile类的使用方法希望大及自己去查找msdn2。文件我们打开了而且是以Binary方式打开的,下面我们该干什么了?& 编写第一个功能-----检验PE文件的有效性在Iczelion's的教程中有这样一段话:&1。首先检验文件头部第一个字的值是否等于 IMAGE_DOS_SIGNATURE,是则 DOS MZ header 有效。&2。一旦证明文件的 DOS header 有效后,就可用e_lfanew来定位 PE header 了。&3。比较 PE header 的第一个字的值是否等于 IMAGE_NT_HEADER。&&& 如果前后两个值都匹配,那我们就认为该文件是一个有效的PE文件。这就是检验PE文件有效性的流程。从上面那段话我们看出判断的关键是PE header 的第一个字的值是否等于 IMAGE_NT_HEADER直到这些我们就倒着找。PE header 的第一个字的值是什么?我么就来看一下IMAGE_NT_HEADERS的结构:(查看WINNT.H就找到了)typedef struct _IMAGE_NT_HEADERS &&&& DWORD S&&& IMAGE_FILE_HEADER FileH&&& IMAGE_OPTIONAL_HEADER32 OptionalH& IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;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 判断的问题我们解决了,新的问题又来了我们如何定位IMAGE_NT_HEADERS结构的位置。MS肯定有办法,PE文件的开头是什么?DOS MZ header结构,我们来看一下他的定义:代码 typedef struct _IMAGE_DOS_HEADER &&&&&& // DOS .EXE header&&& WORD&& e_&&&&&&&&&&&&&&&&&&&& // Magic number&&& WORD&& e_&&&&&&&&&&&&&&&&&&&&& // Bytes on last page of file&&& WORD&& e_&&&&&&&&&&&&&&&&&&&&&&& // Pages in file&&& WORD&& e_&&&&&&&&&&&&&&&&&&&&& // Relocations&&& WORD&& e_&&&&&&&&&&&&&&&&&& // Size of header in paragraphs&&& WORD&& e_&&&&&&&&&&&&&&&&& // Minimum extra paragraphs needed&&& WORD&& e_&&&&&&&&&&&&&&&&& // Maximum extra paragraphs needed&&& WORD&& e_&&&&&&&&&&&&&&&&&&&&&&& // Initial (relative) SS value&&& WORD&& e_&&&&&&&&&&&&&&&&&&&&&&& // Initial SP value&&& WORD&& e_&&&&&&&&&&&&&&&&&&&&& // Checksum&&& WORD&& e_&&&&&&&&&&&&&&&&&&&&&&& // Initial IP value&&& WORD&& e_&&&&&&&&&&&&&&&&&&&&&&& // Initial (relative) CS value&&& WORD&& e_&&&&&&&&&&&&&&&&&&& // File address of relocation table&&& WORD&& e_&&&&&&&&&&&&&&&&&&&&& // Overlay number&&& WORD&& e_res[4];&&&&&&&&&&&&&&&&&&& // Reserved words&&& WORD&& e_&&&&&&&&&&&&&&&&&&&& // OEM identifier (for e_oeminfo)&&& WORD&& e_&&&&&&&&&&&&&&&&&& // OEM e_oemid specific&&& WORD&& e_res2[10];&&&&&&&&&&&&&&&&& // Reserved words&&& LONG&& e_&&&&&&&&&&&&&&&&&&& // File address of new exe header& & IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;&& 看一下最后一项!!!!!& 发现了吗?他指向的就是PE header& 那么DOS MZ header的位置怎么确定呢?呵呵,他就是文件的开始& 看代码:代码 &&&&&&& PEfile.Read(&stPEDosHeader,sizeof(_IMAGE_DOS_HEADER));&if(stPEDosHeader.e_magic!=IMAGE_DOS_SIGNATURE)//&MZ&&&& MessageBox(&DOS MZ header无效!&);& PEfile.Close();&&&&else&&& //-----------------------& //显示DOS Header& //-----------------------& UpdateData(true);& m_Magicnumber.Format(_T(&0x%.4X&),stPEDosHeader.e_magic);& m_cblp.Format(_T(&0x%.4X&),stPEDosHeader.e_cblp);& m_cp.Format(_T(&0x%.4X&),stPEDosHeader.e_cp);& m_crlc.Format(_T(&0x%.4X&),stPEDosHeader.e_crlc);& m_cparhdr.Format(_T(&0x%.4X&),stPEDosHeader.e_cparhdr);& m_minalloc.Format(_T(&0x%.4X&),stPEDosHeader.e_minalloc);& m_maxalloc.Format(_T(&0x%.4X&),stPEDosHeader.e_maxalloc);& m_ss.Format(_T(&0x%.4X&),stPEDosHeader.e_ss);& m_sp.Format(_T(&0x%.4X&),stPEDosHeader.e_sp);& m_csum.Format(_T(&0x%.4X&),stPEDosHeader.e_csum);& m_ip.Format(_T(&0x%.4X&),stPEDosHeader.e_ip);& m_cs.Format(_T(&0x%.4X&),stPEDosHeader.e_cs);& m_lfarlc.Format(_T(&0x%.4X&),stPEDosHeader.e_lfarlc);& m_ovno.Format(_T(&0x%.4X&),stPEDosHeader.e_ovno);& m_oemid.Format(_T(&0x%.4X&),stPEDosHeader.e_oemid);& m_oeminfo.Format(_T(&0x%.4X&),stPEDosHeader.e_oeminfo);& m_lfanew.Format(_T(&0x%.8X&),stPEDosHeader.e_lfanew);& UpdateData(false);&&&buf=stPEDosHeader.e_& //确定_IMAGE_DOS_HEADER偏移&try&PEfile.Seek(buf,CFile::begin);&&catch(...)&&& MessageBox(&_IMAGE_DOS_HEADER.e_lfanew不对!&);& PEfile.Close();&&&&PEfile.Read(&stPEHeader,sizeof(_IMAGE_NT_HEADERS));//----------NT头&if(stPEHeader.Signature!=IMAGE_NT_SIGNATURE)//&PE\0\0&&&& MessageBox(&该文件不是PE格式!&);& PEfile.Close();&&&&else&&&&&& &&&&&&&&&& MessageBox(&该文件是PE格式!&);&&&&&&&&& PEfile.Close();&&&&&&&& && &好了现在我们已经确定了文件是否是有效的PE文件。顺便我们把IMAGE_DOS_HEADER的结构成员都显示出来了。我们已经写了一个功能。下面我们继续顺着往下看:IMAGE_DOS_HEADER结构结束那么就是IMAGE_NT_HEADERS开始。结构体的成员情况前面我们已经介绍过了下面我们来提取他们:代码 & //---------------------------& //显示IMAGE_FILE_HEADER结构& //---------------------------& UpdateData(true);& m_Machine.Format(_T(&0x%.4X&),stPEHeader.FileHeader.Machine);& m_NumberOfSections.Format(_T(&0x%.4X&),stPEHeader.FileHeader.NumberOfSections);& m_TimeDateStamp.Format(_T(&0x%.8X&),stPEHeader.FileHeader.TimeDateStamp);&&&&& m_PointerToSymbolTable.Format(_T(&0x%.8X&),stPEHeader.FileHeader.PointerToSymbolTable);& m_NumberOfSymbols.Format(_T(&0x%.8X&),stPEHeader.FileHeader.NumberOfSymbols);& m_SizeOfOptionalHeader.Format(_T(&0x%.4X&),stPEHeader.FileHeader.SizeOfOptionalHeader);& m_Characteristics.Format(_T(&0x%.4X&),stPEHeader.FileHeader.Characteristics);& UpdateData(false);&& &&&& 这是IMAGE_FILE_HEADER FileHeader的成员,我们已经将他们提取出来。看教程我们继续寻找IMAGE_OPTIONAL_HEADER的成员,他是结构体中的结构体我们就顺着找。代码 typedef struct _IMAGE_OPTIONAL_HEADER &&&& //&&& // Standard fields.&&& //&&& WORD&&& M&&& BYTE&&& MajorLinkerV&&& BYTE&&& MinorLinkerV&&& DWORD&& SizeOfC&&& DWORD&& SizeOfInitializedD&&& DWORD&& SizeOfUninitializedD&&& DWORD&& AddressOfEntryP&&& DWORD&& BaseOfC&&& DWORD&& BaseOfD&&& //&&& // NT additional fields.&&& //&&& DWORD&& ImageB&&& DWORD&& SectionA&&& DWORD&& FileA&&& WORD&&& MajorOperatingSystemV&&& WORD&&& MinorOperatingSystemV&&& WORD&&& MajorImageV&&& WORD&&& MinorImageV&&& WORD&&& MajorSubsystemV&&& WORD&&& MinorSubsystemV&&& DWORD&& Win32VersionV&&& DWORD&& SizeOfI&&& DWORD&& SizeOfH&&& DWORD&& CheckS&&& WORD&&& S&&& WORD&&& DllC&&& DWORD&& SizeOfStackR&&& DWORD&& SizeOfStackC&&& DWORD&& SizeOfHeapR&&& DWORD&& SizeOfHeapC&&& DWORD&& LoaderF&&& DWORD&& NumberOfRvaAndS&&& IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];& IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;&&看到这些成员将他们全部显示出来代码 & //--------------------------------& //显示IMAGE_OPTIONAL_HEADER& //--------------------------------& UpdateData(true);& m_Magic.Format(_T(&0x%.4X&),stPEHeader.OptionalHeader.Magic);& m_MajorLinkerVersion.Format(_T(&0x%.2X&),stPEHeader.OptionalHeader.MajorLinkerVersion);& m_MinorLinkerVersion.Format(_T(&0x%.2X&),stPEHeader.OptionalHeader.MinorLinkerVersion);& m_SizeOfCode.Format(_T(&0x%.8X&),stPEHeader.OptionalHeader.SizeOfCode);& m_SizeOfInitializedData.Format(_T(&0x%.8X&),stPEHeader.OptionalHeader.SizeOfInitializedData);& m_SizeOfUninitializedData.Format(_T(&0x%.8X&),stPEHeader.OptionalHeader.SizeOfUninitializedData);& m_AddressOfEntryPoint.Format(_T(&0x%.8X&),stPEHeader.OptionalHeader.AddressOfEntryPoint);& m_BaseOfCode.Format(_T(&0x%.8X&),stPEHeader.OptionalHeader.BaseOfCode);& m_BaseOfData.Format(_T(&0x%.8X&),stPEHeader.OptionalHeader.BaseOfData);& m_ImageBase.Format(_T(&0x%.8X&),stPEHeader.OptionalHeader.ImageBase);& m_SectionAlignment.Format(_T(&0x%.8X&),stPEHeader.OptionalHeader.SectionAlignment);& m_FileAlignment.Format(_T(&0x%.8X&),stPEHeader.OptionalHeader.FileAlignment);& m_MajorOperatingSystemVersion.Format(_T(&0x%.4X&),stPEHeader.OptionalHeader.MajorOperatingSystemVersion);& m_MinorOperatingSystemVersion.Format(_T(&0x%.4X&),stPEHeader.OptionalHeader.MinorOperatingSystemVersion);& m_MajorImageVersion.Format(_T(&0x%.4X&),stPEHeader.OptionalHeader.MajorImageVersion);& m_MinorImageVersion.Format(_T(&0x%.4X&),stPEHeader.OptionalHeader.MinorImageVersion);& m_MajorSubsystemVersion.Format(_T(&0x%.4X&),stPEHeader.OptionalHeader.MajorSubsystemVersion);& m_MinorSubsystemVersion.Format(_T(&0x%.4X&),stPEHeader.OptionalHeader.MinorSubsystemVersion);& m_Win32VersionValue.Format(_T(&0x%.8X&),stPEHeader.OptionalHeader.Win32VersionValue);& m_SizeOfImage.Format(_T(&0x%.8X&),stPEHeader.OptionalHeader.SizeOfImage);& m_SizeOfHeaders.Format(_T(&0x%.8X&),stPEHeader.OptionalHeader.SizeOfHeaders);& m_CheckSum.Format(_T(&0x%.8X&),stPEHeader.OptionalHeader.CheckSum);& m_Subsystem.Format(_T(&0x%.4X&),stPEHeader.OptionalHeader.Subsystem);& m_DllCharacteristics.Format(_T(&0x%.4X&),stPEHeader.OptionalHeader.DllCharacteristics);& m_SizeOfStackReserve.Format(_T(&0x%.8X&),stPEHeader.OptionalHeader.SizeOfStackReserve);& m_SizeOfStackCommit.Format(_T(&0x%.8X&),stPEHeader.OptionalHeader.SizeOfStackCommit);& m_SizeOfHeapReserve.Format(_T(&0x%.8X&),stPEHeader.OptionalHeader.SizeOfHeapReserve);& m_SizeOfHeapCommit.Format(_T(&0x%.8X&),stPEHeader.OptionalHeader.SizeOfHeapCommit);& m_LoaderFlags.Format(_T(&0x%.8X&),stPEHeader.OptionalHeader.LoaderFlags);& m_NumberOfRvaAndSizes.Format(_T(&0x%.8X&),stPEHeader.OptionalHeader.NumberOfRvaAndSizes);& UpdateData(false); && 我们已经学了许多关于 DOS header 和 PE header 的知识。接下来就该轮到 section table(节表)了。节表其实就是紧挨着 PE header 的一结构数组。该数组成员的数目由 file header (IMAGE_FILE_HEADER) 结构中 NumberOfSections 域的域值来决定。节表结构又命名为 IMAGE_SECTION_HEADER。代码 typedef struct _IMAGE_SECTION_HEADER &&&& BYTE&&& Name[IMAGE_SIZEOF_SHORT_NAME];&&& union &&&&&&&&&&&& DWORD&& PhysicalA&&&&&&&&&&& DWORD&& VirtualS&&& & M&&& DWORD&& VirtualA&&& DWORD&& SizeOfRawD&&& DWORD&& PointerToRawD&&& DWORD&& PointerToR&&& DWORD&& PointerToL&&& WORD&&& NumberOfR&&& WORD&&& NumberOfL&&& DWORD&& C& IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER Name&&&& 这儿的节名长不超过8字节。记住节名仅仅是个标记而已,我们选择任何名字甚至空着也行,注意这里不用null结束。命名不是一个ASCIIZ字符串,所以不用null结尾。 VirtualAddress 本节的RVA(相对虚拟地址)。PE装载器将节映射至内存时会读取本值,因此如果域值是1000h,而PE文件装在地址400000h处,那么本节就被载到401000h。 SizeOfRawData 经过文件对齐处理后节尺寸,PE装载器提取本域值了解需映射入内存的节字节数。(译者注: 假设一个文件的文件对齐尺寸是0x200,如果前面的 VirtualSize域指示本节长度是0x388字节,则本域值为0x400,表示本节是0x400字节长)。 PointerToRawData 这是节基于文件的偏移量,PE装载器通过本域值找到节数据在文件中的位置。 Characteristics 包含标记以指示节属性,比如节是否含有可执行代码、初始化数据、未初始数据,是否可写、可读等。现在我们已知晓 IMAGE_SECTION_HEADER 结构,再来模拟一下 PE装载器的工作吧:1 读取 IMAGE_FILE_HEADER 的 NumberOfSections域,知道文件的节数目。 2 SizeOfHeaders 域值作为节表的文件偏移量,并以此定位节表。 3 遍历整个结构数组检查各成员值。 4 对于每个结构,我们读取PointerToRawData域值并定位到该文件偏移量。然后再读取SizeOfRawData域值来决定映射内存的字节数。将VirtualAddress域值加上ImageBase域值等于节起始的虚拟地址。然后就准备把节映射进内存,并根据Characteristics域值设置属性。 5 遍历整个数组,直至所有节都已处理完毕。代码如下:代码 & //------------------------------& //显示Section结构& //------------------------------& nSection=stPEHeader.FileHeader.NumberOfS& stSectionHeader=new _IMAGE_SECTION_HEADER[nSection];& m_ListCtrl.DeleteAllItems();& for(int i=0;i& &&& && PEfile.Read(&stSectionHeader[i],sizeof(_IMAGE_SECTION_HEADER));//-----节表&& //NO&& szTemp.Format(_T(&%.2d&), i+1);&& m_ListCtrl.InsertItem(i,szTemp,i);&& //SectionName&& strcpy(chSectionName,(LPCSTR)stSectionHeader[i].Name);&&&&&&&&&& m_ListCtrl.SetItemText(i,1,chSectionName);&& //VirtualSize&& szTemp.Format(_T(&0x%.8X&),stSectionHeader[i].Misc.VirtualSize);&&&&&&&&&&&&& m_ListCtrl.SetItemText(i,2,szTemp);&& //VirtualAddress&& szTemp.Format(_T(&0x%.8X&),stSectionHeader[i].VirtualAddress );&&&&&&&&&&&&& m_ListCtrl.SetItemText(i,3,szTemp);&& //SizeOfRawData&& szTemp.Format(_T(&0x%.8X&),stSectionHeader[i].SizeOfRawData );&& m_ListCtrl.SetItemText(i,4,szTemp);&& //SizeOffset&& szTemp.Format(_T(&0x%.8X&),stSectionHeader[i].PointerToRawData );&& m_ListCtrl.SetItemText(i,5,szTemp);&& //Characteristics&& szTemp.Format(_T(&0x%.8X&),stSectionHeader[i].Characteristics );&& m_ListCtrl.SetItemText(i,6,szTemp);&& && & && delete stSectionH
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
Copyright &
All Rights Reserved

我要回帖

更多关于 pe什么意思 的文章

 

随机推荐