PE文件格式详解(1)

PE文件格式详解 本文描述了Windows系统的PE文件格式。 阅读详情

作者:MSDN
译者:李马 (http://home.nuc.edu.cn/~titilima

)

摘要

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文件格式的。

介绍

   Windows操作系统家族最近增加的Windows NT为开发环境和应用程序本身带来了很大的改变,这之中一个最为重大的当属PE文件格式了。新的PE文件格式主要来自于UNIX操作系统所通用的COFF规范,同时为了保证与旧版本MS-DOS及Windows操作系统的兼容,PE文件格式也保留了MS-DOS中那熟悉的MZ头部。
   在本文之中,PE文件格式是以自顶而下的顺序解释的。在你从头开始研究文件内容的过程之中,本文会详细讨论PE文件的每一个组成部分。
   许多单独的文件成分定义都来自于Microsoft Win32 SDK开发包中的WINNT.H文件,在这个文件中你会发现用来描述文件头部和数据目录等各种成分的结构类型定义。但是,在WINNT.H中缺少对PE文件结构足够的定义,在这种情况下,我定义了自己的结构来存取文件数据。你会在PEFILE.DLL工程的PEFILE.H中找到这些结构的定义,整套的PEFILE.H开发文件包含在PEFile示例程序之中。
   本文配套的示例程序除了PEFILE.DLL示例代码之外,还有一个单独的Win32示例应用程序,名为EXEVIEW.EXE。创建这一示例目的有二:首先,我需要测试PEFILE.DLL的函数,并且某些情况要求我同时查看多个文件;其次,很多解决PE文件格式的工作和直接观看数据有关。例如,要弄懂导入地址名称表是如何构成的,我就得同时查看.idata段头部、导入映像数据目录、可选头部以及当前的.idata段实体,而EXEVIEW.EXE就是查看这些信息的最佳示例。
   闲话少叙,让我们开始吧。

PE文件结构

   PE文件格式被组织为一个线性的数据流,它由一个MS-DOS头部开始,接着是一个是模式的程序残余以及一个PE文件标志,这之后紧接着PE文件头和可选头部。这些之后是所有的段头部,段头部之后跟随着所有的段实体。文件的结束处是一些其它的区域,其中是一些混杂的信息,包括重分配信息、符号表信息、行号信息以及字串表数据。我将所有这些成分列于图1。

图1.PE文件映像结构
   从MS-DOS文件头结构开始,我将按照PE文件格式各成分的出现顺序依次对其进行讨论,并且讨论的大部分是以示例代码为基础来示范如何获得文件的信息的。所有的源码均摘自PEFILE.DLL模块的PEFILE.C文件。这些示例都利用了Windows NT最酷的特色之一——内存映射文件,这一特色允许用户使用一个简单的指针来存取文件中所包含的数据,因此所有的示例都使用了内存映射文件来存取PE文件中的数据。
   注意:请查阅本文末尾关于如何使用PEFILE.DLL的那一段。

MS-DOS头部/实模式头部

   如上所述,PE文件格式的第一个组成部分是MS-DOS头部。在PE文件格式中,它并非一个新概念,因为它与MS-DOS 2.0以来就已有的MS-DOS头部是完全一样的。保留这个相同结构的最主要原因是,当你尝试在Windows 3.1以下或MS-DOS 2.0以上的系统下装载一个文件的时候,操作系统能够读取这个文件并明白它是和当前系统不相兼容的。换句话说,当你在MS-DOS 6.0下运行一个Windows NT可执行文件时,你会得到这样一条消息:“This program cannot be run in DOS mode.”如果MS-DOS头部不是作为PE文件格式的第一部分的话,操作系统装载文件的时候就会失败,并提供一些完全没用的信息,例如:“The name specified is not recognized as an internal or external command, operable program or batch file.”
   MS-DOS头部占据了PE文件的头64个字节,描述它内容的结构如下: //WINNT.Htypedef struct _IMAGE_DOS_HEADER { // DOS的.EXE头部  USHORT e_magic; // 魔术数字  USHORT e_cblp; // 文件最后页的字节数  USHORT e_cp; // 文件页数  USHORT e_crlc; // 重定义元素个数  USHORT e_cparhdr; // 头部尺寸,以段落为单位  USHORT e_minalloc; // 所需的最小附加段  USHORT e_maxalloc; // 所需的最大附加段  USHORT e_ss; // 初始的SS值(相对偏移量)  USHORT e_sp; // 初始的SP值  USHORT e_csum; // 校验和  USHORT e_ip; // 初始的IP值  USHORT e_cs; // 初始的CS值(相对偏移量)  USHORT e_lfarlc; // 重分配表文件地址  USHORT e_ovno; // 覆盖号  USHORT e_res[4]; // 保留字  USHORT e_oemid; // OEM标识符(相对e_oeminfo)  USHORT e_oeminfo; // OEM信息  USHORT e_res2[10]; // 保留字  LONG e_lfanew; // 新exe头部的文件地址} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
第一个域e_magic,被称为魔术数字,它被用于表示一个MS-DOS兼容的文件类型。所有MS-DOS兼容的可执行文件都将这个值设为0x5A4D,表示ASCII字符MZ。MS-DOS头部之所以有的时候被称为MZ头部,就是这个缘故。还有许多其它的域对于MS-DOS操作系统来说都有用,但是对于Windows NT来说,这个结构中只有一个有用的域——最后一个域e_lfnew,一个4字节的文件偏移量,PE文件头部就是由它定位的。对于Windows NT的PE文件来说,PE文件头部是紧跟在MS-DOS头部和实模式程序残余之后的。

实模式残余程序

   实模式残余程序是一个在装载时能够被MS-DOS运行的实际程序。对于一个MS-DOS的可执行映像文件,应用程序就是从这里执行的。对于Windows、OS/2、Windows NT这些操作系统来说,MS-DOS残余程序就代替了主程序的位置被放在这里。这种残余程序通常什么也不做,而只是输出一行文本,例如:“This program requires Microsoft Windows v3.1 or greater.”当然,用户可以在此放入任何的残余程序,这就意味着你可能经常看到像这样的东西:“You can''t run a Windows NT application on OS/2, it''s simply not possible.”
   当为Windows 3.1构建一个应用程序的时候,链接器将向你的可执行文件中链接一个名为WINSTUB.EXE的默认残余程序。你可以用一个基于MS-DOS的有效程序取代WINSTUB,并且用STUB模块定义语句指示链接器,这样就能够取代链接器的默认行为。为Windows NT开发的应用程序可以通过使用-STUB:链接器选项来实现。

PE文件头部与标志

   PE文件头部是由MS-DOS头部的e_lfanew域定位的,这个域只是给出了文件的偏移量,所以要确定PE头部的实际内存映射地址,就需要添加文件的内存映射基地址。例如,以下的宏是包含在PEFILE.H源文件之中的:
//PEFILE.H#define NTSIGNATURE(a) ((LPVOID)((BYTE *)a + /                       ((PIMAGE_DOS_HEADER)a)->e_lfanew))
在处理PE文件信息的时候,我发现文件之中有些位置需要经常查阅。既然这些位置仅仅是对文件的偏移量,那么用宏来实现这些定位就比较容易,因为它们较之函数有更好的表现。
   请注意这个宏所获得的是PE文件标志,而并非PE文件头部的偏移量。那是由于自Windows与OS/2的可执行文件开始,.EXE文件都被赋予了目标操作系统的标志。对于Windows NT的PE文件格式而言,这一标志在PE文件头部结构之前。在Windows和OS/2的某些版本中,这一标志是文件头的第一个字。同样,对于PE文件格式,Windows NT使用了一个DWORD值。
   以上的宏返回了文件标志的偏移量,而不管它是哪种类型的可执行文件。所以,文件头部是在DWORD标志之后,还是在WORD标志处,是由这个标志是否Windows NT文件标志所决定的。要解决这个问题,我编写了ImageFileType函数(如下),它返回了映像文件的类型:
//PEFILE.CDWORD WINAPI ImageFileType (LPVOID lpFile){  /* 首先出现的是DOS文件标志 */  if (*(USHORT *)lpFile == IMAGE_DOS_SIGNATURE)  {    /* 由DOS头部决定PE文件头部的位置 */    if (LOWORD (*(DWORD *)NTSIGNATURE (lpFile)) ==        IMAGE_OS2_SIGNATURE ||        LOWORD (*(DWORD *)NTSIGNATURE (lpFile)) ==        IMAGE_OS2_SIGNATURE_LE)      return (DWORD)LOWORD(*(DWORD *)NTSIGNATURE (lpFile));    else if (*(DWORD *)NTSIGNATURE (lpFile) ==      IMAGE_NT_SIGNATURE)    return IMAGE_NT_SIGNATURE;    else      return IMAGE_DOS_SIGNATURE;  }  else    /* 不明文件种类 */    return 0;}
以上列出的代码立即告诉了你NTSIGNATURE宏有多么有用。对于比较不同文件类型并且返回一个适当的文件种类来说,这个宏就会使这两件事变得非常简单。WINNT.H之中定义的四种不同文件类型有: //WINNT.H#define IMAGE_DOS_SIGNATURE 0x5A4D // MZ#define IMAGE_OS2_SIGNATURE 0x454E // NE#define IMAGE_OS2_SIGNATURE_LE 0x454C // LE#define IMAGE_NT_SIGNATURE 0x00004550 // PE00  
首先,Windows的可执行文件类型没有出现在这一列表中,这一点看起来很奇怪。但是,在稍微研究一下之后,就能得到原因了:除了操作系统版本规范的不同之外,Windows的可执行文件和OS/2的可执行文件实在没有什么区别。这两个操作系统拥有相同的可执行文件结构。
   现在把我们的注意力转向Windows NT PE文件格式,我们会发现只要我们得到了文件标志的位置,PE文件之后就会有4个字节相跟随。下一个宏标识了PE文件的头部: //PEFILE.C#define PEFHDROFFSET(a) ((LPVOID)((BYTE *)a + /                        ((PIMAGE_DOS_HEADER)a)->e_lfanew + /                        SIZE_OF_NT_SIGNATURE))  
这个宏与上一个宏的唯一不同是这个宏加入了一个常量SIZE_OF_NT_SIGNATURE。不幸的是,这个常量并未定义在WINNT.H之中,于是我将它定义在了PEFILE.H中,它是一个DWORD的大小。
   既然我们知道了PE文件头的位置,那么就可以检查头部的数据了。我们只需要把这个位置赋值给一个结构,如下: PIMAGE_FILE_HEADER pfh;pfh = (PIMAGE_FILE_HEADER)PEFHDROFFSET(lpFile);
在这个例子中,lpFile表示一个指向可执行文件内存映像基地址的指针,这就显出了内存映射文件的好处:不需要执行文件的I/O,只需使用指针pfh就能存取文件中的信息。PE文件头结构被定义为: //WINNT.Htypedef struct _IMAGE_FILE_HEADER {  USHORT Machine;  USHORT NumberOfSections;  ULONG TimeDateStamp;  ULONG PointerToSymbolTable;  ULONG NumberOfSymbols;  USHORT SizeOfOptionalHeader;  USHORT Characteristics;} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;#define IMAGE_SIZEOF_FILE_HEADER 20
请注意这个文件头部的大小已经定义在这个包含文件之中了,这样一来,想要得到这个结构的大小就很方便了。但是我觉得对结构本身使用sizeof运算符(译注:原文为“function”)更简单一些,因为这样的话我就不必记住这个常量的名字IMAGE_SIZEOF_FILE_HEADER,而只需要记住结构IMAGE_FILE_HEADER的名字就可以了。另一方面,记住所有结构的名字已经够有挑战性的了,尤其在是这些结构只有WINNT.H中才有的情况下。
   PE文件中的信息基本上是一些高级信息,这些信息是被操作系统或者应用程序用来决定如何处理这个文件的。第一个域是用来表示这个可执行文件被构建的目标机器种类,例如DEC(R) Alpha、MIPS R4000、Intel(R) x86或一些其它处理器。系统使用这一信息来在读取这个文件的其它数据之前决定如何处理它。
   Characteristics域表示了文件的一些特征。比如对于一个可执行文件而言,分离调试文件是如何操作的。调试器通常使用的方法是将调试信息从PE文件中分离,并保存到一个调试文件(.DBG)中。要这么做的话,调试器需要了解是否要在一个单独的文件中寻找调试信息,以及这个文件是否已经将调试信息分离了。我们可以通过深入可执行文件并寻找调试信息的方法来完成这一工作。要使调试器不在文件中查找的话,就需要用到IMAGE_FILE_DEBUG_STRIPPED这个特征,它表示文件的调试信息是否已经被分离了。这样一来,调试器可以通过快速查看PE文件的头部的方法来决定文件中是否存在着调试信息。
   WINNT.H定义了若干其它表示文件头信息的标记,就和以上的例子差不多。我把研究这些标记的事情留给读者作为练习,由你们来看看它们是不是很有趣,这些标记位于WINNT.H中的IMAGE_FILE_HEADER结构之后。
   PE文件头结构中另一个有用的入口是NumberOfSections域,它表示如果你要方便地提取文件信息的话,就需要了解多少个段——更明确一点来说,有多少个段头部和多少个段实体。每一个段头部和段实体都在文件中连续地排列着,所以要决定段头部和段实体在哪里结束的话,段的数目是必需的。以下的函数从PE文件头中提取了段的数目: PEFILE.Cint WINAPI NumOfSections(LPVOID lpFile){  /* 文件头部中所表示出的段数目 */  return (int)((PIMAGE_FILE_HEADER)    PEFHDROFFSET (lpFile))->NumberOfSections);}
如你所见,PEFHDROFFSET以及其它宏用起来非常方便。

PE可选头部

   PE可执行文件中接下来的224个字节组成了PE可选头部。虽然它的名字是“可选头部”,但是请确信:这个头部并非“可选”,而是“必需”的。OPTHDROFFSET宏可以获得指向可选头部的指针: //PEFILE.H#define OPTHDROFFSET(a) ((LPVOID)((BYTE *)a + /                        ((PIMAGE_DOS_HEADER)a)->e_lfanew + /                        SIZE_OF_NT_SIGNATURE + /                        sizeof(IMAGE_FILE_HEADER)))  
可选头部包含了很多关于可执行映像的重要信息,例如初始的堆栈大小、程序入口点的位置、首选基地址、操作系统版本、段对齐的信息等等。IMAGE_OPTIONAL_HEADER结构如下: //WINNT.Htypedef struct _IMAGE_OPTIONAL_HEADER {  //  // 标准域  //  USHORT Magic;  UCHAR MajorLinkerVersion;  UCHAR MinorLinkerVersion;  ULONG SizeOfCode;  ULONG SizeOfInitializedData;  ULONG SizeOfUninitializedData;  ULONG AddressOfEntryPoint;  ULONG BaseOfCode;  ULONG BaseOfData;  //  // NT附加域  //  ULONG ImageBase;  ULONG SectionAlignment;  ULONG FileAlignment;  USHORT MajorOperatingSystemVersion;  USHORT MinorOperatingSystemVersion;  USHORT MajorImageVersion;  USHORT MinorImageVersion;  USHORT MajorSubsystemVersion;  USHORT MinorSubsystemVersion;  ULONG Reserved1;  ULONG SizeOfImage;  ULONG SizeOfHeaders;  ULONG CheckSum;  USHORT Subsystem;  USHORT DllCharacteristics;  ULONG SizeOfStackReserve;  ULONG SizeOfStackCommit;  ULONG SizeOfHeapReserve;  ULONG SizeOfHeapCommit;  ULONG LoaderFlags;  ULONG NumberOfRvaAndSizes;  IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;
如你所见,这个结构中所列出的域实在是冗长得过分。为了不让你对所有这些域感到厌烦,我会仅仅讨论有用的——就是说,对于探究PE文件格式而言有用的。

标准域

   首先,请注意这个结构被划分为“标准域”和“NT附加域”。所谓标准域,就是和UNIX可执行文件的COFF格式所公共的部分。虽然标准域保留了COFF中定义的名字,但是Windows NT仍然将它们用作了不同的目的——尽管换个名字更好一些。
   ·Magic。我不知道这个域是干什么的,对于示例程序EXEVIEW.EXE示例程序而言,这个值是0x010B或267(译注:0x010B为.EXE,0x0107为ROM映像,这个信息我是从eXeScope上得来的)。
   ·MajorLinkerVersion、MinorLinkerVersion。表示链接此映像的链接器版本。随Window NT build 438配套的Windows NT SDK包含的链接器版本是2.39(十六进制为2.27)。
   ·SizeOfCode。可执行代码尺寸。
   ·SizeOfInitializedData。已初始化的数据尺寸。
   ·SizeOfUninitializedData。未初始化的数据尺寸。
   ·AddressOfEntryPoint。在标准域中,AddressOfEntryPoint域是对PE文件格式来说最为有趣的了。这个域表示应用程序入口点的位置。并且,对于系统黑客来说,这个位置就是导入地址表(IAT)的末尾。以下的函数示范了如何从可选头部获得Windows NT可执行映像的入口点。 //PEFILE.CLPVOID WINAPI GetModuleEntryPoint(LPVOID lpFile){  PIMAGE_OPTIONAL_HEADER poh;  poh = (PIMAGE_OPTIONAL_HEADER)OPTHDROFFSET(lpFile);  if (poh != NULL)    return (LPVOID)poh->AddressOfEntryPoint;  else    return NULL;}
·BaseOfCode。已载入映像的代码(“.text”段)的相对偏移量。
   ·BaseOfData。已载入映像的未初始化数据(“.bss”段)的相对偏移量。
初步了解PE文件格式(上) 今天这篇博客只对PE文件进行大致的分析,使用一个例子并结合一个简单的PE文件格式图来说明PE文件格式。 阅读详情

相关推荐

[系统安全] PE文件格式详解1

PE文件格式是微软Windows NT内核系列系统和 Win32子集中可执行的二进制文件格式。这种文件格式是微软基于COFF 文件格式的设计思想设计的。 COFF (Common Object File Format,通用目标文件格式)是应用于数种 UNIX系统中的目标文件和可执行文件的格式。 对应的,在linux下的可执行文件格式采用ELF(Executable and Linkable Format)。 MS-DOS头、DOS Sub MS-DOS头存在于每个PE文件中,它的存在完全是出于兼容性的考虑。

H4ppyD0g的博客 3467

1-PE文件格式详解

Windows下PE文件结构详解

weixin_40332490的博客 1248

易语言编译PE文件格式详解与实践

PE(Portable Executable)文件格式是Windows操作系统中用于可执行文件、目标代码、DLL(动态链接库)等的标准格式。它是一种高级的执行文件格式,为Windows提供了丰富的结构化信息,这些信息对于系统的加载和执行过程至关重要。本章旨在提供PE文件格式的基本概念、结构及重要组成,帮助读者建立对PE文件格式的初步认识。PE文件格式从结构上来看,可以划分为几个主要部分:DOS头、PE签名、COFF文件头、可选头、节表以及节数据。

weixin_42610010的博客 1089

PE文件格式详解(1)

PE头由许多结构体组成,接下来分别解释一下各部分。 1.DOS头     微软最初创建PE格式的时候,DOS文件被人们广泛的使用,为了实现PE文件对DOS文件的兼容性。结果是在PE头的最前面添加了一个IMAGE_DOS_HEADER结构体,用来扩展已有的DOS EXE头。 代码IMAGE_DOS_HEADER结构体 typedef strucet _IMAGE_DOS_HEA

Crystal_Atom 2683

基于小波变换的信号降噪处理及仿真研究_信号处理方法推荐--1(转载自用,侵删)...

综述作者:aresmiki链接:https://www.zhihu.com/question/23701194/answer/167005497来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。非平稳信号处理应该是现在信号处理技术最新的也是最热的研究方向了,信号处理方法从最早的时域统计到傅里叶变换的频域分析,是人们认识信号本质的一次巨大飞跃,给了分析人员换个角度看世界的...

weixin_32144483的博客 1249

计算机网络之NAT的解释与实验配置

NAT 静态NAT 动态NAT easy_ip NAT服务器映射

爱学习的JackYang的博客 1919

​​PE结构 ---> 5.数据目录表 节区 节表

PE文件中,代码、数据、资源等内容被划分为不同的节,每个节都有IMAGE_SECTION_HEADER属性信息。掌握数据目录表,是深入 PE 解析、手动 LoadPE、IAT Hook 等技术的。IMAGE_SECTION_HEADER描述了文件中的位置和内存中的位置。但是我们现在是从文件中来的所以不应该是---> RVA(内存地址)。dos头->dos体->NT头[文件头 可选头]->区段表->区段。所以我们现在需要做的操作就是把RVA---> FOA(文件地址)资源表 (Resource Table)

盾悟 1万+

解读区块链在制药和物流管理中具备的优势

供应链透明度是建立药品弹性供应链的关键,如何更好地促进端到端的透明度,促进合作伙伴和消费者之间的信任度是当前医药和物流行业高管们关注的话题,区块链技术可以很好的帮助他们。 链集市 · 让区块链落地更简单 《区块链行业观察》专栏·第 31 篇 作者丨Shams Rahman 图片丨来源于网络 作者介绍:本文作者为Shams Rahman教授,是RMIT大学商业IT和物流学院的供应链管理教授、研究与创新部门副主任。本文中文版本由链集市团队编译整理,英文版权归原作者所有,中文转载请联系编译。 新冠肺炎疫情的爆发

CECBC的博客 626

PE文件格式详解(上)

Windows NT 3.1引入了一种名为PE文件格式的新可执行文件格式。PE文件格式的规范包含在了MSDN的CD中(Specs and Strategy, Specifications, Windows NT File Format Specifications),但是它非常之晦涩。     然而这一的文档并未提供足够的信息,所以开发者们无法很好地弄懂PE格式。本文旨在解决这一问题,它会对整个

jwybobo2007的博客 896

电商数据分析19——数据分析在电商平台价格弹性研究中的应用

价格弹性是一个衡量产品价格变化对销量影响的经济学指标,对于电商平台而言,深入理解和有效运用价格弹性,对于制定竞争策略、优化产品定价具有重要意义。随着大数据时代的到来,通过数据分析研究产品的价格弹性,成为了电商企业制定价格策略、调整市场定位、优化促销活动的重要依据。

theskylife的博客 2836

2、TCGA数据处理(差异分析前处理)

注意:1、是R语言中用于读取文本文件并创建数据框的函数。它可以从文本文件中读取数据并将其存储为数据框的形式,每一列代表一个变量,每一行代表一个观察值。2、括号要成对,不能少了;3、file = 'TCGA-LIHC.htseq_counts.tsv'引号可以是单或双引号,建议单;4、逗号主要中英文,都是用英文模式才没错;5、.tsv文件类型必须要有,不能删除,否则读不进来;6、上面代码将TCGA-LIHC.htseq_counts.tsv文件读入并赋值给count1。

PLW_12的博客 2668

最详细PE文件格式讲解!!!!!

每个PE文件都是以一个DOS程序开始的,有了它,一旦程序在DOS下执行,DOS就能执行识别出这是一个有效的执行体,然后运行紧随MZ header的DOS stub(DOS块)。e_lfanew 字段是真正的PE文件头的相对偏移(RVA),指向真正的PE头的文件偏移位置,占用4字节,位于文件开始偏移3ch字节处。当PE文件通过加载器载入内存后,内存中的版本称为模块(Module),映射文件的起始地址称为模块句柄(hModule),可以通过模块句柄访问内存中的其他数据结构。基地址的值是由PE文件本身设定的。

SXXYNHHXX的博客 4123

9、储备池学习:从学习到学习的新范式

本文探讨了基于学习到学习(L2L)框架的储备池计算新范式,提出通过在外循环中优化储备池的超参数(如递归连接权重、输入权重和读出初始化),以提升其在多种任务中的内循环学习性能。研究展示了两种主要实验设置:一是优化储备池用于回归二阶Volterra滤波器任务,显著优于随机基线;二是实现无需调整读出权重、仅依赖内部动态学习非线性函数的能力,表明储备池可快速构建目标函数的内部模型并安装任务先验知识。结合流程图与表格,文章系统呈现了L2L的训练流程、技术细节及实验结果,并讨论了性能提升、泛化能力等开放问题,指出了未来

ujm56789012的博客 506

PE文件格式全解读

PE文件包括DOS部分、PE文件头和节表和节数据。从DOS头(DOS header)到节区头(Sectionheader)是PE头部分,其下的节区合称PE体。节数据包括代码(.text)、数据(.data)、资源(.rsrc)节,分别保存。1.DOS部分:IMAGE_DOS_HEADER结构体的大小为40字节,需要注意的2个重要成员:0x0-0x01e_magic: DOS签名,表文件开始标识0x4d5a=”MZ”0x3c-0x3fe_lfanew:PE头部分的偏移0x000000b0.DOS存根位于DOS

凌阳的博客 5574

APP签名验证全栈破解:Frida Hook绕过+算法逆向+Python一键调用(附可运行脚本)

做过APP逆向和爬虫的同学,肯定都被签名验证折磨过:改了一行代码重新打包,APP直接闪退;抓包看到接口有个sign参数,翻遍JS找不到加密逻辑;好不容易找到加密函数,一调用就崩溃。客户端APK签名校验服务端接口签名验证。前者防止你篡改APP,后者防止你伪造请求。很多人卡在第一步,改完APK就闪退,根本没机会碰接口。本文基于真实项目实战,分享一套通用的签名验证破解方案。从客户端APK签名校验的Frida Hook绕过,到服务端sign算法的逆向还原,最后用Python实现一键调用。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 965

揭秘大厂 Unity 红点系统设计:别小看右上角那颗小红点,它能把你项目搞崩

本文详细探讨了游戏大厂如何设计高性能红点系统。红点作为提升用户活跃和转化率的重要工具,需要支持多级联动、动态判断和全局一致性。系统采用观察者模式和树形结构,分为数据管理、逻辑判定、订阅通知和UI展示四大模块,通过事件驱动方式实现高效刷新。文章特别强调了解耦设计、配置化管理和性能优化,并提出了热更新、数据分析等高级应用场景。最终指出,优秀的红点系统需要架构标准化、自动化配置和团队紧密协作,是大型游戏项目的关键技术基础。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 379

PE文件格式

PE文件是Windows操作系统下使用的可执行文件格式,它是微软在UNIX平台的COFF基础上制作而成的。 PE文件是指32为的可执行文件,也成为PE32,64位的可执行文件称为PE+或PE32+。 PE文件格式 PE文件种类 下图是notepad.exe文件的起始部分,也是PE文件的头部分(PE header),notepad.exe文件运行需要的所有信息都存储在这个PE头中,如何加载到内存、从何处开始执行、运行中需要的DLL有哪些、需要多大的栈/堆内存,大量信息以结构体形式存储在PE头中。.

qq_39249347的博客 3706

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

PE文件格式详细解析(一)

PE文件格式详细解析 本篇文章将会详解Windows操作平台下PE文件格式,同时以具体的示例辅佐大家更好理解PE文件格式。本文章主要使用到以下两个工具:WinHex:用于将PE文件以16进制和ASCII码显示;PE tools解析和修改PE文件的工具。 1.PE文件格式 PE(Portable Executable,可移植的可执行文件),是Windows操作系统下可执行文件的总称。 PE文件往往指32位系统下的可执行文件,亦称PE32。64位的可执行文件称为PE+或PE32+,为PE文件的扩展格式。 PE文

weixin_47754894的博客 6797

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: 获取系统当前的进程及模块信息
下一篇: PE文件格式详解(2)
Matrix_Designer
博客等级 码龄16年 58粉丝 296原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值