PE结构之导出表

导出表结构中各种值的意义
​​​​​​

 根据函数地址表遍历函数名称RVA表,和上面的图是逆过程

//函数地址表 和当前内存中的位置DWORD AddressOfFunctionsFOA = RVAToFOA(LPdosHeader, LPexprotDir->AddressOfFunctions);PDWORD LPFunctionsAddressInMemary = (PDWORD)((char*)LPdosHeader + AddressOfFunctionsFOA);//名称序号表的FOA 和在当前内存的位置DWORD AddressOfNameOrdinalsFOA = RVAToFOA(LPdosHeader, LPexprotDir->AddressOfNameOrdinals);PWORD WPNameOrdinalsInMemary = (PWORD)((char*)LPdosHeader + AddressOfNameOrdinalsFOA);//名称字符串RVA表和在当前内存的位置DWORD AddressOfNamesFOA = RVAToFOA(LPdosHeader, LPexprotDir->AddressOfNames);PDWORD LPNamesAddressInMemary= (PDWORD)((char*)LPdosHeader + AddressOfNamesFOA);//遍历函数地址表 ,for (size_t i = 0; i < LPexprotDir->NumberOfFunctions; i++){printf("[%d]",i);/*-----------------------------------------------使用.def文件导出函数时,如果序号之间有空位比如EXPORTSadd    @2sub    @3 NONAMEmul    @7div1    @8那么在函数地址表中就会有 0地址填充-------------------------------------------------*/if (*LPFunctionsAddressInMemary == 0){printf("0x%x\n", *LPFunctionsAddressInMemary);continue;}printf("\t\t\t0x%x", *LPFunctionsAddressInMemary);//遍历名称序号表/*-----------------------------------------------* 如果函数地址表的索引 和 名称序号表中的值相同,说明这个函数* 是以名称导出的-------------------------------------------------*/for (size_t j = 0; j< LPexprotDir->NumberOfNames; j++){if (*WPNameOrdinalsInMemary == i)//如果 函数地址表的索引 == 名称序号表中保存的值,说明这个函数是以 名称导出的{printf("\t\t\t\t%d", *WPNameOrdinalsInMemary);//输出函数的名称/*------------------------------------------------ -* 名称序号表的 索引 就对于 函数名称RVA表 的索引* 这样就可以去找函数名了------------------------------------------------ - */char* str = (char*)LPdosHeader + RVAToFOA(LPdosHeader, LPNamesAddressInMemary[j]);printf("\t\t\t%s\t\t\t%d\n", str, LPexprotDir->Base+ *WPNameOrdinalsInMemary);}WPNameOrdinalsInMemary++;}WPNameOrdinalsInMemary = (PWORD)((char*)LPdosHeader + AddressOfNameOrdinalsFOA);LPFunctionsAddressInMemary++;}

 导出表中 的函数地址表 中存在一种 转发函数

转发函数

可以看到 函数地址表中的RVA 并没有指向可执行的代码(当然我是用pe编辑器打开的,如果纯2进制,完全看不出来差异)  ..而是指向一个字符串 , 格式为 dll的名称.dll中的函数
如何在 dll中判断 这个函数地址表的存放的是函数地址RVA ,还是转发函数,
 

	if (*LPFunctionsAddressInMemary >= LPntHeader32->OptionalHeader.DataDirectory[0].VirtualAddress 
&& 
*LPFunctionsAddressInMemary <= LPntHeader32->OptionalHeader.DataDirectory[0].VirtualAddress + LPntHeader32->OptionalHeader.DataDirectory[0].Size){//说明*LPFunctionsAddressInMemary 保存的RVA是 转发函数,这个rva指向一个字符串,格式为 dll名称.函数名}
在文件中的样式
 

在内存中的样式
 

 利用转发函数这一特性进行dll的注入

利用转发函数的DLL注入
1.13 导出表劫持ShellCode加载-腾讯云开发者社区-腾讯云 (tencent.com)

 

在这篇文章中 ,实际上只是利用dll的搜索路径来 劫持dll ,没有 函数过滤的效果.
DLL劫持学习及复现 - Lushun - 博客园 (cnblogs.com)
这篇文章同样也是通过修改DLL文件名,但是并没有真正的实现函数的转发.

我设想的创建 同参数的函数,修改 导入表中的函数地址表 的RVA指向的转发dll的名称,为自己的dll名称,在同参数的函数最后在调用 需要转发的函数. 这样达到函数过滤的效果.

这种过滤的局限性很大,并且需要修改系统的dll(   不会有人自己的dll使用转发函数吧)


如果只是需要将DLL加载到内存中. 使用导出表劫持,可以保证程序正常的调用>
即使你在DLL中自己调用loadlibrary 将真的dll 加载到内存中.
但是原程序的iat表 的值到底是怎么个事呢

未完待续.......................................................

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/56386.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ssm基于VUE的图书馆管理系统的设计与实现+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 III 第1章 绪论 1 1.1 课题背景 1 1.2 课题意义 1 1.3 研究内容 2 第2章 开发环境与技术 3 …

Android终端GB28181音视频实时回传设计探讨

技术背景 好多开发者&#xff0c;在调研Android平台GB28181实时回传的时候&#xff0c;对这块整体的流程&#xff0c;没有个整体的了解&#xff0c;本文以大牛直播SDK的SmartGBD设计开发为例&#xff0c;聊下如何在Android终端实现GB28181音视频数据实时回传。 技术实现 Andr…

简单说说mysql的mvcc

mvcc的实现依赖什么 事务版本号 每次事务开始之前&#xff0c;都会从数据库获取一个【自增长】的事务id&#xff0c;从这个版本号&#xff0c;可以判断事务的先后顺序 隐式字段 对于innodb存储引擎&#xff0c;每行记录都有两个隐藏列&#xff0c;分别是&#xff1a;trx_id…

java-day11

1.ArrayList 集合和数组的优势对比&#xff1a; 长度可变添加数据的时候不需要考虑索引&#xff0c;默认将数据添加到末尾 1.1 ArrayList类概述 什么是集合 ​ 提供一种存储空间可变的存储模型&#xff0c;存储的数据容量可以发生改变 ArrayList集合的特点 ​ 长度可以变化…

Canal 和 MySQL 配置指南

1. 环境依赖 在开始配置之前&#xff0c;请确保已安装并配置以下环境&#xff1a; Docker&#xff1a;用于运行 MySQL 和 Canal 的容器化服务。 MySQL&#xff1a;确保安装的是支持 binlog 的版本。 Canal&#xff1a;阿里巴巴开源的数据库增量订阅和消费组件。 2. MySQL …

基于ESP32的灌溉系统

精准灌溉优化与高效水资源利用&#xff1a;基于IoT的农业解决方案 引言 传统农业实践缺乏实时监控和高效操作&#xff0c;导致效率低下和产量不高。本项目旨在利用物联网&#xff08;IoT&#xff09;技术和低成本通信协议&#xff0c;设计一个解决方案来解决这一问题。提出的…

C++算法练习-day1——704.二分查找

题目来源&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目思路分析 二分查找是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始&#xff0c;如果中间元素正好是要查找的元素&#xff0c;则搜索过程结束&#xff1b;如果某一特定元素大…

Linux基础 -- 使用 cgroups 变更进程的CPU亲和性绑核

使用 cgroups 设置 CPU 绑定的教学文档 1. 使用 cgroups 设置 CPU 绑定 在 Linux 中&#xff0c;使用 cgroups 可以对进程进行 CPU 绑定&#xff0c;从而控制它们在哪些 CPU 核心上运行。以下是基本步骤&#xff1a; 创建 cgroup&#xff1a; mkdir /sys/fs/cgroup/cpuset/my…

Docker实践与应用举例

目录 1. 引言 2. Docker的基本概念 2.1 什么是Docker容器 2.2 Docker镜像 2.3 Docker架构 3. Docker的应用场景 3.1 开发与测试环境的隔离 3.2 持续集成与持续交付&#xff08;CI/CD&#xff09; 3.3 微服务架构 4. Docker的实践案例 4.1 部署Nginx反向代理 4.2 使用…

研发线上事故风险解读之缓存篇

专业在线打字练习平台-巧手打字通&#xff0c;只输出有价值的知识。 一 前言 本文继续基于《线上事故案例集》&#xff0c;进一步深入梳理线上事故缓存使用方面的问题点&#xff0c;重点关注缓存在使用和优化过程中可能出现的问题&#xff0c;旨在为读者提供具有实践指导意义的…

学习如何将Spring Boot Jar包注册成Windows服务

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在开发Spring Boot应用时&#xff0c;我们通常通过命令行或IDE手动启动项目。然而&#xff0c;在生产环境中&#xff0c;为了提升效率和稳定性&#xff0c;我们更希望应用能够自动启动&#xff0c;并且作为Wi…

OpenCV高级图形用户界面(5)获取指定滑动条(trackbar)的当前位置函数getTrackbarPos()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 返回滑动条的位置。 该函数返回指定滑动条的当前位置。 cv::getTrackbarPos() 函数用于获取指定滑动条&#xff08;trackbar&#xff09;的当前…

【H2O2|全栈】JS入门知识(二)

目录 JS 前言 准备工作 运算符 算数运算符 比较运算符 自增、自减运算符 逻辑运算符 运算符的优先级 分支语句 if-else语句 switch语句 三元表达式 结束语 JS 前言 本系列博客主要分享JavaScript的基础语法知识&#xff0c;本期为第二期&#xff0c;包含一些简…

Linux基础命令系列一小白必掌握

前言 为了有一个大概的复习框架所以先给出总的思维导图&#xff0c;如图&#xff1a; 目录 1.Linux的目录结构&#xff1f;Linux命令与命令行是什么&#xff1f;Linux命令基础格式&#xff1f; 2.ls命令 3.cd命令 4.mkdir命令 5.touch命令 6.cat命令 7.cp命令 8.mv命令…

大数据开发电脑千元配置清单

大数据开发电脑配置清单 电脑型号HUANANZHI 台式电脑操作系统Windows 11 专业版 64位&#xff08;Version 23H2 / DirectX 12&#xff09;处理器英特尔 Xeon(至强) E5-2673 v3 2.40GHz主板HUANANZHI X99-P4T&#xff08;P55 芯片组&#xff09;显卡NVIDIA GeForce GT 610 ( 2…

PLM预训练语言模型Pre-trained Language Model

预训练语言模型&#xff08;Pre-trained Language Model&#xff0c;PLM&#xff09; gpt就是一个典型的例子 一、PLM 的定义与概念 预训练语言模型是一种在大规模文本数据上进行无监督学习得到的语言模型。它通过学习语言的统计规律、语法结构和语义表示&#xff0c;为各种自…

模板方法模式、策略模式(C++)

模板方法模式&#xff1a; 定义&#xff1a;定义一个操作算法的框架&#xff0c;实现步骤延迟到子类中去实现 策略模式&#xff1a; 定义&#xff1a;定义一系列的算法&#xff0c;把它们一个个封装起来&#xff0c;并且使它们可相互替换。该模式使得算法可独立于使用它的客户…

开源GenImage的图片检测工具使用指南

引言 GenImage是一款开源的图片检测工具&#xff0c;旨在帮助用户在各种应用场景中进行图像处理和分析。该工具具有灵活性、可扩展性和高效性&#xff0c;适合从事计算机视觉、图像处理和深度学习的研究人员和开发者使用。本文将详细介绍如何安装、配置和使用GenImage进行图片…

深入剖析递归算法:原理、特点、应用与优化策略

在上一篇文章&#x1f449;【剖析十大经典二叉树题目】中&#xff0c;运用到了大量的递归算法&#xff0c;故本文将解析递归算法。 目录 &#x1f4af;引言 &#x1f4af;递归算法的定义与原理 ⭐定义 ⭐原理 &#x1f4af;递归算法的特点 ⭐简洁性 ⭐可读性 ⭐通用性 …

linux下编译鸿蒙版boost库

我在上一篇文章中介绍了curl和openssl的编译方式&#xff08;linux下编译鸿蒙版curl、openssl-CSDN博客&#xff09;&#xff0c;这篇再介绍一下boost库的编译。 一.环境准备 1.鸿蒙NDK 下载安装方式可以参考上篇文章&#xff0c;完毕后NDK的路径为&#xff1a;/home/ubuntu…