PE文件的导入表,动态链接库中的函数应该如何导入

导入地址表IAT

  1. IAT保存的内容与windos操作系统的核心进程、内存、DLL结构有关。IAT是一种表格,用来记录程序正在使用哪些库中的哪些函数。

动态链接库(DLL)

  1. 常见的kernel.dll就是一个非常重要的动态链接库,其中包含了运行程序时需要使用到的函数,后续结合导入描述符(IMAGE_IMPORT_DESCRIPTOR)中的内容,观察PE装载器时如何将kernel.dll中需要用到的函数装载进入到IAT中的。

导入函数

  1. 一个程序往往需要使用到多个动态链接库,其以结构体的形式存在于IMPORT Directory Table(导入表)中。

  2. 这里依旧以上一篇的hello.exe文件为例, 首先要找到IMPORT Directory Table(导入表)的位置,这在上一篇文章中有详细介绍(PE文件格式),定位到00003000:

  3. 这里可以看到整个导入表,导入表是一个数组,其最后一个元素为NULL(权全为00),当前数组共有两个元素,即两个DLL需要导入,其中的每一个元素结构体为IMAGE_IMPORT_DESCRIPTOR(导入描述符):

  4. 前四个字节为INT,其指向了该动态链接库要导入哪些函数,最后一个 FirstThunk为“”IAT“”,即PE文件加载到内存中时函数地址需要填入的位置,倒数第二个name字段则指向了该动态链接库的名称的地址(这里的地址都是RVA(在内存中的偏移),要变成在文件中的偏移FOA需要里面前面那片文章中的公式进行转换)。

  5. 86E8->36E8,动态链接库名称的位置:在这里插入图片描述

  6. 从动态链接库中导入函数时,首先需要在IID中拿到OriginalFirstThunk(INT),这里存储了所有需要导入的函数信息,是一个指针数组(其中存储都是以RVA的形式),数组中的每一个元素均指向结构体为IMAGE_IMPORT_BY_NAME的元素,IMAGE_IMPORT_BY_NAME第一个元素为函数的编号(hint),第二个元素时需要导入的函数的名字,下面以kernel.dll来为实例观察需要导入哪些函数:

  7. 根据kernel.dll的IMAGE_IMPORT_DESCRIPTOR的第一个元素定位到INT,其中的RVA需要转化为FOA在文件中的偏移,兄弟们看上一篇后自行转化过来:在这里插入图片描述

  8. 观察其中的第一个元素0000836C,它指明了第一个函数IMAGE_IMPORT_BY_NAME结构体的RVA,转化为FOA 0000336C,观察在文件中的偏移:

  9. 首位的010D是函数的编号,后面是函数的名称DeleteCriticalSection,那他要被装载到内存中的什么地方呢,就需要根据前面的IMAGE_IMPORT_DESCRIPTOR(导入描述符)中的IAT指明的位置RVA 000081D4,下面进入到内存中观察函数是否被装载到此处。
    10.使用x64dbg打开hello.exe文件 :

  10. 可以看到文件被加载到内存中的基地址是400000(ImageBase),后续要根据ImageBase基地址和RVA偏移地址相加求出VA绝对地址:000081D4+400000=4081D4,在内存中跳转到该位置,查看其内容是否为DeleteCriticalSection函数的地址:在这里插入图片描述

  11. 根据内存中4081D4内存地址处的注释,可以确定该处的值00007FF99FD2A710是函数DeleteCriticalSection的起始地址,后续共kermel.dll需要导入的23个函数全部导入到内存中。

  12. 在内存中可以直接使用RVA来查看一下动态链接库的名字是不是在ImageBase+RVA处,根据前面的RVA86E8,在内存中跳转到4086E8

  13. 接着在INT中看下一个函数,RVA是00008384->00003384,可以看出编号是0131,名字是EnterCriticalSection

  14. 下面再内存中找到RVA为000081D4,观察该处后面第二个位置函数是不是EnterCriticalSection(第一个位置的函数已经被导入),结合内存中的值可以说是一模一样,后面的函数一次再INT中取值,找到对应的函数名,通过GetProcAddress方法拿到对应函数的地址,再将其填入IAT,一致循环知道INT被拿完,则所需的kernel.dll动态链接库中的全部函数均导入完毕。后续第二个动态链接库msvcrt.dll也依照上面的方法进行导入:

  15. 另外,再代码中我们可以看到,调用动态链接库导入的函数,都是以取一个地址后,call该地址处的值来进行调用,而不是直接call函数的地址,为什么要进行一次中转呢?:

  16. 第一点:hello.exe等可执行文件,并不知道自己要工作再哪总平台上,哪种环境中,再各种不同的环境下kernel.dll的版本都不相同,而相应库中的函数位置也不相同,所以不能直接再call后面跟上函数的具体地址(这样就只能保证在当前一个平台下使用),需要给定一个内存单元(如4081D4),程序在具体环境下运行时,动态的将需要的库函数地址放在此处。

  17. 第二点:DLL的重定位DLL文件的imageBase不会时一个固定的值,如果内存中该位置被占了,那么PE装载器就需要重新定位基地址,所以无法直接将函数的实际地址直接写在指令中,并且PE文件中也指定kernel.dll中导入的函数应该在内存中的RVA()。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文件操作(1)

为什么使⽤⽂件? 如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的…

再谈C语言——理解指针(四)

assert断⾔ assert.h 头⽂件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报错终⽌运⾏。这个宏常常被称为“断⾔”。 assert(p ! NULL); 上⾯代码在程序运⾏到这⼀⾏语句时,验证变量 p 是否等于 NULL 。…

JavaScript 数学对象 Math

Math对象其实就是数学对象&#xff0c;它给我们提供了各种各样的数学功能。 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>首页</title> </head><body><script type"text/javascript"&g…

linux的“>”和“>>”

在Linux中&#xff0c;>和>>都是用于文件重定向的操作符&#xff0c;它们用于将命令的输出发送到文件中。 > 用于创建一个新文件或覆盖现有文件的内容。当你执行一个如 command > file.txt 的命令时&#xff0c;如果 file.txt 文件存在&#xff0c;它的内容将被…

【uniapp】引入uni-ui组件库

&#xff08;1&#xff09;新建项目的时候选择 uni-ui项目 &#xff08;2&#xff09;已经创建好的项目去官网单独安装 跳转单独安装组件 https://uniapp.dcloud.net.cn/component/uniui/quickstart.html#%E9%80%9A%E8%BF%87-uni-modules-%E5%8D%95%E7%8B%AC%E5%AE%89%E8%A3%8…

YOLOv9训练损失、精度、mAP绘图功能 | 支持多结果对比,多结果绘在一个图片(消融实验、科研必备)

一、本文介绍 本文给大家带来的是YOLOv9系列的绘图功能&#xff0c;我将向大家介绍YOLO系列的绘图功能。我们在进行实验时&#xff0c;经常需要比较多个结果&#xff0c;针对这一问题&#xff0c;我写了点代码来解决这个问题&#xff0c;它可以根据训练结果绘制损失(loss)和mA…

VBA技术资料MF144:将PDF首页作为对象插入工作表

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

【C++】如何用C++写一个日期计算器

目录 前言 代码的布局 设计数据 方法声明 方法的实现 获取某年某月的天数 *全缺省的构造函数 * 拷贝构造函数 *赋值运算符重载 *析构函数 日期天数 日期天数 日期-天数 日期-天数 前置 后置 后置-- 前置-- 实现比较大小运算符重载思路 >运算符重载 运算…

盲人餐厅点餐:科技之光照亮餐桌上的美食之旅

在现代社会&#xff0c;餐厅不仅是满足口腹之欲的场所&#xff0c;更是一个社交、放松的重要空间。然而&#xff0c;对于视障人士而言&#xff0c;盲人餐厅点餐这一日常行为&#xff0c;却往往伴随着诸多不便与挑战。幸运的是&#xff0c;科技的革新正为这一群体带来前所未有的…

递归神经网络(RNN)在AI去衣技术中的深度应用

在人工智能&#xff08;AI&#xff09;技术飞速发展的今天&#xff0c;图像处理和计算机视觉领域不断取得新的突破。其中&#xff0c;AI去衣技术作为一个具有挑战性的研究方向&#xff0c;引起了广大研究者和公众的关注。递归神经网络&#xff08;RNN&#xff09;作为深度学习的…

【linux】编译器使用

目录 1. gcc &#xff0c;g 编译器使用 a. 有关gcc的指令&#xff08;g同理&#xff09; 2. .o 文件和库的链接方式 a. 链接方式 b. 动态库 和 静态库 优缺点对比 c. debug 版本 和 release 版本 1. gcc &#xff0c;g 编译器使用 a. 有关gcc的指令&#xff08;g同理&…

【第19章】spring-i8n

文章目录 前言一、准备二、Java国际化1.测试类2.测试结果 三、Spring国际化1.配置文件2.测试类3.测试结果4.占位符4.1 准备4.2 测试类4.3 测试结果 总结 前言 在Spring中实现国际化Internationalization&#xff08;i18n&#xff09;其实就是完成语言的切换&#xff0c;类似于…

4.SpringCloud基础项目搭建利用RestTemplate实现远程调用

简单的微服务架构 父pom.xml <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apa…

短信视频提取批量工具,免COOKIE,博主视频下载抓取,爬虫

痛点&#xff1a;关于看了好多市面的软件&#xff0c;必须要先登录自己的Dy号才能 然后找到自己的COOKIE 放入软件才可以继续搜索&#xff0c;并且无法避免长时间使用 会导致无法正常显示页面的问题。 有没有一种方法 直接可以使用软件&#xff0c;不用设置的COOKIE的方法呢 …

Linux驱动开发:掌握SPI通信机制

目录标题 1、SPI简介2、SPI通信机制3、Linux内核中的SPI支持4、SPI核心API5、SPI控制器驱动6、SPI设备驱动 7、编写SPI设备驱动8、调试SPI驱动 在Linux驱动开发中&#xff0c;串行外设接口(SPI)是一种常见的高速全双工通信协议&#xff0c;用于连接处理器和各种外设。本文将深入…

会声会影滤镜怎么用 会声会影滤镜效果怎么调 会声会影视频制作教程

在进行视频剪辑时&#xff0c;合理地运用滤镜效果可以提升视频的观赏性&#xff0c;使你的作品更加出彩。这篇文章便一起来学习会声会影滤镜怎么用&#xff0c;会声会影滤镜效果怎么调。 一、会声会影滤镜怎么用 使用会声会影的滤镜效果非常简单&#xff0c;以下是具体的操作…

Rust腐蚀服务器定制地图开服

Rust腐蚀服务器定制地图开服 大家好我是艾西一个做服务器租用的网络架构师。Rust腐蚀这个游戏有很多的插件mod作者&#xff0c;在地图制作这一块也是一样&#xff0c;有些好玩的地图可能大家在map网站找到了但是不知道怎么操作设置那么今天艾西给大家说下特定定制地图怎么弄。…

Penpad获Gate Labs以及Scroll联创Sandy的投资

近期&#xff0c;Scroll上的LaunchPad &聚合收益平台Penpad迎来了重磅利好&#xff0c;该平台在前不久获得了来自于Gate Las的融资&#xff0c;在此后其又获得了Scroll联合创始人Sandy的融资&#xff0c;这也让Penpad平台成为了近期Scroll生态中最值得关注的项目之一。 事实…

《生成式AI导论》学习笔记

1.课程定位 2.什么是生成式人工智慧&#xff1f; 3. 今日的生成式人工智慧厉害在哪里&#xff1f; 4.训练不了人工智慧&#xff1f;那我训练自己 5.训练不了人工智慧&#xff1f;你可以训练你自己&#xff08;中&#xff09;——拆解问题使用工具 6.大语言模型修炼史——第一阶…

毕业设计注意事项(2024届更新中)

1.开题 根据学院发的开题报告模板完成&#xff0c;其中大纲部分可参考资料 2.毕设 根据资料中的毕设评价标准&#xff0c;对照工作量 3.论文 3.1 格式问题 非常重要&#xff0c;认真对比资料中我发的模板&#xff0c;格式有问题&#xff0c;答辩输一半&#xff01; 以word…