当前位置: 首页 > news >正文

PE结构之绑定导入表

 打印绑定导入表

//打印 绑定导入表
BOOL PrintBoundImport(__in char* m_fileName)
{char* Filebuffer = NULL;if (!GetFileBuffer(m_fileName, &Filebuffer)) return FALSE;PIMAGE_DOS_HEADER LPdosHeader = NULL;PIMAGE_NT_HEADERS LPntHeader = NULL;LPdosHeader = (PIMAGE_DOS_HEADER)Filebuffer;LPntHeader = (PIMAGE_NT_HEADERS)((CHAR*)LPdosHeader + LPdosHeader->e_lfanew);//如果是32位程序if (LPntHeader->OptionalHeader.Magic == 0x10b){PIMAGE_NT_HEADERS32 LPntHeader32 = LPntHeader;LPntHeader = NULL;PIMAGE_DATA_DIRECTORY LPdirBoundImport = &LPntHeader32->OptionalHeader.DataDirectory[11];PIMAGE_BOUND_IMPORT_DESCRIPTOR LPBoundImport = (CHAR*)LPdosHeader + RVAToFOA(LPdosHeader, LPdirBoundImport->VirtualAddress);CHAR* NameBase = LPBoundImport;while (LPBoundImport->TimeDateStamp != 0 && LPBoundImport->OffsetModuleName != 0){printf("时间戳:0x%x dll名字偏移:0x%x ForwarderRefs结构数量: %d  dll名字 %s\n",LPBoundImport->TimeDateStamp, LPBoundImport->OffsetModuleName, LPBoundImport->NumberOfModuleForwarderRefs,(NameBase+ LPBoundImport->OffsetModuleName));LPBoundImport++;}return TRUE;}else{PIMAGE_NT_HEADERS64 LPntHeader64 = LPntHeader;LPntHeader = NULL;PIMAGE_DATA_DIRECTORY LPdirBoundImport = &LPntHeader64->OptionalHeader.DataDirectory[11];PIMAGE_BOUND_IMPORT_DESCRIPTOR LPBoundImport = (CHAR*)LPdosHeader + RVAToFOA(LPdosHeader, LPdirBoundImport->VirtualAddress);CHAR* NameBase = LPBoundImport;while (LPBoundImport->TimeDateStamp != 0 && LPBoundImport->OffsetModuleName != 0){printf("时间戳:0x%x dll名字偏移:0x%x ForwarderRefs结构数量: %d  dll名字 %s\n",LPBoundImport->TimeDateStamp, LPBoundImport->OffsetModuleName, LPBoundImport->NumberOfModuleForwarderRefs, (NameBase + LPBoundImport->OffsetModuleName));LPBoundImport++;}return TRUE;}
}

 IAT 表中的数据,在文件中可能已经不和INT表一样了,已经保存了需要导入的函数的VA(内存地址或者说绝对地址). 如果IMAGE_IMPORT_DESCRIPTOR结构(导入表的结构)中的TimeDateStamp==0 ,表示 没有绑定 ,如果为-1,说明已经绑定,这时 IAT表的数据已经是导入函数的VA了

IAT 中的 IMAGE_THUNK_DATA 结构将被导入函数的实际地址覆盖。磁盘上的可执行文件具有其 IAT 中其他 DLL 中 API 的实际内存地址。加载绑定的可执行文件时,Windows 加载程序可以绕过查找每个导入的 API 并将其写入 IAT 的步骤。正确的地址已经在那里了!但是,这只有在DLL正确对齐时才会发生
Inside Windows:深入了解 Win32 可移植可执行文件格式,第 2 部分 |Microsoft 学习

 

http://www.lryc.cn/news/458939.html

相关文章:

  • 【python学习】1-2 配置python系统环境变量
  • 日均千万订单的交易平台设计稿
  • 如何在 iPad 上恢复已删除的历史记录?
  • Haar cascade训练人脸小模型做人脸辨别
  • DBA | 如何将 .mdf 与 .ldf 的数据库文件导入到SQL Server 数据库中?
  • 【差分数组】个人练习-Leetcode-3229. Minimum Operations to Make Array Equal to Target
  • HTML5--裸体回顾
  • 【网络安全】CVE-2024-46990: Directus环回IP过滤器绕过实现SSRF
  • 问:JVM的垃圾收集算法你知道哪些,有什么区别?
  • Python selenium库学习使用实操四
  • 用Go开发跨平台GUI
  • 云原生开发 - 工具镜像(简约版)
  • Mac 电脑pink 后端ip地址进行本地联调
  • iPhone使用指南:如何在没有备份的情况下从 iPhone 恢复已删除的照片
  • 黑马程序员 javaWeb基础学习,精细点复习【持续更新】
  • 【C++设计模式】行为型模式:中介者模式
  • 关于C语⾔内存函数 memcpy memmove memset memcmp
  • 华为---Super VLAN简介及示例配置
  • PHP 中浮点数 array_sum 求和精度丢失问题
  • llava1.5论文阅读
  • 【学术会议投稿链接】React前端框架:构建现代Web应用的强大工具
  • Linux: network: tcp: sk_tx_skb_cache;4.18.0-283.el8;多分配内存
  • 电脑报错msvcp100.dll丢失怎么办?这些方法快速修复
  • pymc的安装还是pymc3?
  • 汉语言文学做大数据七年实际工作经验分享普通人快来围观
  • Linux使用Docker部署Paperless-ngx结合内网穿透打造无纸化远程办公
  • PointNet系列论文阅读与理解
  • 反转链表解题思路
  • 【MySQL 保姆级教学】数据库基础(重点)(2)
  • Nginx从入门到实战(八):版本平滑无感知,不停机升级