PE文件结构(导出表)
导出表
什么是导出表?
导出表是PE文件中记录动态链接库(DLL)对外提供的函数或数据的列表,包含函数名称、序号和内存地址等信息,供其他程序调用
我们写一个dll来查看一下导出函数
int exportFunc1(int a, int b) {return a + b;
}char exportFunc2(char a, char b) {return 'c';
}BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;
}
可以使用IDA等工具查询dll,sys,exe的导出函数
可以看到在IDA中已经成功的给我们查找出了当前dll的导出函数
如何自通过二进制文本工具查找对应的导入表呢?
首先先回忆一下之前pe的内容
1.DOS头,DOS块
2.NT头,标准pe头,扩展pe头
在扩展pe头的最后一个属性中,就存放着对应的16张表 ( IMAGE_DATA_DIRECTORY )
typedef struct _IMAGE_OPTIONAL_HEADER64 {WORD Magic;BYTE MajorLinkerVersion;BYTE MinorLinkerVersion;DWORD SizeOfCode;DWORD SizeOfInitializedData;DWORD SizeOfUninitializedData;DWORD AddressOfEntryPoint;DWORD BaseOfCode;ULONGLONG ImageBase;DWORD SectionAlignment;DWORD FileAlignment;WORD MajorOperatingSystemVersion;WORD MinorOperatingSystemVersion;WORD MajorImageVersion;WORD MinorImageVersion;WORD MajorSubsystemVersion;WORD MinorSubsystemVersion;DWORD Win32VersionValue;DWORD SizeOfImage;DWORD SizeOfHeaders;DWORD CheckSum;WORD Subsystem;WORD DllCharacteristics;ULONGLONG SizeOfStackReserve;ULONGLONG SizeOfStackCommit;ULONGLONG SizeOfHeapReserve;ULONGLONG SizeOfHeapCommit;DWORD LoaderFlags;DWORD NumberOfRvaAndSizes;IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; // 这个结构体数组中就存放着对应16张表的位置和大小
} IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;
第一个结构体数组就存放的是导出表的位置和大小
导出表的结构体
typedef struct _IMAGE_EXPORT_DIRECTORY {DWORD Characteristics;DWORD TimeDateStamp;WORD MajorVersion;WORD MinorVersion;DWORD Name; // DLL名称的RVADWORD Base; // 导出函数序号的起始值DWORD NumberOfFunctions; // 实际导出的函数数量DWORD NumberOfNames; // 按名称导出的函数数量DWORD AddressOfFunctions; // 函数地址数组的RVADWORD AddressOfNames; // 函数名称数组的RVADWORD AddressOfNameOrdinals; // 函数序号数组的RVA
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
首先,确认导出表的位置,由于扩展pe头的后面紧跟着的是节表,一个 IMAGE_DATA_DIRECTORY 结构体的大小是8个字节,所以从节表开始的地方向后数128个字节就是导出表开始的位置
IMAGE_NUMBEROF_DIRECTORY_ENTRIES 结构体中有两个属性
typedef struct _IMAGE_DATA_DIRECTORY {DWORD VirtualAddress; // 表的虚拟位置DWORD Size; // 表的大小(不一定正确)
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
由此可知我们导出表的地址为:0x1B8D0
但是光知道了位置还是不够,这个位置是相对虚拟位置,我们需要把它(RVA)转为FOA(如果内存对齐和文件对齐一至则不用转换)
转换方法和公式之前有讲过
由于我们程序的内存对齐和文件对齐不一致
所以 0x1B8D0 - imageBase 看地址落在在那个节的范围中,然后用0x1B8D0 - 节的起始地址 = 节到当前地址的偏移,最后再通过节表中的PointerToRawData属性 + 偏移求出在文件中的位置
经计算求得导出表在文件中的位置为:0xA8D0
IMAGE_EXPORT_DIRECTORY 导出表结构体当中第五个属性DWORD Name存放的是导出文件的名称,以及导出的方法名(这里的地址也是一个虚拟地址)
后面重点说一下导出表中的这三个子表属性
DWORD AddressOfFunctions; // 函数地址数组的RVADWORD AddressOfNames; // 函数名称数组的RVADWORD AddressOfNameOrdinals; // 函数序号数组的RVA
AddressOfFunctions的值为(RVA):0x1B8F8->FOA = 0xA8F8
AddressOfNames的值为(RVA):0x1B900->FOA = 0xA900
AddressOfNameOrdinals(RVA):0x1B908->FOA = 0xA908
AddressOfFunctions
通过NumberOfFunctions
属性我们可以得知所有的导出函数个数有两个,函数地址是从0xA8F8
地址开始,一个地址占4个字节
按小端序来排列就是 0x110C3
, 0x11069
这两个地址(RVA地址)
通过RVA->FOA后才是真实的方法地址
AddressOfNames
接下来我们看一下导出方法的名称
首先我们看下NumberOfNames
这个属性的值,这个值表示有多少个方法是已方法名称导出的(我这里是2表示两个方法都是通过名称导出)
AddressOfNames在文件中的地址为:0xA900
,有两个方法都是通过名称导出
我们就可以知道两个方法名称的地址为:0x1B922
,0x1B916
(RVA)
转为在文件中的地址就可以知道两个导出方法的名称了
AddressOfNameOrdinals
序号表的个数和按文件导出的个数是一样的
AddressOfNameOrdinals在文件中的地址为:0xA908
(序号表每个为2个字节)
我们就知道两个值为:0x1
,0x00
(1,0)
函数表是用来通过函数方法名的下标(在第几个方法),再查询序号表,最后再通过序号表中的值去函数地址表通过下标查询 (有点抽象 - 。- )
函数地址表 | 序号表 | 函数名称表 |
---|---|---|
0x4C3 | 0x00 | exportFunc1 |
0x469 | 0x01 | exportFunc2 |
比如我想找 exportFunc1 这个方法的地址,首先这个方法在函数名称表中下标为0,然后再到序
号表中查下标为0的值,查询的值为0,最后再到函数地址表查下标为0的值 (0x4C3),最后查
询到我们要找的函数
Base
base导出函数序号的起始值,在没有通过函数名导出的情况下,还可以通过序号来进行查找,我这个程序的base值为1,就表示函数地址表的下标从1开始找依次递增,最终通过序号来查询出我们的函数地址
注:这里给出的导出函数方式是最简单的,还有几种比较特殊的情况,比如导出函数没有导出方法,导出函数序号不按递增序列增加时
相关文章:
PE文件结构(导出表)
导出表 什么是导出表? 导出表是PE文件中记录动态链接库(DLL)对外提供的函数或数据的列表,包含函数名称、序号和内存地址等信息,供其他程序调用 我们写一个dll来查看一下导出函数 int exportFunc1(int a, int b) {ret…...
网络安全自动化:精准把握自动化边界,筑牢企业安全防
在当今数字化时代,网络攻击的威胁日益严峻,企业网络安全的重要性不言而喻。随着海量资产与复杂架构的出现,网络安全自动化成为了众多企业关注的焦点。网络安全维护看似简单的修补系统、删除旧账户、更新软件,在大型企业中却极易变…...
实战设计模式之中介者模式
概述 中介者模式是一种强大且灵活的设计模式,适用于需要优化对象间通信的场景。中介者模式通过引入一个中介对象,来封装一系列对象之间的交互。在没有中介者的情况下,这些对象之间可能会直接相互引用,导致系统中的类紧密耦合&…...
价格识别策略思路
该策略是一种基于价格形态和市场条件的交易算法,旨在通过识别特定的价格模式来生成买入和卖出信号。 价格形态识别 策略的核心在于识别价格的高点和低点形态。通过比较当前周期及其前几个周期的最高价和最低价, 策略定义了一系列条件来判断价格是否形成了…...
Kotlin带接收者的Lambda介绍和应用(封装DialogFragment)
先来看一个具体应用:假设我们有一个App,App中有一个退出应用的按钮,点击该按钮后并不是立即退出,而是先弹出一个对话框,询问用户是否确定要退出,用户点了确定再退出,点取消则不退出,…...
【NLP】32. Transformers (HuggingFace Pipelines 实战)
🤖 Transformers (HuggingFace Pipelines 实战) 本教程基于 Hugging Face 的 transformers 库,展示如何使用预训练模型完成以下任务: 情感分析(Sentiment Analysis)文本生成(Text …...
[ 设计模式 ] | 单例模式
单例模式是什么?哪两种模式? 单例模式就是一个类型的对象,只有一个,比如说搜索引擎中的索引部分,360安全卫士的桌面悬浮球。 饿汉模式和懒汉模式:饿汉模式是线程安全的,懒汉模式不是线程安全的…...
用网页显示工控仪表
一.起因 现在工控也越来越多的使用web页面来显示电压,电流,温度,转速等物理量.本例使用js控制网页显示速度仪表. 二.代码 <html> <head><script type"text/javascript">var ctx;var px0;var movePoint{x0:0,x1:0};function init(){drawFace();m…...
Spring项目改造Solon版,使用体验,对比
概述 对于Solon有些人可能并不了解,在官方概述中,称其是新一代Java企业级应用开发框架,从零开始构建,有自主的标准规范与开放生态。近16万行代码。 并有更快、更小、更简单的特点 什么样的Java项目用Solon好? 按正常…...
2.CFD 计算过程概述:Fluent在散热计算中的优势
1.主流散热软件 2.电子产品热设计的基本要求 3.失效率与温度之间的关系 4.电子产品热设计的基本要求 5.电子产品必须要做散热设计 6.主动散热与被动散热 7.高效山热方案 8.热交换模型 9.Fluent中传热模型...
【Java ee初阶】多线程(6)
一、阻塞队列 队列的原则:“先进先出”,队列分为普通队列,优先级队列等等。在数据结构中,堆是特殊的完全二叉树,一定不要把堆和二叉搜索树混淆。 阻塞队列是一种特殊的队列,也遵循“先进先出”的原则。 …...
Unity:Surface Effector 2D(表面效应器 2D)
目录 什么是表面效应器 2D? 🎯 它是做什么的? 🧪 从第一性原理解释它是怎么工作的 📦 重要参数解释 为什么不直接用 Rigidbody(刚体)来控制运动 ? 所以什么时候该用哪个&#…...
Spring 框架的底层原理
Spring 框架的底层原理主要包括以下几个方面: 核心容器(IoC 容器) IoC(控制反转)原理 : 依赖注入(DI) :这是 IoC 的实现方式之一。在传统的程序开发中,程序组…...
【Unity】AssetBundle热更新
1.新建两个预制体: Cube1:GameObject Material1:Material Cube1使用了Material1材质 之后设置打包配置 Cube1的打包配置为custom.ab Material1的打包配置为mat.ab 2.在Asset文件夹下创建Editor文件夹,并在Editor下创建BuildBundle…...
【算法笔记】动态规划基础(二):背包dp
目录 01背包例题状态表示状态计算初始化AC代码 完全背包例题状态表示状态计算初始化TLE代码 多重背包例题状态表示状态计算初始化AC代码 分组背包例题状态表示状态计算初始化AC代码 二维费用背包例题状态表示状态计算初始化AC代码 混合背包问题例题状态表示状态计算初始化TLE代…...
IP属地是我的定位吗?——解析两者区别
在互联网时代,我们经常看到社交媒体、论坛或APP上显示用户的“IP属地”,许多人会疑惑:IP属地是不是我的精确定位?它会不会暴露我的隐私? 本文将详细解析IP属地和定位的区别,并解答常见的相关问题&#…...
力扣每日一题1128等价多米诺骨牌对的数量
1128. 等价多米诺骨牌对的数量 题目: 给你一组多米诺骨牌 dominoes 。 形式上,dominoes[i] [a, b] 与 dominoes[j] [c, d] 等价 当且仅当 (a c 且 b d) 或者 (a d 且 b c) 。即一张骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌。 在 0 &l…...
SpringBoot集成CXF框架,实现WebService
SpringBoot官网地址:https://spring.io/projects/spring-ws 1、WebService服务端搭建 Maven依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.17&…...
android-ndk开发(2): macOS 安装 ndk
android-ndk开发(2): macOS 安装 ndk 2025/05/05 1. 概要 对于 android-ndk 在 r23 之前的版本,官方提供了 .zip 文件, 解压即安装。 对于 android-ndk 在 r23 以及之后的版本, 官方只提供了 .dmg 文件, 不能简单的解压完成安…...
科创大赛——知识点复习【c++】——第一篇
目录 输入 一、cin 二、scanf 三、gets 四、getchar 五、fgets 输出 一、cout 二、printf 基本数据类型 一,数据类型有哪些? 二,整型(Integer Types) 1,修饰符 2,整型数据的数据范…...
硬件工程师面试常见问题(14)
第六十六问:运放--输入偏置电流和输入失调电流 输入偏置电流lb:是由于运放两个输入极都有漏电流的存在。实际的运放,会有电流流入运放的输入端的。那么输入偏置电流就定义这两个电流的平均值。 输入失调电流 Ios:定义为两个差分输入端偏置电…...
Flink流水线任务在线演示
Flink流水线在线演示 1. 登录系统 访问系统登录页面,输入账号密码完成身份验证。 2. 创建任务 入口:通过顶部菜单栏选择 任务开发,或通过快捷入口 快速创建任务。 任务类型:选择 FlinkPipeline。 3. 配置任务 进入配置界面…...
C++笔记之接口`Interface`
C++笔记之接口Interface code review! 一个简洁简短的 C++ 接口实现示例: #include <iostream>// 1. 定义接口(抽象类) class Shape {public:...
css使用aspect-ratio制作4:3和9:16和1:1等等比例布局
文章目录 1. 前言2. 用法2.1 基本语法2.2. 与max-width、max-height等属性结合使用2.3. 动态计算比例 3. 应用场景4. 兼容性和替代方案5. 总结 1. 前言 在网页制作过程中,有时候我们只知道宽度,或者只知道高度,这时候需要制作一个4:3和9:16这…...
深入探索 Apache Spark:从初识到集群运行原理
深入探索 Apache Spark:从初识到集群运行原理 在当今大数据时代,数据如同奔涌的河流,蕴藏着巨大的价值。如何高效地处理和分析这些海量数据,成为各行各业关注的焦点。Apache Spark 正是为此而生的强大引擎,它以其卓越…...
0903Redux改造项目_用户信息_状态管理-react-仿低代码平台项目
文章目录 1 Redux管理用户信息1.1 定义store和reducer1.2 使用useSeletor 2 自定义Hook统一加载用户信息存储Redux3 根据用户登录状态动态跳转页面结语 1 Redux管理用户信息 1.1 定义store和reducer src/store/userReducer.ts代码如下所示: import { createSlice…...
PyTorch_构建线性回归
使用 PyTorch 的 API 来手动构建一个线性回归的假设函数,数据加载器,损失函数,优化方法,绘制训练过程中的损失变化。 数据构建 import torch from sklearn.datasets import make_regression import matplotlib.pyplot as plt i…...
领略算法真谛: 多源bfs
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…...
Linux的web服务器的部署及优化
实验环境的配置 我们依然是要配置本地软件仓库,之前已有详细介绍,然后再次基础上还有如下操作,首先是进入到以下文件进行编辑 编辑内容为下,并且注意自身的网关有没有写错 然后给予权限 再进行下列操作后,就配置完成了…...
ASP.NET Core 请求限速的ActionFilter
文章目录 前言一、实现步骤1)创建自定义Action Filter示例1:示例2: 2)注册服务3)使用 二、实现说明总结 前言 以下是一个基于内存缓存实现的自定义限流Action Filter。 一、实现步骤 1)创建自定义Action…...
本地化语音转换工具推荐与使用
软件介绍 Buzz是一款基于OpenAI Whisper技术开发的开源语音转文字工具,支持离线运行和实时语音转换,能够高效完成会议记录、音频转文字等任务。 安装注意事项 在使用Buzz之前需要注意软件的安装设置,由于程序自带较大的模型文件&…...
【心海资源】telegram换U地址完整源码
【心海资源】telegram换U地址完整源码 未测,需要的下载完整的 下载地址:下载地址.txt - 蓝奏云...
神经网络开发实战:从零基础到企业级应用(含CNN、RNN、BP网络代码详解)
简介 神经网络作为深度学习的核心,正在成为现代AI应用的基石。从基础的感知机到复杂的Transformer架构,从图像识别到自然语言处理,神经网络技术的演进推动了人工智能的快速发展。本文将系统介绍神经网络的核心概念、主流模型及其实现原理,并通过三个企业级实战案例(医学图…...
C# WPF 布局
C# 0、WPF 布局 1、ON/OFF按钮 2、textBox 3、ComboBox 4、TabControl 5、Button <Window x:Class"WpfApp5.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/20…...
【PaaS与AI融合】MLOps平台的架构设计
PaaS与AI融合:MLOps平台的架构设计 一、技术背景与发展趋势二、技术架构核心特征1. 全生命周期管理闭环2. 混合编排引擎3. 智能资源调度三、关键技术实现细节1. 持续集成流水线2. 异构资源管理3. 安全治理体系四、行业实践与未来演进典型案例分析发展趋势展望五、架构设计建议…...
硬件工程师面试常见问题(15)
第七十一问:运放增益带宽积解读(有待改进) 增益带宽积顾名思义:增益(就是开环增益)与带宽的乘积; 第七十二问:运放输出摆幅 定义:输出摆幅是指输出信号在最大值和最小值…...
SpringMVC——第6章:RESTFul编程风格
一、RESTFul编程风格 1.RESTFul是什么 RESTFul是WEB服务接口的一种设计风格。 RESTFul定义了一组约束条件和规范,可以让WEB服务接口更加简洁、易于理解、易于扩展、安全可靠。 RESTFul对一个WEB服务接口都规定了哪些东西? 对请求的URL格式有约束和规范…...
深度解析:从 GPT-4o“谄媚”到 Deepseek“物理腔”,透视大模型行为模式的底层逻辑与挑战
深度解析:从 GPT-4o“谄媚”到 AI“物理腔”,透视大模型行为模式的底层逻辑与挑战 标签:人工智能, GPT-4o, 大语言模型, AI伦理, 人机交互, 技术思考 大家好!最近AI圈最火的“瓜”之一,莫过于OpenAI的GPT-4o模型在一…...
2025 年最新树莓派 Pico 连接 OLED 显示字模汉字详细教程
OLED 概述 OLED(Organic Light-Emitting Diode,有机发光二极管)是一种基于有机材料的发光技术,通过电流驱动有机薄膜发光,具有自发光、高对比度、柔性可弯曲等特点。 4 针脚 OLED 硬件电路如图所示,GND 接…...
【Ubuntu 安装Docker CE-Jenkins】
安装Docker CE(Ubuntu) Install | Docker Docs官网 使用apt仓库安装 DNS配置(可选) #手动替换 sudo vim /etc/systemd/resolved.conf #典型配置如下 [Resolve] DNS8.8.8.8 DNS114.114.114.114 FallbackDNS1.1.1.1 # 备用 DNS#sed替换 sudo sed -i /^#DNS/ {s/#DNS/DNS8.8.8…...
知识图谱 + 大语言模型:打造更聪明、更可靠的AI大脑 —— 探索 GraphRAG 中文优化与可视化实践
大语言模型(LLMs)无疑是近年来人工智能领域最耀眼的明星。它们强大的自然语言理解和生成能力,在文本创作、代码生成、对话交互等众多领域展现了惊人的潜力。然而,当前的 LLMs 并非完美无缺,它们常常面临着“幻觉”&…...
三、【LLaMA-Factory实战】模型微调进阶:从LoRA到MoE的技术突破与工程实践
一、引言 在大模型微调领域,选择合适的训练策略直接决定了效率与效果的平衡。LLaMA-Factory深度整合了参数高效微调(PEFT)、全量微调、混合专家模型(MoE)等12种训练策略,支持从消费级GPU到多卡集群的全场景…...
Photo-SLAM论文理解、环境搭建、代码理解与实测效果
前言:第一个解耦式Photo-SLAM,亮点和效果。 参考:https://zhuanlan.zhihu.com/p/715311759 全网最细PhotoSLAM的conda环境配置教程,拒绝环境污染!!-CSDN博客 1. 环境搭建 硬件:RTX 4090D wi…...
解决pycharm检测不到已经装好的conda的pytorch环境
问题 1.找装anaconda的位置(我装到了py-anacon下) 2.找到下图中的conda.bat 3.pycharm社区版右下角,添加新解释器 4.选conda环境,选择2.中conda.bat的位置,加载环境,使用现有环境,可以看到有选…...
【计算机视觉】3d人脸重建:3DDFA_V2:实时高精度3D人脸重建与密集对齐技术指南
3d人脸重建:3DDFA_V2:实时高精度3D人脸重建与密集对齐技术指南 一、项目概述与技术背景1.1 3DDFA_V2核心价值1.2 技术演进路线1.3 核心技术指标 二、环境配置与模型部署2.1 硬件要求2.2 软件安装基础环境搭建关键组件安装 2.3 模型下载 三、核心算法原理…...
谈判模拟器 - Gemini 2.5 商业优化版
核心目标: 基于深厚的理论知识、丰富的实战经验和前沿的技术洞察,结合麦肯锡领先的谈判策略框架,为用户提供全面、深入、可操作的商业谈判策略指导和建议,助力其在复杂商业环境中达成最优谈判结果,并实现商业价值最大化…...
深度学习系统学习系列【4】之反向传播(BP)四个基本公式推导
文章目录 补充知识:∇ 和 ⊙ 运算符详解∇ (nabla) 运算符⊙ (圆圈点) 运算符 反向传播基本公式计算图和基本定义BP1:输出层误差推导BP1公式的重要性实际例子BP2第 l l l层误差推导BP3 :损失函数关于偏置(b)偏导的推导BP4: 损失函…...
算法每日一题 | 入门-顺序结构-上学迟到
上学迟到 题目描述 学校和 yyy 的家之间的距离为 s 米,而 yyy 以 v 米每分钟的速度匀速走向学校。 在上学的路上,yyy 还要额外花费 10 分钟的时间进行垃圾分类。 学校要求必须在上午 8:00 到达,请计算在不迟到的前提下,yyy 最…...
开源库测试
yolov10 https://github.com/THU-MIG/yolov10 conda create -n yolov10 python3.9 conda activate yolov10 pip install -r requirements.txt pip install -e .报错 找不到对应版本 Could not find a version that satisfies the requirement gradio4.31.5 (from versions:…...
因为gromacs必须安装cuda(系统自带的NVIDIA驱动不行),这里介绍下如何安装cuda
1. 安装步骤 查看是否安装了cuda # 法1 cat /usr/local/cuda/version.txt # 法2 nvcc --version 若没有安装,则查看是否有N卡驱动,若无N卡驱动,则到软件与更新 -> 附加驱动中安装驱动 查看N卡驱动支持的cuda版本 nvidia-smi 如下…...