PE文件解析-输入表、输出表与重定位表

C语言零基础入门-4_数据输入输出 C语言的输入scanf, 输出printf是人机交互的基础 阅读详情

一、 输入表

1、输入表地址定位

   PE文件头可选映像头中数据目录表的第二成员指向输入表,输入表以一个 IAMGE_IMPORT_DESCRITPTOR 数组开始,每个被PE文件隐式地链接进来的DLL都有一个IID,在这个数组中没有字段指出该结构数组的项数,但他最后一个单元是NULL。
    数据目录表的第二成员 IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT] 就对应输入表。回忆上节文章内容可知,数据目录表 IMAGE_DATA_DIRECTORY 中结构成员 VirtualAddress 就是输入表的RVA了,而区块表 IMAGE_SECTION_HEADER 中结构成员 VirtualAddress 对应区块的RVA。通过输入表的RVA与区块的RVA比较,我们就能知道输入表在哪个区块里面,一般输入表都在".idata"区块里面。

2、输入表结构

IID的结构如下:

typedef struct _IMAGE_IMPORT_DESCRIPTOR {
    union {
        DWORD   Characteristics;            // 0 for terminating null import descriptor
        DWORD   OriginalFirstThunk;         //指向输入名称表(INT)的RVA
    };
    DWORD   TimeDateStamp;                  //一个32位的时间标志
    DWORD   ForwarderChain;                 //这是一个被转向API的索引,一般为0
    DWORD   Name;                           //DLL名字,是个以00结尾的ASCII字符的RVA地址
    DWORD   FirstThunk;                     //指向输入地址表(IAT)的RVA
} IMAGE_IMPORT_DESCRIPTOR;

    通过上图 OriginalFisrtThunk 和 FirstThunk 非常相似,两个数组都有一个IMAGE_THUNK_DATA结构类型的元素,他是一个指针大小的联合,每一个IAMGE_THUNK_DATA元素对应于一个从可执行文件输入的函数,两个数组的结束通过一个值为零的IAMGE_THUNK_DATA元素表示的,IMAGE_THUNK_DATA结构实际上是一个双字,该结构不同时刻有不同的含义,定义如下:

typedef struct _IMAGE_THUNK_DATA32 {
    union {
        PBYTE  ForwarderString;
        PDWORD Function;
        DWORD Ordinal;
        PIMAGE_IMPORT_BY_NAME  AddressOfData;
    } u1;
} IMAGE_THUNK_DATA32;

(1)OriginalFirstThunk:它指向输入名称表(简称INT),INT是一个 IMAGE_THUNK_DATA 结构的数组,数组中的每个IMAGE_THUNK_DATA 结构的成员 AddressOfData都指向IMAGE_IMPORT_BY_NAME结构。
(2)TimeDateStamp:一个32位时间标志,该字段可以忽略。
(3)ForwarderChain:当程序引用一个DLL中的API,而这个API又引用别的DLL的API时使用,这种情况很少出现。
(4)Name:它表示DLL 名称的相对虚地址(译注:相对一个用null作为结束符的ASCII字符串的一个RVA,该字符串是该导入DLL文件的名称,如:KERNEL32.DLL)。
(5)FirstThunk:它指向输入地址表(简称IAT),IAT是一个 IMAGE_THUNK_DATA 结构的数组。

    IAMGE_THUNK_DATA 值的最高位为1时,表示函数以序列号方式输入,这时低31位(或者一个64位可执行文件的低63位)被看做是一个函数序号,当双字的最高位为0时,表示函数以字符串类型的函数名方式输入,这时双字的值是一个RVA,指向一个IAMGE_IMPORT_BY_NAME结构,该结构定义如下:

typedef struct _IMAGE_IMPORT_BY_NAME {
    WORD    Hint;       //本函数在其所驻留DLL的输出表中的序号
    BYTE    Name[1];    //输入函数的函数名,函数名是一个ASCII码字符串,以NULL结尾
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;

    为什么由两个并行的指针数组指向IAMGE_IMPORT_BY_NAME结构呢?

    第一个数组(由OriginalFirstThunk所指向)是但单独的一项,而且不可改变,成为INT,第二个数组(由FirstThunk所指向)是由PE装载器重写的,PE装载器首先搜索OriginalFirstThunk,如果找到了,加载程序迭代搜索数组中的每个指针,找到每个 IMAGE_IMPORT_BY_NAME 结构所指向的输入函数的地址,然后加载器用函数真实入口地址来代替由FirstThunk指向的 IAMGE_IMPORT_BY_NAME 数组所指向数组里的元素值,JMP dword ptr[xxxxxxxx]中的[xxxxxxxx]指向FirstThunk
 数组中的一个入口,所以当PE文件装载内存后准备执行时,所有函数入口地址被排列在一起,此时输入表中其他就不重要的,依靠IAT提供地址就可以正常运行。

    有些情况,一些函数仅由序号引出,也就是说不能用函数名来调用它,只能通过位置调用它,此时 IMAGE_THUNK_DATA 的值低位字指示函数序数,而高二进位(MSB)设为1,Microsoft提供了一个方便的常量测量DWORD值的MSB位,就是 IMAGE_ORDINAL_FLAG32,其值是80000000h。第二是程序的 OriginalFirstThunk 的值为0,初始化时,系统根据FirstThunk 的值指向函数名的地址串,由地址串找到函数名,再根据函数名入口地址,然后用入口地址取代 FirstThunk
 指向的地址串的原值。

二、输出表

   输出表(Export Table)包含函数名称,输出序数等,序数是指定DLL中某个函数的16位数字,在所指向的DLL里是独一无二的。数据目录表中的第一个成员 IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT] 指向输出表,对应区块一般为".edata"。输出表 IAMGE_EXPORT_DIRECTORY 结构如下:

typedef struct _IMAGE_EXPORT_DIRECTORY {
    DWORD   Characteristics;       //未使用,总为0
    DWORD   TimeDateStamp;         //创建输出表创建时间(GMT时间)
    WORD    MajorVersion;          //主版本号,一般为0
    WORD    MinorVersion;          //次版本号,一般为0
    DWORD   Name;                  //模块的真实名称
    DWORD   Base;                  //基数,加上序数就是函数数组的索引值
    DWORD   NumberOfFunctions;     //AddressOfFunctions阵列中的元素个数
    DWORD   NumberOfNames;         //AddressOfNameS阵列中的元素个数
    DWORD   AddressOfFunctions;    //指向函数地址数组
    DWORD   AddressOfNames;        //函数名字的指针地址
    DWORD   AddressOfNameOrdinals; //指向输出序号数组
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;

Name:指向一个ASCII字符串的RVA,既模块的名字。
Base:序号的基数,按序号导出函数的序号值从Base开始递增。当通过序数来查询一个输出函数时,这个值从序数里被减去,结果被用作进入输出地址表(EAT)的索引。
NumberOfFunctions:输出地址表(EAT)中的条目数量,即所有导出函数的数量。
NumberOfNames:输出名称表(ENT)中的条目数量,即按名称导出函数的数量,这个值总是小于或者等于NumberOfFunctions的值。
AddressOfFunctions:EAT的RVA,指向一个DWORD数组,数组中的每一项是一个导出函数的RVA,顺序与导出序号相同。
AddressOfNames:ENT的RVA,指向一个DWORD数组,数组中的每一项仍然是一个RVA,指向一个表示函数名字。
AddressOfNameOrdinals:输出序数表的RVA,指向一个WORD数组。数组中的每一项与AddressOfNames中的每一项对应,表示该名字的函数在AddressOfFunctions中的序号。

下图是一个经典的输出表结构:

三、重定位表

   重定位就是你本来这个程序理论上要占据这个地址,但是由于某种原因,这个地址现在不能让你霸占,你必须转移到别的地址,这就需要基址重定位。如果可执行文件不在首选的地址装入,那么文件中每一个定位都需要被修正。对加载器来说,它不需要知道关于地址如何使用的任何细节,它只需要知道有一系列的数据需要以某种一致的方式来修正就可以了。
    对于EXE文件来说,每个文件总是使用独立的虚拟地址空间,所以EXE总能够按照这个地址装入,不需要重定位信息。而对于DLL来说,由于多个DLL文件全部使用宿主EXE文件的地址空间,不能保证装入地址没有被其它的DLL使用,所以DLL文件中必须包含重定位信息。
    下面以实例 DllDemo.DLL为例讲述其定位过程。

......
:0040100E  6800204000               push  00402000
......

    在这个例子中汇编语句将一个指针压栈,402000h是某一字符串的指针。指令是来自一个基置为 00400000h 的DLL文件,因此这个字符串的RVA是2000h。如果DLL确实在 00400000h 处装入,那么指令能够按照现在的样子正确执行。假设当DLL执行时,Windows加载器决定将其映射到 870000h 处,此时就需要进行基址重定位,计算方式如下:

402000h + (870000h - 400000h)= 872000h

   基址重定位表(Base Relocation Table)位于一个叫".reloc" 的区块内,但是找到它们正确方式是通过数据目录表的 IMAGE_DIRECTORY_ENTRY_BASERELOC 条目。基址重定位数据组织方法采用类似按页分割的方法,其许多重定位块串接在成的,每个块存放4KB(1000h)大小的重定位信息,每个重定位数据块的大小必须以DWORD(4字节)对齐,他们以IMAGE_BASE_RELOCATION 结构开始,格式如下:

typedef struct _IMAGE_BASE_RELOCATION {
    DWORD   VirtualAddress;   //重定位数据开始RVA地址
    DWORD   SizeOfBlock;      //重定位块的长度
//  WORD    TypeOffset[1];    //重定项位数组
} IMAGE_BASE_RELOCATION;

VirtualAddress:这是一组重定位数据的开始RVA地址,各重定位项的地址加上这个值才是重定位项完整的RVA地址。
SizeOfBlock:是当前重定位结构的大小,因为VirtualAddress 和 SizeOfBlock 大小都是固定的4个字节,因此这个项减去8,则是TypeOffset 大小。
TypeOffset:是一个数组。数组每项大小为两个字节,共16位,它又分为高4位与低12位,高四位代表重定位类型,低12位是重定位的地址,与VirtualAddress 相加即是指向PE映像中需要修改地址数据的指针。

   对于X86 可执行文件,所有的基址重定位类型都是IMAGE_REL_BASED_HIGHLOW,在一组重定位结束的地方会出现一个类型是IAMGE_REL_BASED_ABSOLUTE的重定位,这些重定位什么都不做,在哪里只是填充,以便下一个IAMGE_BASE_RELOCATION 是以4个字节分界线来对齐,所有重定位最终以一个 VirtualAddress 字段为0的 IAMGE_BASE_RELOCATION 结构对齐。

    重定位表的结构如下图,由数个 IMAGE_BASE_RELOCATION 结构组成,每个结构VirtualAddress,SizeOfSlock 和 TypeOffset 三部分组成。

原文:https://blog.youkuaiyun.com/shitdbg/article/details/49734495

全面掌握Windows PE文件格式结构 在计算机世界中,可执行文件(PE文件)是操作系统与硬件直接交互的基本单位。Windows操作系统中的可执行文件格式被称作Portable Executable(PE),它定义了一种标准的文件格式,用于存储可执行程序和相关资源。PE文件结构是分层次的,它从DOS头开始,到PE头、节表,再到数据目录和其他节。它不只是简单的数据堆砌,而是通过精心设计的结构来支持各种功能,如资源管理、导入和导出函数、调试信息等。理解PE文件的基本布局,对于软件逆向工程、病毒分析和软件开发等领域至关重要。 阅读详情

相关推荐

局部,全局(外部),static等变量详解

首先,必须明白一个程序是包含若干个源文件,每个源文件又是包含若干个函数,每个源文件、函数中又定义了若干个变量。但是每个变量都有自己的作用范围,也就是自己的作用域。只有在作用域内才可以访问变量。 变量的有效范围称为变量的作用域( scope)。归纳起来,变量有4种不同的作用域:文件作用域( file scope)、函数作用域( function scope)、块作用域(block sc...

归根结底不优秀的博客 1324

22. PE结构-PE详解之输入表(导入表)、屠龙刀W32Dasm(静态)、LordPE(动态)工具入门(查找dll、调用函数)

我们知道PE 文件中的数据被载入内存后根据不同页面属性被划分成很多区块(节),并有区块表(节表)的数据来描述这些区块。这里我们需要注意的问题是:一个区块中的数据仅仅只是由于属性相同而放在一起,并不一定是同一种用途的内容。例如接着要讲的输入表、输出表等就有可能和只读常量一起被放在同一个区块中,因为他们的属性都是可读不可写的。 其次,由于不同用途的数据有可能被放入同一个区块中,因此仅仅依靠区块表是无...

墨痕诉清风的博客 2837

手把手教你用STM32驱动SPL06-001气压传感器(附完整代码与避坑指南)

本文详细介绍了如何使用STM32驱动SPL06-001气压传感器,包括硬件连接、寄存器配置、驱动层实现和数据补偿算法。通过完整的代码示例和避坑指南,帮助开发者快速掌握SPL06传感器的应用技巧,提升嵌入式系统开发效率。

weixin_42552315的博客 294

kettle常见业务操作表输入-表输出

kettle常见业务操作一、kettle主要功能二、简述1.kettle过程描述2.输入控件3.输出控件4.kettle三、表输入-表输出1.建表2.造数据3.表输出四、新建转化 一、kettle主要功能 接触kettle很长时间了,现在已经改名为Pentaho Data Integration,就是数据整合的意思和原来的水壶很相像,数据从壶口装入,壶嘴统一输出。 kettle的功能很多,我当时用的最多的就是跨数据库同步数据的功能,举例,把mysql数据库中的商品信息导入到orcle,因为涉及到跨数据库,手

valkyrja110的博客 1万+

RTAB-MAP实战:用Realsense D435i在ROS中搭建室内3D地图(附避坑指南)

本文详细介绍了如何在ROS环境下,使用Intel Realsense D435i深度相机和RTAB-MAP算法进行室内3D地图构建的完整实战流程。内容涵盖环境配置、核心节点数据流解析、关键参数调优、地图保存与重定位,并提供了实用的避坑指南,帮助机器人开发者和研究者快速实现稳定的视觉SLAM应用。

weixin_29095049的博客 490

WVP-GB28181-Pro配置避坑指南:从零到上线全流程详解(含ZLM自动同步技巧)

本文详细解析了WVP-GB28181-Pro视频平台的配置流程,特别针对国标视频平台部署中的常见陷阱,如stream-ip/sdp-ip配置错误、ZLM自动同步问题及端口冲突等,提供了实用的解决方案和优化建议,帮助开发者快速实现从零到上线的全流程部署。

weixin_30836759的博客 93

windows逆向之PE文件输入表

然后通过 `dosHeader->e_lfanew` 计算出 `IMAGE_NT_HEADERS` 的偏移地址,并将其与 `baseAddress` 相加,再强制转换为 `PIMAGE_NT_HEADERS` 类型的指针 `ntHeaders`。`e_lfanew` 是 `IMAGE_DOS_HEADER` 结构中的一个成员。所以 `dosHeader->e_lfanew` 表示获取 `dosHeader` 所指向的 `IMAGE_DOS_HEADER` 结构中的 `e_lfanew` 成员的值。

m0_57836225的博客 1389

【电子元件篇】MOSFET场效应管作用、选型和测量指南-超简单解读

场效应管是一种电压控制型半导体器件,相比三极管具有输入阻抗高、噪声小、功耗低等优势。主要分为结型和绝缘栅型两大类,后者又可分为耗尽型和增强型MOS管。场效应管通过栅极电压控制漏极电流,具有转移特性和输出特性两大静态特性,以及快速的开关特性。其关键参数包括饱和漏源电流、夹断电压、跨导等,应用场景涵盖信号放大、恒流源、阻抗变换等领域。使用时需根据电路需求选择合适类型,如结型管适合一般放大,功率MOSFET适合高压大电流场合。检测时可用万用表电阻档初步判断好坏和放大能力。

2301_81299416的博客 2540

23. PE结构-PE详解之输出表(导出表)

为每一个程序写一个相同的函数看起来似乎有点浪费空间,因此Windows就整出了动态链接库的概念,将一些常用的函数封装成动态链接库,等到需要的时候通过直接加载动态链接库,将需要的函数整合到自身中,这样就大大的节约了内存中资源的存放。如图: 有一个重要的概念需要记住:动态链接库是被映射到其他应用程序的地址空间中执行的,它和应用程序可以看成是“一体”的,动态链接库可以使用应用程序的资源,它所拥有的...

墨痕诉清风的博客 4097

Video Diffusion Models:基于扩散模型的视频生成

Diffusion Models专栏文章汇总:入门与实战 前言:扩散模型已经被广泛运用到图像生成、image-to-image转换、时间序列生成、3D点云生成、文本生成、音频生成等领域,谷歌研究院最新的研究成果成功将diffusion models运用到视频生成领域。 目录 模型结构 分解时空体系联合训练 梯度条件法 恐怖的实验结果 论文和代码 个人启发 个人疑问? 模型结构 在前面的博文中,我详细介绍了为什么绝大部分的diffusion models都使用Unet结构.

沉迷单车的追风少年 6671

Ardupilot无人船(车)mavros自主控制

rover 4.4。

超维空间科技的博客 3230

PE文件结构详解

Windows程序的各种界面称为资源,包括加速键(Accelerator)、位图(Bitmap)、光标(Cursor)、对话框(DialogBox)、图标(Icon)、菜单(Menu)、串表(StringTable)、工具栏(Toolbar)和版本信息(VersionInformation)等。执行PE文件前,加载程序在进行重定位的时候,会用PE文件在内存中的实际映像地址减PE文件所要求的映像地址,根据重定位类型的不同将差值添加到相应的地址数据中。...

神棍之路 1万+

【云原生技术】helm中Chart.yaml、values.yaml、_helpers.tpl 各自的写法与作用

Chart.yaml、values.yaml、_helpers.tpl 各自的写法与作用 在一个标准的 Helm Chart 中,通常会包含以下关键文件: - **Chart.yaml** - **values.yaml** - **templates/`_helpers.tpl`** - 以及若干模板文件(`deployment.yaml`、`service.yaml` 等) 下面分别介绍这几个文件的作用、常见字段及其含义。

weixin_46453070的博客 752

【PE】PE文件结构学习

【PE】PE文件结构学习PE文件内存对齐文件对齐PE结构分析DOS头结构PE头文件区块表输入表输出表:基址重定位表: PE文件 内存对齐 PE文件包括: DLL,EXE,OCX,SYS等。 Windows加载器遍历PE文件并将其复制到内存镜像。PE文件结构在磁盘中和内存中基本是一样的,但又不是完全复制,对齐方式有所不同。 如图:在Windows系统中,一个节在内存中对齐单位是一个页的大小。 对于32位操作系统来说,这个值是4KB(1000H) 对于64位系统来说,这个值是8KB(2000H) 文件

dr0op's blog 1786

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

PE文件剖析

使用UE查看PE文件格式,下载链接: 链接:https://pan.baidu.com/s/18dETrHiic0zoK1Mfu_6M8g 提取码:tyms 不错的视频:https://www.bilibili.com/video/BV18r4y1K7sa?p=4&spm_id_from=pageDriver 1、什么是可执行文件? 可执行文件 (executable file) 指的是可以由操作系统进行加载执行的文件。 可执行文件的格式: -Wi...

LIJIWEI0611的博客 770

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

PE 知识学习

原文地址:知识学习">PE 知识学习作者:firstlovePE知识学习(一) MengLong[DFCG] 2004-11-21 PE知识学习(二) PE知识学习(三) PE知识学习(四) PE知识学习(五) PE知识学习(六) PE知识学习(七)     PE 文件的知识是基本的知识.网上有很多这方面的资料.然而系统讲解的却不多.我不是这方面的专家,却希望能抛砖引玉,得到这方面的一些指

ˉ夨落旳尐孩的专栏 1032

假人有限元模型

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

PE文件结构2 RAV 输入表与输出表 基址重定位 安全分析与恶意软件研究 逆向工程 优化与性能调整 兼容性与移植性分析

当一个PE文件(如DLL或EXE)被加载到内存时,它通常被加载到一个预定义的基址(Base Address)。然而,如果该地址已经被占用,或者由于地址空间布局随机化(ASLR)的原因,操作系统可能会将文件加载到不同的地址。这时,文件中所有基于绝对地址的引用都必须调整,以反映新的加载地址。这个调整过程就是基址重定位。

chenhao0568的专栏 1725

小甲鱼PE详解之输入表(导入表)详解(PE详解07)

上一讲:小甲鱼PE详解之区块描述、对齐值以及RVA详解捷径并不是把弯路改直了,而是帮你把岔道堵上!走得弯路跟成长的速度是成正比的!不要害怕走上弯路,弯路会让你懂得更多,最终还是会在终点交汇!岔路会将你引入万劫不复的深渊,并越走越深……在开始讲解输入表(导入表)概念之前,请允许小甲

3595

Windows:PE格式之输入表

文章目录杂数据目录表输入表 杂 前文是 操作系统:32位PE文件结构 数据目录表 位置:ImageNtHeaders->OptionalHeader->DataDirectory 描述:由NumberOfRvaAndSizes个IMAGE_DATA_DIRECTORY结构体组成的数组 包含有:输入表、输出表、资源表、重定位表等数据目录项的RVA和大小 输入表、输出表又称导入表、导出表 输入表 ...

无名J0kзr的博客 765

PE文件结构2

当IRDE位于第二层目录时,Name表示资源的名称;5. FirstThunk,RVA,指向输入地址表(简称IAT),IAT也是一个类型为IMAGE_THUNK_DATA结构的数组,同样的,通过在数组末尾附加一个空的IMAGE_THUNK_DATA结构来表示数组的结束,每一个输入的函数都有一个对应的IMAGE_THUNK_DATA结构;PE文件中存在一个叫做输入表的结构,这个表保存了PE文件的所有输入信息,包括输入了哪个DLL文件的哪个函数、函数是以名称还是以序号的方式输入、被输入函数在内存中的地址等。

m0_51227834的博客 168

PE文件结构整理

本博客主要参考了以下两篇博客中的代码并加以整理: 52pj_zmblix的讲解 csdn某大佬的讲解 PE PE文件结构关键不在于了解,在于熟谙。只有到了不用刻意去计算也能凭直觉找到需要信息的地步才算入门了。仅仅了解了PE的结构和没了解过并没有本质的区别。 按主流的说法,PE文件可以分解成下面几个部分: PE文件 Dos头 PE签名 NT头 PE头 PE可选头 ...

gynamics的博客 290

初识PE

1.PE文件格式 1.1 PE文件格式纵览 PE文件格式的特点是 磁盘中的数据结构布局和内存中的数据结构布局是一致的. WINDOWS加载器 遍历PE文件并决定文件的哪一步分贝映射,这种映射方式是将文件较高的偏移位置映射到较高的内存地址中. 当PE被WINDOWS加载器装入内存后,内存中的版本称为模块(Module) .映射文件其实地址称为模块句柄(hModule), 可以通过模块句柄

xue_you的专栏 1060

【破解利器】PE工具篇(PE编辑,查看等操作)

【破解利器】PE工具篇(PE编辑,查看等操作), 对这各位老手来说这些应该不陌生了 PE编辑工具 Stud_PE v. 2.4.0.1 PE工具,用来学习PE格式十分方便。 http://www.cgsoftlabs.ro/ 汉化版:http://bbs.pediy.com/showthread.php?s=&threadid=22840 LordPE DLX增强版(2008.5.31) 2008.5.31 资源名溢出漏洞。缓

一个人的软件艺术 3570

pe知识学习----------------连载5,6,7--完

导读:   pe知识学习(五)   从这贴开始,我介绍几个常用的区段:输入表,输出表和重定位表.   我们知道,程序调用外部的dll函数通常都是下面这种形式:   call my_label   ...   my_label: jmp dword ptr [xxxxxxxx]   对一个dll中的函数的调用总是通过一个地址间接的调用的.这些地址就放在输入表里.   输入表(Import T

zk520的专栏 464
上一篇: PE文件解析-文件头与整体介绍
下一篇: PE文件解析-异常处理表与数字签名
zhyulo
博客等级 码龄10年 86粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值