yts-PE文件
深入理解Win32PE文件格式
深⼊理解Win32PE⽂件格式深⼊理解 Win32 PE ⽂件格式Matt Pietrek这篇⽂章假定你熟悉C++和Win32。
概述理解可移植可执⾏⽂件格式(PE)可以更好地了解操作系统。
如果你知道DLL和EXE中都有些什么东西,那么你就是⼀个知识渊博的程序员。
这⼀系列⽂章的第⼀部分,讨论最近这⼏年PE格式所发⽣的变化。
这次更新后,作者讨论了PE格式如何适应于⽤.NET开发的应⽤程序,包括PE节,RVA,数据⽬录,以及导⼊函数。
附录中包含了相关的映像头结构以及它们的描述。
很早以前,我为微软系统期刊(现在叫做MSDN)写了⼀篇⽂章。
那篇⽂章“Peering Inside the PE: A Tour of the Win32 Portable Executable File Format”⽐我所期望的更受⼈欢迎。
直到现在,我仍然能收到使⽤那篇⽂章的⼈(甚⾄Microsoft⾥的⼈)的来信,那篇⽂章在MSDN中仍然能够找到。
不幸的是,那篇⽂章中存在⼀些问题。
这⼏年Win32发⽣了很⼤变化,那篇⽂章已经过时了。
从这个⽉开始我将在⼀篇分成两部分的⽂章中改正那些问题。
你也许会奇怪为什么应该关⼼可执⾏⽂件的格式呢。
答案还和过去⼀样:⼀个操作系统可执⾏⽂件的格式和数据结构揭⽰了这个底层操作系统的许多东西。
通过理解EXE和DLL中到底有些什么,你会成为⼀个知识更加渊博的程序员。
当然,你从微软的规范中也能学到我所告诉你的许多东西。
然⽽,微软的规范为了涵盖全⾯⽽牺牲了可读性。
⽽我这篇⽂章的焦点主要就是讨论 PE ⽂件的格式,填补了不适合出现在正式的说明规范中的部分。
另外,在这篇⽂章中也有⼀些在任何微软官⽅⽂档中都没有的好东西。
Bridging the Gap先给出⼏个⾃从1994年我写了那篇⽂章之后 PE ⽂件格式都发⽣了哪些变化的例⼦。
由于16位的 Windows 已经成为历史,所以没有必要再和 Win16 可执⾏⽂件格式进⾏⽐较了。
pe格式化方法(1)
pe格式化方法PE格式(Portable Executable format)是Windows操作系统下的一种可执行文件的格式标准,它定义了可执行文件、动态链接库(DLL)和驱动程序等二进制文件的结构和标识方法。
本文将介绍PE格式化的基本原理和方法,并举例说明。
一、PE格式基本原理1. PE格式定义:PE格式是一种COFF(Common Object File Format)文件格式的变体,用于描述32位和64位Windows可执行文件的结构和组织。
2. 文件头部分:PE格式文件的开头是一个固定大小的文件头(File Header),用于描述整个PE文件的组织结构和属性信息,如文件类型、目标体系结构、节表位置等。
3. 节部分:紧随文件头部分的是节(Section)部分,它描述了PE格式文件中各个段或区块的属性和内容,如代码段、数据段、资源段等。
4. 数据目录:PE格式文件中包含了多个数据目录(Data Directory),每个数据目录描述了PE文件中某个特定功能的位置和大小信息,如导入表、导出表、资源表等。
1. 创建空白PE文件:使用合适的开发工具,如Visual Studio等,新建一个空白的PE 文件。
2. 定义文件头:根据所需的文件类型和目标体系结构,填写文件头部分的属性信息。
如指定文件类型为可执行文件(Executable)、目标体系结构为32位或64位等。
3. 定义节表:根据需求,定义PE文件中的各个节的属性和内容,如代码段、数据段、资源段等。
可以使用合适的工具,如Hex编辑器等,手动修改节表。
4. 填充数据目录:根据PE格式的规定,将所需的功能的位置和大小信息填写入数据目录表中,如导入表、导出表、资源表等。
5. 填充节内容:根据需求,将代码、数据和资源等内容填写入相应的节中。
可以使用合适的工具,如文本编辑器等,手动修改和填充节内容。
6. 调整文件大小:根据实际内容大小,调整整个PE文件的大小,确保文件大小与实际内容相符。
PE文件入口地址
百度空间| 百度首页| 登录夜归之家昨天今天明天主页博客相册|个人档案|好友查看文章PE文件入口地址(检测加壳信息的特征码)一2008-06-26 17:54PE文件入口地址(检测加壳信息的特征码)<<BEGIN>>[Borland Pascal v7.0 for Windows=9AFFFF00009AFFFF00005589E531C09AFFFF0000] [Borland C++ for Win32 1994=A1::::::::C1::::A3::::::::83::::::::75::575133C0BF][Borland C++ for Win32 1995=A1::::::::C1::::A3::::::::575133C0BF::::::::B9::::::::3BCF76] [Borland C++ for Win32 1995=A1::::::::C1::::A3::::::::83::::::::75::80::::::::::::74][Borland C++ for Win32 1999=EB1066623A432B2B484F4F4B90E9::::::::A1::::::::C1E002A3::::::::52][Borland C++ for Win32 1999=EB1066623A432B2B484F4F4B90][BorlandC++=A1::::::::C1E002A3::::::::575133C0BF::::::::B9::::::::3BCF76052BCFFCF3AA595F] [Borland C++ DLL=A1::::::::C1E002A3][Borland C++ DLL=EB1066623A432B2B484F4F4B90E9][Borland C++ DLL=EB1066623A432B2B484F4F4B90E9A1C1E002A38B][Borland Delphi DLL=558BEC83C4B4B8::::::::E8::::::::E8::::::::8D40][Borland Delphi v2.0=E8::::::::6A00E8::::::::8905::::::::E8::::::::8905::::::::C705::::::::0A::::::B8::::::::C3] [Borland Delphi v3.0=506A00E8::::FFFFBA::::::::528905::::::::894204E8::::::::5A58E8::::::::C3558BEC33C0] [Borland Delphi v4.0 - v5.0=506A00E8::::FFFFBA::::::::528905::::::::894204C7420800000000C7420C00000000E8::::::: :5A58E8::::::::C3][Borland Delphi v6.0=538BD833C0A3::::::::6A00E8::::::FFA3::::::::A1::::::::A3::::::::33C0A3::::::::33C0A3::::::::E 8][Borland Delphi Setup Module=558BEC83C4::53565733C08945F08945D48945D0E8] [Cygwin32=5589E583EC04833D::::::::::::::::::::::::][Free Pascal v0.99.10=::::::::::::::::::::::::::::::::::::::E8006E00005589E58B7D0C8B750889F88B5D1029] [LCC Win32 v1.x=64A1000000005589E56AFF68::::::00689A10400050][LCC Win32 DLL=5589E5535657837D0C017505E817000000FF7510FF750CFF7508A1] [Microsoft Visual C++ Private Version 2=8B4424085683E8::74::4875][Microsoft Visual C++ Private Version 1=8B44240883::::74][Microsoft Visual C v2.0=535657BB::::::::8B::::::553BFB75][Microsoft Visual C++ vx.x=558BEC5657BF::::::::8B::::3BF70F][Microsoft Visual C++ vx.x=5355568B::::::85F657B8::::::::75::8B::::::::::85C975::33C05F5E5D5BC2][Microsoft Visual C++ v4.x=64A100000000558BEC6AFF68::::::::68::::::::506489250000000083EC::535657] [Microsoft Visual C++ v4.2=64A100000000558BEC6AFF68::::::::68::::::::5064::::::::::::83::::53565789::::FF][Microsoft Visual C++ v4.2=64A100000000558BEC6AFF68::::::::68::::::::5064::::::::::::83::::53565789::::C7] [Microsoft Visual C++ v4.2 DLL=53B8::::::::8B::::::565785DB5575][Microsoft Visual C++ v5.0=558BEC6AFF686864A100000000506489250000000083EC535657] [Microsoft Visual C++ v5.0 DLL=::::24::::::::::::::::::::::::::::::::::::00::::::::::::::::8B::240C:::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::83:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::8D][Microsoft Visual C++ v5.0/v6.0 (MFC)=558BEC6AFF68::::::::68::::::::64A10000000050] [Microsoft Visual C++ vx.x=558BEC::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::00::::::::::::::::::::::::::04:::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::00::83::::::::::00::::::::::::::::::::::::::::00][Microsoft Visual C++ vx.x DLL=::::::::::::::00::::::::::::::::::::::::::000000::::::::000000::::::::::::::::::::::::::::::0000::::::0000::::::00 00::::::0000::::::::::::::::::::::::::::::::68::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::0000 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::00::::::00::00::::::0000::::::0000::::::::::::00::00] [Microsoft Visual C++ v6.0 SPx=558BEC83EC4456FF15::::::::8BF08A::3C22][Microsoft Visual C++ v6.0 SPx=558BEC83EC4456FF15::::::::6A018BF0FF15][Microsoft Visual C++ v6.0=558BEC6AFF686864A100000000506489250000000083EC535657] [Microsoft Visual C++ v6.0 DLL=::::::::::::::::::::::::::00::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::51::::::::::::::::::::::0000:::::::: ::::::::::8B::::::::::::::::::::::::::::::::00::::::::::::::::::::::::::::::::::::00::::::::::::::::::::::::::::::::::::::::00::::8B: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::8B::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::4D::::::::02][Microsoft Visual C++ v6.0 DLL=837C24080175098B442404A3::::0010E88BFFFFFF] [Microsoft Visual C++ v6.0=558BEC83EC50535657BE::::::::8D7DF4A5A566A58B] [Microsoft Visual C++ v6.0 DLL=558D6C::::81EC::::::::8B45::83F801560F84::::::::85C00F84] [Microsoft Visual C++ v6.0 DLL=558BEC538B5D08568B750C][Microsoft Visual C++ v6.0=::::::::::::::::::00::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::00::::::0D ::::::00::::::::::::::::::::00::::::::::::::00::::::::::::::::::::::::::::1C::::00::::::::::::::::::::00FF:::::::::::::::::::::::: ::::::::::::::::::::::::::::::::00::::::::00][Microsoft Visual C++ v6.0 (Debug Version)=558BEC51::::::01::::::::::::::::::::::::::::::::::::::::::::00:::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::::00::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::10::::::::::::::::::E8::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::0 000][Microsoft Visual C++ v7.0=6A::68::::::::E8::::::::BF::::::::8BC7E8::::::::8965::8BF4893E56FF15::::::::8B4E::890D:::::::: 8B46::A3][Microsoft Visual C++ v7.0=6A::68::::::::E8][Microsoft Visual C++ v7.0 DLL=558D6C::::81EC::::::::8B45::83F801560F84::::::::85C00F84] [Microsoft Visual C++ v7.0 DLL=558BEC538B5D08568B750C578B7D10::::83][Microsoft Visual C# v7.0 / Basic .NET=FF250020400000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000][Microsoft Visual C++ DLL=5355568B74241485F657B801000000][Microsoft Visual C++ DLL=535657BB01::::::8B::2414][Microsoft Visual C++ DLL=53B8010000008B5C240C565785DB557512833D::::::::::750933C0] [Microsoft Visual C++ DLL=558BEC5657BF010000008B750C][Microsoft Visual C++=558BEC6AFF68::::::::68::::::::64A1000000005064892500000000] [Microsoft Visual Basic v5.0=::::::::::::::FFFFFF0000000000003000000040000000000000] [Microsoft Visual Basic v5.0/v6.0=68::::::::E8::::::::00000000000030000000][Microsoft Visual Basic v6.0 DLL=5A68::::::::68::::::::52E9::::FF][MinGW GCC v2.x=5589E5::::::::::::FFFF::::::::::00::::00::::::00000000::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::00::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::00::::::::::: :::00::::::::::::::::::::00::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::00][MinGW GCC v2.x=5589E5E8::::::::C9C3::::455845][MinGW GCC DLL v2xx=5589E5::::::::::::::::::::::000000::::::::::::::::::::00::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::00::::::68][MinGW v3.2.x (Dll_main)=5589E583EC188975FC8B750C895DF883FE01745C897424048B5510895424088B5 508891424E89601000083EC0C83FE0189C3742C85F6750C8B0D0030001085C9751031DB89D 88B5DF88B75FC89EC5DC20C00E859000000EBEB8DB4260000000085C075D0E847000000E BC9908D742600C7042480000000E8F4050000A30030001085C0741AC70000000000A3103000 10E83B020000E8C6010000E975FFFFFFE8BC050000C7000C00000031C0EB9889F65589E583 EC08895DFC8B150030001085D274298B1D1030001083EB0439D3720D8B0385C0752A83EB 0439D373F3891424E86B05000031C0A300300010C7042400000000E8480500008B5DFC89EC 5DC3][MinGW v3.2.x (Dll_WinMain)=5589E583EC188975FC8B750C895DF883FE01745C897424048B551089542408 8B5508891424E87601000083EC0C83FE0189C3742C85F6750C8B0D0030001085C9751031DB 89D88B5DF88B75FC89EC5DC20C00E859000000EBEB8DB4260000000085C075D0E8470000 00EBC9908D742600C7042480000000E8A4050000A30030001085C0741AC70000000000A310 300010E81B020000E8A6010000E975FFFFFFE86C050000C7000C00000031C0EB9889F65589 E583EC08895DFC8B150030001085D274298B1D1030001083EB0439D3720D8B0385C0752A8 3EB0439D373F3891424E81B05000031C0A300300010C7042400000000E8F80400008B5DFC8 9EC5DC3][MinGW v3.2.x (main)=5589E583EC08C7042401000000FF15E4404000E86800000089EC31C05DC389F65589E583EC08C7042402000000FF15E4404000E84800000089EC31C05DC389F65589E583EC088B 5508891424FF150041400089EC5DC38D76008DBC27000000005589E583EC088B5508891424 FF15F440400089EC5DC38D76008DBC27000000005589E55383EC24C70424A0114000E88D0 7000083EC04E885020000C70424002040008B151********D4DF8C745F800000000894C2410 8954240C8D55F489542408C744240404204000E802070000A12020400085C07476A330204000 A1F040400085C0741F890424E8C30600008B1D20204000890424895C2404E8C1060000] [MinGW v3.2.x (WinMain)=5589E583EC08C7042401000000FF15FC404000E86800000089EC31C05DC389F65 589E583EC08C7042402000000FF15FC404000E84800000089EC31C05DC389F65589E583EC0 88B5508891424FF151841400089EC5DC38D76008DBC27000000005589E583EC088B5508891 424FF150C41400089EC5DC38D76008DBC27000000005589E55383EC24C70424A0114000E8 5D08000083EC04E855030000C70424002040008B151********D4DF8C745F800000000894C2 4108954240C8D55F489542408C744240404204000E8D2070000A12020400085C07476A33020 4000A10841400085C0741F890424E8930700008B1D20204000890424895C2404E891070000] [MinGW v3.2.x (Dll_mainCRTStartup)=5589E583EC086A006A006A006A00E80D000000B800000000C9C3909 090909090FF253820001090900000000000000000FFFFFFFF00000000FFFFFFFF0000000000] [MinGW v3.2.x (_mainCRTStartup)=5589E583EC086A006A006A006A00E80D000000B800000000C9C390909 0909090FF253820400090900000000000000000FFFFFFFF00000000FFFFFFFF0000000000] [Stranik 1.3 Modula/C/Pascal=E8::::FFFFE8::::FFFF::::::::::::::::::::::::::::::::::::::00::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::00::::::::::::00::::::::::::::::::::::00::::::::::::00:::: ::::::00::::::::::::::::::::::::::::::::::::::::::::::::::::::00::::00::::::000000::::::00::::00::00::0000::00::::::::::0 0::::00::::00::::::::::00::::00::::::000000::::::::::::::::::00::::00::::::000000::::00::::::::::::00::::00::::::00 0000::::::::::00::::::::::::::::00][WATCOM C/C++ 32 Run-Time System 1988-1995=E9::::::::::::::::574154434F4D20432F432B2B33322052756E2D54][WATCOM C/C++ 32 Run-Time System 1988-1994=FB83::::89E389::::::::::89::::::::::66::::::66::::::::::BB::::::::29C0B430CD21] [WATCOM C/C++=E9::::::00::::::005741][.BJFnt v1.1b=EB01EA9CEB01EA53EB01EA51EB01EA52EB01EA56][.BJFnt v1.2 RC=EB0269B183EC04EB03CD20EBEB01EB9CEB01EBEB][.BJFnt v1.3=EB033A4D3A1EEB02CD209CEB02CD20EB02CD2060][.BJFnt v1.3=EB::3A::::1EEB::CD209CEB::CD20EB::CD2060EB][32Lite v0.03a=6006FC1E07BE::::::::6A04680010::::68][AcidCrypt=60B9::::::00BA::::::00BE::::::000238404E75FA8BC28A1832DFC0CB][Alloyv1.x.2000=9C60E80200000033C08BC483C004938BE38B5BFC81EB0720400087DD6A046800 10::::680002::::6A00FF95462340::0B][Armadillov1.60a=558BEC6AFF689871400068482D400064A100000000506489250000000083EC58] [Armadillov1.77=558BEC6AFF68B0714000686C37400064A100000000506489250000000083EC58][Armadillov1.82=558BEC6AFF68E0C14000687481400064A100000000506489250000000083EC58] [Armadillov1.83=558BEC6AFF68E0C14000686484400064A100000000506489250000000083EC58] [Armadillov1.84=558BEC6AFF68E8C1400068F486400064A100000000506489250000000083EC58] [Armadillov1.90=558BEC6AFF6810F2400068649A400064A100000000506489250000000083EC58] [Armadillov1.90b1=558BEC6AFF68E0C14000680489400064A100000000506489250000000083EC58] [Armadillov1.90b2=558BEC6AFF68F0C1400068A489400064A100000000506489250000000083EC58] [Armadillov1.90b3=558BEC6AFF6808E24000689495400064A100000000506489250000000083EC58] [Armadillov1.90b4=558BEC6AFF6808E2400068B496400064A100000000506489250000000083EC58] [Armadillov1.90a=558BEC64FF6810F2400068149B400064A100000000506489250000000083EC58] [Armadillov1.90c=558BEC6AFF6810F2400068749D400064A100000000506489250000000083EC58] [Armadillo v1.xx - v2.xx=558BEC538B5D08568B750C578B7D1085F6][Armadillov2.00=558BEC6AFF680002410068C4A0400064A100000000506489250000000083EC58] [Armadillov2.00b1=558BEC6AFF6800F2400068C49D400064A100000000506489250000000083EC58] [Armadillov2.00b2-2.00b3=558BEC6AFF6800F2400068C4A0400064A100000000506489250000000083E C58][Armadillov2.01=558BEC6AFF680802410068049A400064A100000000506489250000000083EC58] [Armadillov2.10b2=558BEC6AFF68181241006824A0400064A100000000506489250000000083EC58] [Armadillov2.20=558BEC6AFF681012410068F4A0400064A100000000506489250000000083EC58] [Armadillov2.20b1=558BEC6AFF683012410068A4A5400064A100000000506489250000000083EC58] [Armadillov2.50=558BEC6AFF68B8::::::68F8::::::64A100000000506489250000000083EC585356578965E 8FF1520::::::33D28AD48915D0][Armadillov2.51=558BEC6AFF68B8::::::68D0::::::64A100000000506489250000000083EC585356578965E 8FF1520][Armadillo v2.52 beta2=558BEC6AFF68::::::::B0::::::::686064A100000000506489250000000083EC585356578965E8FF::::::1524][Armadillov2.52=558BEC6AFF68::::::::E0::::::::68D464A100000000506489250000000083EC58535657896 5E8FF::::::1538][Armadillov2.53=558BEC6AFF68::::::::40::::::::685464A100000000506489250000000083EC585356578965 E8FF::::::155833D28AD489][Armadillo v2.60 Beta 1=558BEC6AFF68::::::::50::::::::687464A100000000506489250000000083EC585356578965E8F F::::::155833D28AD489][Armadillo v2.5x - v2.6x=558BEC6AFF68::::::::68::::::::64A100000000506489250000000083EC585356578965E8F F1558::::::33D28AD48915EC][Armadillo v2.85=558BEC6AFF6868::::006800::::0064A10000000050648925][Armadillo v3.01, v3.05=60E8000000005D5051EB0FB9EB0FB8EB07B9EB0F90EB08FDEB0BF2EBF5EBF6F2E B08FDEBE9F3EBE4FCE959585051EB0FB9EB0FB8EB07B9EB0F90EB08FDEB0BF2EBF5E BF6F2EB08FDEBE9F3EBE4FCE959585051EB0FB9EB0FB8EB07B9EB0F90EB08FDEB0BF2 EBF5EBF6F2EB08FDEBE9F3EBE4FCE959586033C97502EB15EB33C975187A0C700EEB0D E8720E79F1FF1500790974F0EB87DB7AF0A033615051EB0FB9EB0FB8EB07B9EB0F90EB0 8FDEB0BF2EBF5EBF6F2EB08FDEBE9F3EBE4FCE95958609C33C0E809000000E8E8230000 007A23A08B0424EB037A29E9C60090C3E870F087D27107E900408BDB7A11EB08E9EBF7E BC3E87AE970DA7BD171F3E97B][ASPackv1.00b=60E8000000005D81ED921A4400B88C1A440003C52B85CD1D44008985D91D440080 BDC41D44][ASPackv1.01b=60E8000000005D81EDD22A4400B8CC2A440003C52B85A52E44008985B12E440080 BD9C2E44][ASPackv1.02a=60E8000000005D81ED3ED94300B838::::0003C52B850BDE4300898517DE430080BD 01DE4300007515FE8501DE4300E81D000000E879020000E8120300008B8503DE4300038517 DE43008944241C61FF][ASPackv1.02b=60E8000000005D81ED96784300B89078430003C52B857D7C43008985897C430080BD 747C43][ASPack v1.02b=60E8000000005D81ED96784300B89078430003C5][ASPackv1.03b=60E8000000005D81EDAE984300B8A898430003C52B85189D43008985249D430080B D0E9D43][ASPackv1.04b=60E8000000005D81ED::::::00B8::::::0003C52B85::129D::89851E9D::0080BD089D::00 00][ASPackv1.05b=60E8000000005D81EDCE3A4400B8C83A440003C52B85B53E44008985C13E440080 BDAC3E44][ASPack v1.06b=907500E9][ASPack v1.06b=90907500E9][ASPack v1.06b=9090907500E9][ASPackv1.061b=60E8000000005D81EDEAA84300B8E4A8430003C52B8578AD4300898584AD43008 0BD6EAD43][ASPack v1.07b=60E8000000005D81ED00B80003C52B850BDE898517DE0080BD01DE0000] [ASPack v1.07b (DLL)=60E8000000005D::::::::::::B8::::::::03C5][ASPack v1.07b=90909075::E9][ASPack v1.07b=909075::E9][ASPack v1.07b=9075::E9][ASPack v1.08=907501FFE9][ASPack v1.08=90907501FFE9][ASPack v1.08=9090907501FFE9][ASPack v1.08.01=90909075::90E9][ASPack v1.08.01=909075::90E9][ASPack v1.08.01=9075::90E9][ASPack v1.08.01=60EB::5DEB::FF::::::::::E9][ASPackv1.08.01=60EB0A5DEB02FF2545FFE5E8E9E8F1FFFFFFE981::::::4400BB10::440003DD2B9 D][ASPackv1.08.02=60EB0A5DEB02FF2545FFE5E8E9E8F1FFFFFFE981ED236A4400BB10::440003DD 2B9D72][ASPack v1.08.x=60EB035DFFE5E8F8FFFFFF81ED1B6A4400BB106A440003DD2B9D2A] [ASPack v1.08.03=60E8000000005D::::::::::::BB::::::::03DD][ASPack v1.08.03=60E8000000005D81ED0A4A4400BB044A440003DD][ASPackv1.08.03=60E8000000005D81ED0A4A4400BB044A440003DD2B9DB150440083BDAC504400 00899DBB4E][ASPack v1.08.04=60E841060000EB41][ASPack v2.000=60E870050000EB4C][ASPack v2.001=60E872050000EB4C][ASPack v2.1=60E872050000EB3387DB9000][ASPack v2.11=60E93D040000][ASPack v2.11b=60E802000000EB095D5581ED39394400C3E93D040000][ASPack v2.11c=60E802000000EB095D5581ED39394400C3E959040000][ASPack v2.11d=60E802000000EB095D55][ASPack v2.12=60E803000000E9EB045D4555C3E801000000EB5DBBEDFFFFFF03DD81EB] [ASPack v2.12=60E803000000E9EB045D4555C3E801][ASPackv2.xx=A8030000617508B801000000C20C006800000000C38B852********D8D3B0400005150FF95][ASProtect vx.x=9060::::::0000::::::::::::::::::::::][ASProtect vx.x=60::::::::::905D::::::::::::::::::::::03DD][ASProtect v1.0=60E801000000905D81ED::::::00BB::::::0003DD2B9D][ASProtect v1.1=60E9::040000E9::::::::::::::EE][ASProtect v1.1 MTE=60E9::::::::9178797979E9][ASProtect v1.1 BRS=60E9::050000][ASProtect v1.2=6801::::::C3][ASProtect v1.2x=00006801::::::C3AA][ASProtect v1.2x (New Strain)=6801::::::E801000000C3C3][ASProtect v1.23 RC1=6801::::00E801000000C3C3][Blade Joiner v1.5=558BEC81C4E4FEFFFF53565733C08945F08985][CExev1.0a=558BEC81EC0C02::::56BE0401::::8D85F8FEFFFF56506A00FF15541040::8A8DF8FEFF FF33D284C98D85F8FEFFFF7416][CodeCrypt v0.14b=E9C5020000EB02833D58EB02FF1D5BEB020FC75F][CodeCrypt v0.15b=E931030000EB02833D58EB02FF1D5BEB020FC75F][CodeCrypt v0.16b - v0.163b=E92E030000EB02833D58EB02FF1D5BEB020FC75F] [CodeCrypt v0.164=E92E030000EB02833D58EB02FF1D5BEB020FC75FEB03FF1D34] [Code-Lock vx.x=434F44452D4C4F434B2E4F435800][CodeSafe v2.0=::::::::::::::::::::::::::::::::::::::::::::::::83EC10535657E8C40100][CreateInstall Stub vx.x=558BEC81EC200200005356576A00FF15186140006800704000894508FF151461400085C 074276A00A10020400050FF153C6140008BF06A0656FF153********A0356FF1538614000E9 3603000068027F000033F656BF00300000FF152061400050FF152C6140006A04576800FF0100 56FF15CC6040006A04A3CC3540005768000F010056FF15CC6040006800010000BEB03F4000 56A3C4304000FF7508FF1510614000][Crunch/PE=55E8000000005D83ED068BC5556089AD::::::::2B85][Crunchv4.0=EB100000000000000000000000000000000055E8000000005D81ED180000008BC555609 C2B85E90600008985E1060000FF74242CE8BB0100000F8292050000E8F1030000490F888605 0000686CD9B29633C050E8240300008985D941000068EC497B7933C050E8110300008985D14 10000E867050000E95605000051525333C9498BD133C033DBAC32C18ACD8AEA8AD6B608 66D1EB66D1D87309663520836681F3B8EDFECE75EB33C833D34F75D5F7D2F7D15B8BC2 C1C010668BC15A59C36803020000E8800400000F82A8020000968B4424040FC88BD0250F0F 0F0F33D0C1C0080BC28BD0253333333333D0C1C0040BC28BD0255555555533D0C1C0020B C2][DEF v1.0=BE::0140006A0559807E070074118B46][Ding Boy's PE-lock v0.07=555756525153E8000000005D8BD581ED23354000][Ding Boy's PE-lock Phantasm v0.8=555756525153E8000000005D8BD581ED0D394000] [Ding Boy's PE-lock Phantasm v1.0 / v1.1=5557565251536681C3EB02EBFC6681C3EB02EBFC][Ding Boy's PE-lock Phantasm v1.5b3=9C5557565251539CFAE8000000005D81ED5B534000B0][EP v1.0=5083C0178BF09733C033C9B124ACAA86C4][EP v2.0=6A0060E901010000][ExE Shield vx.x=65786573686C2E646C6CC05D00][EXE Shield v1.7=EB0668901F0600C39C60E80200000033C08BC483C004938BE38B5BFC81EB3F90] [ExE Shield v2.7=EB0668F4860600C39C60E8020000][EXE Stealth v1.1=60E8000000005D81EDFB1D4000B97B0900008BF7AC][EXE Stealth v2.7=EB0060EB00E8000000005D81EDD32640][EXE Stealth v2.71=EB0060EB00E8000000005D81EDB02740][EXE Stealth v2.72=EB00EB2F536861726577617265202D20][EXE32Packv1.36=3BC074028183553BC074028183533BC97401BC::::::::0281::::::00::::003BDB7401BE5D 8BD581EDCC8D4000][EXE32Packv1.37=3BC074028183553BC074028183533BC97401BC::::::::0281::::::00::::003BDB7401BE5D 8BD581ED4C8E4000][EXE32Packv1.38=3BC074028183553BC074028183533BC97401BC::::::::0281::::::00::::003BDB7401BE5D 8BD581EDDC8D4000][EXE32Packv1.39=3BC074028183553BC074028183533BC97401BC::::::::0281::::::00::::003BDB7401BE5D 8BD581EDEC8D4000][EXE32Packv1.3x=3BC074028183553BC074028183533BC97401BC::::::::0281::::::00::::003BDB7401BE5D 8BD581ED][EXECryptor v1.3.0.45=E8240000008B4C240CC70117000100C78131C089411489411880A1] [EXECryptorv1.3.0.45=E8240000008B4C240CC70117000100C781::::::::::::::31C089411489411880A1] [EXECryptorv1.4.0.1=E8240000008B4C240CC70117000100C781B800000000::::0031C089411489411880] [EXEJoinerv1.0=68001040006804010000E83903000005001040C6005C68::::::::68::::::::6A00E8] [ExeSmasher=9CFE030060BE000041008DBE0010FFFF5783CDFFEB10][EZIP v1.0=E919320000E97C2A0000E919240000E9FF230000E91E2E0000E9882E0000E92C] [FSGv1.0=BBD0014000BF00104000BE::::::::53E80A00000002D275058A164612D2C3FCB280A46 A025B][FSGv1.2=4B45524E454C33322E646C6C00004C6F61644C69627261727941000047657450726F634 164647265737300::0000000000][FSGv1.3=BBD0014000BF00104000BE::::::::53E80A00000002D275058A164612D2C3B280A46A02 5BFF142473F733C9FF1424731833C0FF14247321B30241B010FF142412C073F9753FAAEBD CE8430000002BCB7510E838000000EB28ACD1E8744113C9EB1C9148C1E008ACE8220000003D007D0000730A80FC05730683F87F77024141958BC5B301568BF72BF0F3A45EEB9633C9 41FF54240413C9FF54240472F4C35F5B0FB73B4F74084F7413C1E70CEB078B7B025783C30 44343E952FFFFFF5FBB::::::::478B37AF57FF139533C0AE75FDFE0F74EFFE][FSG v1.31=BBD0014000BF00104000BE::::::::53BB::::::::B280A4B680FFD373F933C9] [FSG v1.33=BEA4014000AD93AD97AD5696B280A4B680FF1373][Feokt=8925A8114000BF::::::0031C0B9::::::0029F9FCF3AA:::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::E8::::0000BE::::4000BF][Gleam v1.00=::::::::::::::::::::::::::::::::::::::::::::::::83EC0C535657E8240200::::::::::::::::::::] [Guardant Stealth aka Novex Dongle=558BEC83C4F060E851FFFFFF][Inno Setup Module=496E6E6F53657475704C647257696E646F770000535441544943][Inno Setup Module=496E6E6F]类别:我也学破解| | 添加到搜藏| 分享到i贴吧| 浏览(652) | 评论(0) 上一篇:[转]今天再次学习司马相如和卓... 下一篇:PE文件入口地址(检测加壳信息的... 相关文章:•pe/elf 文件加壳时的处理•文件加壳与脱壳详解•欺骗文件检测工具,欺骗,加壳技术•什么是加壳文件•文件免杀之加壳与改入口点法•脱用UPX加壳的EXE及DLL文件之雕...最近读者:登录后,您就出现在这里。
PE文件格式
WORD e_crlc; // Relocations
WORD e_cparhdr; // Size of header in paragraphs
么正确的开始地址是0x401560。如果可执行程序调入0x100000处,则开始地址为0x101560。
因为PE文件的每一个段不必按同样的边界对齐方式调入,因此RVA地址的计算变得比较复
杂。例如,在文件中每一个段往往按512个字节的方式对齐,而在内存中可能以4096字节的方
式对齐。这方面的介绍可见下面的“SectionAlignment”、“FileAlignment”。举个例子,
typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header
WORD e_magic; // Magic number
WORD e_cblp; // Bytes on last page of file
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
三、文件头(File Header)
通过DOS头,你可以找到一个叫做IMAGE_FILE_HEADER的结构,如下;下面我分别介绍一
下。
typedef struct _IMAGE_FILE_HEADER {
中只有大约100个字节的代码,只输出一个诸如“this program needs windows NT ”之类的
信息。
你可以通过一个叫做IMAGE_DOS_HEADER的结构来识别一个合法的DOS头。这个结构的头两
个字节一定是“MZ”(#define IMAGE_DOS_SIGNATURE "MZ")。怎么才能找到PE开始的标志呢
pe文件修改
【转】PE文件的修改和感染2008-04-29 08:20既然已经能够搜索磁盘及网络共享文件中的所有文件,要实现寄生,那么自然下一步就是对搜索到的PE文件进行感染了。
感染PE的很重要的一个考虑就是将病毒代码写入到PE 文件的哪个位置。
读写文件一般利用Win32 API CreateFile、CreateFileMapping、MapViewOfFile等API以内存映射文件的方式进行,这样可以避免自己管理缓冲的麻烦,因而为较多病毒所采用。
为了能够读写具有只读属性的文件,病毒在操作前首先利用GetFileAttributes 获取其属性并保存,然后用SetFileAttributes将文件的属性修改为可写,在感染完毕后再恢复其属性值。
一般说来,有如下几种感染PE文件的方案供选择:a)添加一个新的节。
将病毒代码写入到新的节中,相应修改节表,文件头中文件大小等属性值。
由于在PE尾部增加了一个节,因此较容易被用户察觉。
在某些情况下,由于原PE头部没有足够的空间存放新增节的节表信息,因此还要对其它数据进行搬移等操作。
鉴于上述问题,PE 病毒使用该方法的并不多。
b)附加在最后一个节上。
修改最后一个节节表的大小和属性以及文件头中文件大小等属性值。
由于越来越多的杀毒软件采用了一种尾部扫描的方式,因此很多病毒还要在病毒代码之后附加随机数据以逃避该种扫描。
现代PE 病毒大量使用该种方式。
c)写入到PE文件头部未用空间各个节所保留的空隙之中。
PE 头部大小一般为1024 字节,有5-6 个节的普通PE文件实际被占用部分一般仅为600 字节左右,尚有400 多个字节的剩余空间可以利用。
PE文件各个节之间一般都是按照512 字节对齐的,但节中的实际数据常常未完全使用全部的512字节,PE文件的对齐设计本来是出于效率的考虑,但其留下的空隙却给病毒留下了栖身之地。
这种感染方式感染后原PE 文的总长度可能并不会增加,因此自CIH 病毒首次使用该技术以来,备受病毒作者的青睐。
yts-def文件
Def文件(模块定义文件)介绍模块定义(.def)文件为链接器提供有关被链接程序的导出、属性及其他方面的信息。
生成DLL 时,def 文件最有用。
由于存在可代替模块定义语句使用的链接器选项,通常不需要.def文件.也可以将__declspec(dllexport)用作指定导出函数的手段.在链接器阶段可以使用/DEF(指定模块定义文件)链接器选项调用.def文件。
如果生成的.exe 文件没有导出,使用.def文件将使输出文件较大并降低加载速度.模块定义语句的规则下列语法规则适用于.def文件中的所有语句.其他适用于特定语句的规则与各语句一起加以说明.语句、属性关键字和用户指定的标识符区分大小写.包含空格或分号(;)的长文件名必须用引号(")引起.使用一个或多个空格、制表符或换行符,将语句关键字同其参数分开和将各语句分开.指定参数的冒号(:)或等号(=)两旁有零个或多个空格、制表符或换行符.如果使用NAME 或LIBRARY 语句,则这些语句必须位于所有其他语句之前.在.def文件中,SECTIONS 和EXPORTS 语句可以出现多次.每个语句都可以采用多个规范,各规范间必须用一个或多个空格、制表符或换行符分开.语句关键字必须在第一个规范的前面出现一次,并且可以在每个附加规范的前面重复.许多语句都具有等效的LINK 命令行选项.有关其他详细信息,请参阅相应的LINK 选项说明..def 文件中的注释由每个注释行开始处的分号(;)指定.注释不能与语句共享一行,但可以在多行语句的规范间出现.(SECTIONS 和EXPORTS 为多行语句.)以十进制或十六进制为基础指定数值参数.如果字符串参数与保留字匹配,则必须用双引号(")将字符串参数引起.EXPORTSdefinitionsEXPORTS 语句引入了一个由一个或多个definitions(导出的函数或数据)组成的节.每个定义必须在单独一行上.EXPORTS 关键字可以在第一个定义所在的同一行上或在前一行上..def 文件可以包含一个或多个EXPORTS 语句.导出definitions 的语法为:entryname[=internalname] [@ordinal [NONAME]] [PRIV ATE] [DATA]entryname 是要导出的函数名或变量名.这是必选项.如果导出的名称与DLL 中的名称不同,则通过internalname 指定DLL 中导出的名称.例如,如果DLL 导出函数func1(),要将它用作func2(),则应指定:EXPORTSfunc2=func1@ordinal 允许指定是序号而不是函数名将进入DLL 的导出表.这有助于最小化DLL 的大小..LIB 文件将包含序号与函数之间的映射,这使您得以像通常在使用DLL 的项目中那样使用函数名.可选的NONAME 关键字允许只按序号导出,并减小结果DLL 中导出表的大小.但是,如果要在DLL 上使用GetProcAddress,则必须知道序号,因为名称将无效.可选的PRIV ATE 关键字禁止将entryname 放到由LINK 生成的导入库中.它对同样是由LINK 生成的图像中的导出无效.可选的DATA 关键字指定导出的是数据,而不是代码.例如,可以导出数据变量,如下所示:EXPORTSi DATA当对同一导出使用PRIV ATE 和DATA 时,PRIV ATE 必须位于DATA 的前面.有三种导出定义的方法,按照建议的使用顺序依次为:源代码中的__declspec(dllexport)关键字.def 文件中的EXPORTS 语句LINK 命令中的/EXPORT 规范所有这三种方法可以用在同一个程序中.LINK 在生成包含导出的程序时还创建导入库,除非生成中使用了.exp 文件.以下是EXPORTS 节的示例:EXPORTSDllCanUnloadNow @1 PRIV ATE DATADllWindowName = Name DATADllGetClassObject @4 NONAME PRIV ATEDllRegisterServer @7DllUnregisterServer注意,使用.def文件从DLL 中导出变量时,不需要在变量上指定__declspec(dllexport).但是,在任何使用DLL 的文件中,仍必须在数据声明上使用__declspec(dllimport).LIBRARY [library][BASE=address]该语句通知LINK 创建DLL.LINK 同时还创建导入库,除非生成中使用了.exp 文件.library 参数指定DLL 的名称.也可以使用/out 链接器选项指定DLL 输出名.BASE=address 参数设置操作系统用来加载DLL 的基址.该参数重写0x10000000 的默认DLL 位置.有关基址的详细信息,请参阅/BASE 选项说明.请记住,在生成DLL 时使用/DLL 链接器选项.SECTIONSdefinitionsSECTIONS 语句引入了一个由一个或多个definitions(关于项目输出文件各节的访问说明符)组成的节.每个定义必须在单独一行上.SECTIONS 关键字可以在第一个定义所在的同一行或前一行上..def 文件可以包含一个或多个SECTIONS 语句.该SECTIONS 语句为图像文件中的一节或多节设置属性,并可用于重写每种节类型的默认属性.definitions 的格式为:.section_name specifier此处,.section_name 为程序图像中的节名,specifier 为下列一个或多个访问修饰符:EXECUTEREADSHAREDWRITE用空格分开修饰符名.例如:SECTIONS.rdata READ WRITESECTIONS 标记definitions 节列表的开始位置.每个定义必须在单独一行上.SECTIONS 关键字可以在第一个定义所在的同一行或前一行上. .def 文件可以包含一个或多个SECTIONS 语句.支持SEGMENTS 关键字作为SECTIONS 的同义词.。
pe文件简单解释
IMAGE_FILE_LARGE_ADDRESS_AWARE = $0020; // App can handle >2gb addresses
IMAGE_FILE_BYTES_REVERSED_LO = $0080; // Bytes of machine word are reversed.
IMAGE_FILE_MACHINE_WCEMIPSV2 = $0169; // MIPS little-endian WCE v2
IMAGE_FILE_MACHINE_ALPHA = $0184; // Alpha_AXP
IMAGE_FILE_MACHINE_SH3 = $01a2; // SH3 little-endian
IMAGE_FILE_MACHINE_SH3E = $01a4; // SH3E little-endian
IMAGE_FILE_MACHINE_SH4 = $01a6; // SH4 little-endian
IMAGE_FILE_MACHINE_SH5 = $01a8; // SH5
IMAGE_FILE_MACHINE_MIPSFPU16 = $0466; // MIPS
// IMAGE_FILE_MACHINE_AXP64 IMAGE_FILE_MACHINE_ALPHA64
IMAGE_FILE_MACHINE_AMD64 = $0500; // AMD K8
IMAGE_FILE_MACHINE_TRICORE = $0520; // Infineon
// If Image is on removable media, copy and run from the swap file.
WindowsPE文件格式
WindowsPE⽂件格式在PE⽂件头之前理论Windows的PE(Portable Executable)⽂件有两个头,⼀个是是Windows头,⼀个是DOS头。
在⽂件的最开始会有⼀段DOS的EXE⽂件头,来说明这个程序不可以在DOS环境下运⾏。
我们需要在DOS头+3Ch处,会有⼀个4字节的指针指向windows头。
根据+3Ch处的值,定位到Windows⽂件头可以看到"PE"两个字节,Windows头就从此处开始。
这也就是Windows EXE⽂件经常被称为PE⽂件的原因。
实践1. 在xp环境下,⽤QuickView打开⼀个EXE⽂件,观察其头部。
在00h处有两个字节4D 5A表⽰这是⼀个DOS头。
在4Eh处,有⼀个字符串This program cannot be run in DOS mode. 表明这不是⼀个DOS⽂件在3C处,有⼀个四字节指针,其值为000000D0h,颜⾊标黄,指向windows头2. 查看⽂件地址D0处的值可以看到此处的两个字节为50 45即“PE”,表⽰这个EXE⽂件是⼀个PE⽂件,从这两个字节开始才是PE的⽂件头。
PE⽂件头背景知识要了解PE⽂件头的具体内容,我们需要对Windows的内存管理,⽂件存储有⼀定的了解。
接下来做简要的说明,想要了解更详细的内容可以去学习操作系统的相关知识。
Windows通过分段以及分页两种机制管理内存和实现进程的隔离及保护。
以下说明会涉及到⼀些寄存器和⽐较抽象的概念,不懂也没有关系。
只需要知道结论,*⼀个进程的虚拟地址会经过⼀些转换成为真正的物理地址. *进程之间的虚拟地址可以相同,但相同的虚拟地址会转化成不同的物理地址。
在Windows系统中,为了向下兼容,保留了分段(section)的的机制,但是CS,DS,SS这些段地址在GDT表中的值全部为0,所以经过分段后的逻辑地址(logical address)与线性地址(linear address)是完全⼀致的,在此处不⽤过多理会。
PE文件结构详解
PE文件结构详解1 摘要Windows NT 3.1引入了一种名为PE文件格式的新可执行文件格式。
PE文件格式的规范包含在了MSDN的CD中(Specs and Strategy, Specifications, Windows NT File Format Specifications),但是它非常之晦涩。
然而这一的文档并未提供足够的信息,所以开发者们无法很好地弄懂PE格式。
本文旨在解决这一问题,它会对整个的PE文件格式作一个十分彻底的解释,另外,本文中还带有对所有必需结构的描述以及示范如何使用这些信息的源码示例。
为了获得PE文件中所包含的重要信息,我编写了一个名为PEFILE.DLL的动态链接库,本文中所有出现的源码示例亦均摘自于此。
这个DLL和它的源代码都作为PEFile示例程序的一部分包含在了CD中(译注:示例程序请在MSDN中寻找,本站恕不提供),你可以在你自己的应用程序中使用这个DLL;同样,你亦可以依你所愿地使用并构建它的源码。
在本文末尾,你会找到PEFILE.DLL的函数导出列表和一个如何使用它们的说明。
我觉得你会发现这些函数会让你从容应付PE文件格式的。
2 介绍Windows操作系统家族最近增加的Windows NT为开发环境和应用程序本身带来了很大的改变,这之中一个最为重大的当属PE文件格式了。
新的PE文件格式主要来自于UNIX操作系统所通用的COFF规范,同时为了保证与旧版本MS-DOS及Windows操作系统的兼容,PE文件格式也保留了MS-DOS中那熟悉的MZ头部。
在本文之中,PE文件格式是以自顶而下的顺序解释的。
在你从头开始研究文件内容的过程之中,本文会详细讨论PE文件的每一个组成部分。
很多解决PE文件格式的工作和直接观看数据有关。
例如,要弄懂导入地址名称表是如何构成的,我就得同时查看.idata段头部、导入映像数据目录、可选头部以及当前的.idata段实体,而EXEVIEW.EXE就是查看这些信息的最佳示例。
PE格式详解
PE格式详解本文来自CSDN博客,转载请标明出处:/LewisCheng/archive/2008/08/29/2850567.aspx本系列主要是参考英文原本ARTeam的PE File Format Tutorial并加以注解,以最简洁的语言来阐述PE格式,帮助大家快速入门。
在开始之前,请确定您懂得C语言,至少是基本数据类型、数组和结构体,以及会WinHEX的基本使用方法。
任何错误都欢迎指出,感激不尽!(一)介绍PE 格式PE格式(Portable Executable,可移植可执行文件)是原生的Win32文件格式,任何的32位应用程序(Executable)包括.NET、动态链接库(DLL)、控件(OCX)以及控制面板程序(CPL)均为PE格式,其实NT内核ntoskrnl.exe也是PE格式。
我们研究PE格式的目的有:一是给应用程序添加代码功能,比如注册机代码注入(Keygen Injecton);二是手动给EXE脱壳。
现在很多程序都加“壳”,一来是减少映像文件尺寸,二来可以保护程序文件不被轻易修改。
被加壳的EXE一般它的输入表(import table)与数据区段(.data)都被加密过,并且被插入了一段脱壳的代码,当程序执行时会先执行这段代码给内存中的数据解密,接着会修复输入表和各个区段,然后再跳到原始入口点执行。
原文中使用的范例程序是delphi写的进制转换程序,本文中我使用的是VC9编写的一个很简单的数组求和程序,在debug模式下编译。
这并不影响我们学习PE格式。
首先两个概念,PE文件被加载器加载到内存后被称为一个模块(module),存储模块首地址的称为模块句柄(handle of module),简写为HMODULE。
然后我们看一下PE格式的总体结构(这张图MS已经遍布全球了):PICTURE MISSING前4块我们后面会细讲,就区段来说(Section),一个PE文件至少要有2个区段,代码区段用来存储程序代码,以及数据区段用来存储各种数据。
PE文件格式(内容详细)
简介
在DOS环境下有四种基本的可执行文件格式
批处理文件,以.BAT结尾的文件
设备驱动文件,是以.SYS结尾的文件,如CONFIG.SYS
COM文件,是以.COM结尾的纯代码文件
• 没有文件头部分,缺省情况下总是从0x100H处开始执行, 没有重定位项,所有代码和数据必须控制在64K以内
在Win32位平台可执行文件格式:可移植的可执行文件 (Portable Executable File)格式,即PE格式。MZ文件头 之后是一个以“PE”开始的文件头
安装在硬盘上的程序没运行-静态 加载到内存-动态
EXE文件的格式
MZ文件格式-Mark Zbikowski
.EXE文件由三部分构成:文件头、重定位表和二进制代码 允许代码、数据、堆栈分别处于不同的段,每一段都可以是64KB.
EXE文件的格式
PE文件格式
一般来说,病毒往往先于HOST程序获得控制权。运行 Win32病毒的一般流程示意如下:
①用户点击或系统自动运行HOST程序; ②装载HOST程序到内存;
③通过PE文件中的AddressOfEntryPoint+ImageBase,
定位第一条语句的位置(程序入口); ④从第一条语句开始执行(这时执行的其实是病毒代码); ⑤病毒主体代码执行完毕,将控制权交给HOST程序原来的
病毒通过“MZ”、“PE”这两个标志,初步判断当前程序 是否是目标文件——PE文件。如果要精确校验指定文件是 否为一有效PE文件,则可以检验PE文件格式里的各个数 据结构,或者仅校验一些关键数据结构。大多数情况下, 没有必要校验文件里的每一个数据结构,只要一些关键数 据结构有效,就可以认为是有效的PE文件
PE的意思就是Portable Executable(可移植、可执 行),它是Win32可执行文件的标准格式
PE文件详解1——PE文件头部解析
PE⽂件详解1——PE⽂件头部解析参考书籍:《WindowsPE⽂件权威指南》MSDN中winnt.h是PE⽂件定义的最终决定者。
EXE⽂件与DLL⽂件之间的区别完全是语义上的,⼆者PE结构完全相同。
唯⼀区别⽤⼀个字段标⽰处这个⽂件是exe还是dll。
许多DLL扩展,如OCX控件,控制⾯板等都是DLL,它们有⼀样的实体。
64位的Windows只是对PE格式做了⼀些简单的修饰,新格式叫PE32+。
没有新的结构加进去,其余的改变只是简单地将以前的32位字段扩展为64位字段。
1.PE⽂件基本结构:PE⽂件的头分为DOS头、NT头、节头。
注意,这是本⼈的分法。
这样分法会更加合理,更易理解。
因为这三个部分正好构成SizeOfHeaders所指的范围,所以将它们合为“头”。
2.⽂件头2.1 DOS头⽤记事本打开任何⼀个镜像⽂件,其头2个字节必为字符串“MZ”,这是Mark Zbikowski的姓名缩写,他是最初的MS-DOS设计者之⼀。
然后是⼀些在MS-DOS下的⼀些参数,这些参数是在MS-DOS下运⾏该程序时要⽤到的。
在这些参数的末尾也就是⽂件的偏移0x3C(第60字节)处是是⼀个4字节的PE⽂件签名的偏移地址。
该地址有⼀个专⽤名称叫做“E_lfanew”。
这个签名是“PE00”(字母“P”和“E”后跟着两个空字节)。
紧跟着E_lfanew的是⼀个MS-DOS程序。
那是⼀个运⾏于MS-DOS下的合法应⽤程序。
当可执⾏⽂件(⼀般指exe、com⽂件)运⾏于MS-DOS下时,这个程序显⽰“This program cannot be run in DOS mode(此程序不能在DOS模式下运⾏)”这条消息。
⽤户也可以⾃⼰更改该程序,有些还原软件就是这么⼲的。
同时,有些程序既能运⾏于DOS⼜能运⾏于Windows下就是这个原因。
Notepad.exe整个DOS头⼤⼩为224个字节,⼤部分不能在DOS下运⾏的Win32⽂件都是这个值。
pe文件
A.
谢谢观看
Hale Waihona Puke pe文件可移植的可执行的文件
01 定义
03 PE首部
目录
02 相关概念 04 文件格式
PE文件的全称是Portable Executable,意为可移植的可执行的文件,常见的EXE、DLL、OCX、SYS、COM都 是PE文件,PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL)
定义
一个操作系统的可执行文件格式在很多方面是这个系统的一面镜子。虽然学习一个可执行文件格式通常不是 一个程序员的首要任务,但是你可以从这其中学到大量的知识。在这篇文章中,我会给出 Microsoft的所有基于 win32系统(如winnt,win9x)的可移植可执行(PE)文件格式的详细介绍。在可预知的未来,包括Windows2000, PE文件格式在 MicroSoft的操作系统中扮演一个重要的角色。如果你在使用 Win32或 Winnt,那么你已经在使 用 PE文件了。甚至你只是在 Windows3.1下使用 Visual C++编程,你使用的仍然是 PE文件(Visual C++的 32位MS-DOS扩展组件用这个格式)。简而言之,PE格式已经普遍应用,并且在不短的将来仍是不可避免的。
和微软的其它可执行格式一样,你可以通过查找它的起始偏移来得到真实首部,这个偏移放在DOS残留首部 中。WINNT.H头文件包含了DOS残留程序的数据结构定义,使得很容易找到PE首部的起始位置。e_lfanew域是PE 真实首部的偏移。为了得到PE首部在内存中的指针,只需要把这个值加到映像的基址上即可。
线程局部变量
我最后不会让你盯住无穷无尽的十六进制Dump,也不会详细讨论页面的每一个单独的位的重要性。代替的, 我会向你介绍包含在 PE文件中的概念,并且将他们和你每天都遇到的东西联系起来。比如,线程局部变量的概 念,如下所述:
PE文件各区段说明
PE文件各节所包含的内容2008-11-13 13:34关于 sections 的意义以及它如何定位,相信你已有个概念。
现在我们要看看在EXE 和OBJ 档中的一些常见的 sections 。
虽然我所列的并不是全部,但已经涵盖了你每天会接触到(但也许你自己并不知道)的 sections 。
排列次序是根据其重要性以及遭遇它们的频繁度。
.text section.text 内含所有一般性的程序代码。
由于 PE 文件在 32 位模式下跑,并且不受约束于 16 位元节区,所以没有理由把程序代码分开放到不同的 sections 中。
联结器把所有来自 .OBJ的 .text 集合到一个大的 .text 中。
如果你使用Borland C++,其编译器制作出来的 code section 名为 CODE 而不是 .text 。
请看稍后「Borland CODE 以及 .icode sections 」一节。
我很惊讶地发现,在 .text 中除了编译器制作出来的码,以及runtime library 的码之外,还有一些其它东西。
在 PE 文件中,当你呼叫另一模块中的函数(例如USER32.DLL 中的 GetMessage ),编译器制造出来的 CALL 指令并不会把控制权直接传给 DLL 中的函数,而是传给一个JMP DWORD PTR [XXXXXXXX]指令,后者也位于 .text 中。
JMP 指令跳到一个地址去,此地址储存在 .idata 的一个 DWORD 之中。
这个DWORD 内含该函数的真正地址(函数进入点),如图8-4 所示。
图8-4 一个 PE 档呼叫 imported function 。
沉思良久,我终于了解为什么 DLL 的呼叫需要以这种方式实现。
把对同一个DLL 函数的所有呼叫都集中到一处,加载器就不再需要修补每一个呼叫 DLL 的指令。
PE 加载器需要做的,就只是把 DLL 函数的真实地址放到 .idata 的那个 DWORD 之中,根本就没有程序代码需要修补。
非托管PE文件资源结构剖析
非托管PE文件资源结构剖析摘要简单介绍了pe文件的结构,介绍了怎样从pe中找到资源块,详细介绍了资源的三层结构,以及三层结构里面的一些细节。
关键词 pe文件;资源段;资源结构中图分类号g210 文献标识码a 文章编号1674-6708(2011)54-0178-011 pe文件结构简介pe(portable executable)文件是windows操作系统上的程序文件,常见的exe、dll、sys等都是pe文件。
pe文件有固定的结构,pe文件的结构如图1,所有pe文件都是由ms-dos文件头,ms-dos stub,pe文件头,段表,以及一组段体组成。
段体包括代码段、数据段、输入表段、输出表段,以及资源段等。
ms-dos文件头ms-dos stub pe文件头段表代码段数据段资源段输入表输出表…图1 pe文件结构图资源段是段表下的某个段。
我们可以通过ms-dos文件头,pe文件头和段表的数据找到资源段的位置。
2找到pe文件资源段可以通过下面的步骤来查找pe资源段。
1)根据ms-dos文件头结构的成员e_lfanew,得到pe文件头在文件中的位置;2)确定pe件头在文件中的位置之后,就可以确定peheader 中的成员fileheader 和成员optionalheader 在文件中的位置。
根据 fileheader中的成员numberofsections 的值,就可以确定文件中段的数目,也就是段表数组中元素的个数;3)pe header 在文件中的位置加上pe header 结构的大小就可以得到段表在文件中的开始位置;4)取得pe header 中的optional header 中的datadirectory 数组中的第三项的成员virtualaddress 的值,这个值就是在内存中资源段的rva。
然后根据段的数目,遍历段表数组。
找到其中成员virtualaddress 等于上面求得的rva的数组项,该数组项就是资源段的段表,其成员pointertorawdata 就是资源段在文件中的位置。
PE文件结构
PE文件结构总体层次分布
· DOS MZ Header
所有 PE文件(甚至32位的DLLs)必须以简单的DOS MZ header开始,它是一个IMAGE_DOS_HEADER结构。有了它,一 旦程序在DOS下执行,DOS就能识别出这是有效的执行体,然后运行紧随MZ Header之后的DOS Stub。
PE文件格式要用到RVA,主要是为了减少PE装载器的负担。因为每个模块都有可能被重载到任何虚拟地址空间,如果让PE 装载器修正每个重定位项,这肯定是个梦魇。相反,如果所有重定位项都使用RVA,那么PE装载器就不必操心那些东西了, 即 它只要将整个模块重定位到新的起始VA。这就像相对路径和绝对路径的概念:RVA类似相对路径,VA就像绝对路径。
2.2.1 PE文件结构布局 找到文件中某一结构信息有两种定位方法。第一种是通过链表方法,对于这种方法,数据在文件的存放位置比较自由。第二种 方法是采用紧凑或固定位置存放,这种方法要求数据结构大小固定,它在文件中的存放位置也相对固定。在PE文件结构中同 时采用以上两种方法。
因为在PE文件头中的每个数据结构大小是固定的,因此能够编写计算程序来确定某一个PE文件中的某个参数值。在编写程序 时,所用到的数据结构定义,包括数据结构中变量类型、变量位置和变量数组大小都必须采用Windows提供的原型。图2.1所 示的PE文件结构的总体层次分布如下:
PE文件结构详解
NumberOfSections:该PE文件中有多少个节,也就是节表中的项数。 TimeDateStamp:PE文件的创建时间,一般有连接器填写。 PointerToSymbolTable:COFF文件符号表在文件中的偏移。 NumberOfSymbols:符号表的数量。 SizeOfOptionalHeader:紧随其后的可选头的大小。 Characteristics:可执行文件的属性,可以是下面这些值按位相或。
这里写图片描述
这种表示方式叫做虚拟地址(VA)。也许有人要问,既然有VA这么简单的表示方式为什么还要有前面的 RVA呢?因为虽然PE文件为自己指定加载的基地址,但是windows有茫茫多的DLL,而且每个软件也有自己 的DLL,如果指定的地址已经被别的DLL占了怎么办?如果PE文件无法加载到预期的地址,那么系统会帮 他重新选择一个合适的基地址将他加载到此处,这时原有的VA就全部失效了,NT头保存了PE文件加载所需 的信息,在不知道PE会加载到哪个基地址之前,VA是无效的,所以在PE文件头中大部分是使用RVA来表示 地址的,而在代码中是用VA表示全局变量和函数地址的。那又有人要问了,既然加载基址变了以后VA都失 效了,那存在于代码中的那些VA怎么办呢?答案是:重定位。系统有自己的办法修正这些值,到后续重定 位表的文章中会详细描述。既然有重定位,为什么NT头不能依靠重定位采用VA表示地址呢(十万个为什 么)?因为不是所有的PE都有重定位,早期的EXE就是没有重定位的。我们都知道PE文件可以导出函数让 其他的PE文件使用,也可以从其他PE文件导入函数,这些是如何做到的?PE文件通过导出表指明自己导 出那些函数,通过导入表指明需要从哪些模块导入哪些函数。导入和导出表的具体结构会在单独的文章中 详细解释。
PE文件各区段说明
PE文件各节所包含的内容2008-11-13 13:34关于 sections 的意义以及它如何定位,相信你已有个概念。
现在我们要看看在EXE 和OBJ 档中的一些常见的 sections 。
虽然我所列的并不是全部,但已经涵盖了你每天会接触到(但也许你自己并不知道)的 sections 。
排列次序是根据其重要性以及遭遇它们的频繁度。
.text section.text 内含所有一般性的程序代码。
由于 PE 文件在 32 位模式下跑,并且不受约束于 16 位元节区,所以没有理由把程序代码分开放到不同的 sections 中。
联结器把所有来自 .OBJ的 .text 集合到一个大的 .text 中。
如果你使用Borland C++,其编译器制作出来的 code section 名为 CODE 而不是 .text 。
请看稍后「Borland CODE 以及 .icode sections 」一节。
我很惊讶地发现,在 .text 中除了编译器制作出来的码,以及runtime library 的码之外,还有一些其它东西。
在 PE 文件中,当你呼叫另一模块中的函数(例如USER32.DLL 中的 GetMessage ),编译器制造出来的 CALL 指令并不会把控制权直接传给 DLL 中的函数,而是传给一个JMP DWORD PTR [XXXXXXXX]指令,后者也位于 .text 中。
JMP 指令跳到一个地址去,此地址储存在 .idata 的一个 DWORD 之中。
这个DWORD 内含该函数的真正地址(函数进入点),如图8-4 所示。
图8-4 一个 PE 档呼叫 imported function 。
沉思良久,我终于了解为什么 DLL 的呼叫需要以这种方式实现。
把对同一个DLL 函数的所有呼叫都集中到一处,加载器就不再需要修补每一个呼叫 DLL 的指令。
PE 加载器需要做的,就只是把 DLL 函数的真实地址放到 .idata 的那个 DWORD 之中,根本就没有程序代码需要修补。