首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

读取IMAGE_EXPORT_DIRECTORY以查找导出的函数名称会导致访问冲突

读取IMAGE_EXPORT_DIRECTORY以查找导出的函数名称是一种在Windows操作系统中常见的技术,用于动态链接库(DLL)的导出函数的查找。IMAGE_EXPORT_DIRECTORY是PE文件格式中的一个数据结构,它记录了DLL中所有导出函数的信息。

通过读取IMAGE_EXPORT_DIRECTORY,开发人员可以获取到导出函数的名称、序号和地址等信息,从而实现在运行时动态加载和调用这些函数。这种技术在软件开发中非常常见,特别是在开发插件、扩展和动态链接库等场景中。

优势:

  1. 动态加载:通过读取IMAGE_EXPORT_DIRECTORY,可以在运行时动态加载需要的函数,而不需要在编译时将所有函数都链接到可执行文件中。这样可以减小可执行文件的大小,并且在运行时根据需要加载函数,提高了灵活性和效率。
  2. 模块化开发:通过将功能封装为动态链接库,并通过导出函数的方式提供接口,可以实现模块化开发。不同的模块可以独立开发和维护,通过导出函数的方式进行交互,提高了代码的复用性和可维护性。
  3. 版本管理:通过导出函数的方式,可以实现对DLL的版本管理。当需要更新某个功能时,只需要替换对应的DLL文件,而不需要修改其他代码。这样可以简化更新和发布过程,提高了系统的可维护性和可扩展性。

应用场景:

  1. 插件系统:通过读取IMAGE_EXPORT_DIRECTORY,可以实现插件系统,允许第三方开发者开发插件并动态加载到主程序中,扩展主程序的功能。
  2. 动态链接库开发:在开发动态链接库时,可以使用读取IMAGE_EXPORT_DIRECTORY的技术,提供导出函数给其他程序调用。
  3. 反射机制:某些编程语言或框架可以利用读取IMAGE_EXPORT_DIRECTORY的技术,实现反射机制,动态获取和调用函数。

推荐的腾讯云相关产品:

腾讯云提供了丰富的云计算产品和服务,以下是一些与云计算相关的产品和服务:

  1. 云服务器(ECS):提供弹性计算能力,可根据实际需求弹性调整计算资源。
  2. 云数据库MySQL版(CDB):提供高可用、可扩展的数据库服务,适用于各种规模的应用。
  3. 云存储(COS):提供安全、稳定、低成本的对象存储服务,适用于存储和处理大量的非结构化数据。
  4. 人工智能平台(AI Lab):提供丰富的人工智能算法和模型,帮助开发者快速构建和部署人工智能应用。
  5. 物联网平台(IoT Hub):提供物联网设备接入、数据管理和应用开发的一站式解决方案。

更多腾讯云产品和服务的详细介绍,请参考腾讯云官方网站:https://cloud.tencent.com/

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

二进制技巧-利用非传统方法显示调用 api 函数

此处存储着当前找到模块中所有的导出函数名称,通过与这些字符串逐个比较,可以找到指定函数名称。...Index作为偏移量,查找对应 ordinal 值,类似 AddressOfNameOrdinals[Index] 查找导出函数地址,流程转移到导出函数地址数组位置,即 IMAGE_EXPORT_DIRECTORY.AddressOfFunctions...得到 ordinal值为数组索引,得到函数起始地址,很像AddressOfFunctions[ordinal] 备注:有的模块是序号导出,因此直接 Index== ordinal 导致找不到,...了解导出结构 导出结构如下: IMAGE_EXPORT_DIRECTORY ,IMAGE_OPTIONAL_HEADER32.DataDirectory[0].VirtualAddress 值就是...hashedi loop_funcname: ; lodsb ; 逐字节读取esi中保存函数名称,结果放入eax中 ror edi

99840

驱动开发:内核解析PE结构导出

通过导出表,DLL文件可以向系统提供导出函数名称、序号和入口地址等信息,以便Windows装载器能够通过这些信息来完成动态链接整个过程。...导出起始位置有一个IMAGE_EXPORT_DIRECTORY结构,与导入表中有多个IMAGE_IMPORT_DESCRIPTOR结构不同,导出表只有一个IMAGE_EXPORT_DIRECTORY...DWORD NumberOfNames; // 名称导出函数总数 DWORD AddressOfFunctions; // 导出函数地址表RVA...DWORD AddressOfNames; // 函数名称地址表RVA DWORD AddressOfNameOrdinals; // 函数名序号表RVA } IMAGE_EXPORT_DIRECTORY...); 最后读取导出表就要将一个磁盘中文件映射到内存中,内存映射核心文件时ZwMapViewOfSection()该系列函数在应用层名叫MapViewOfSection()只是一个是内核层一个应用层,这两个函数参数传递基本一致

18820
  • PE文件详解(七)

    例如当DLL 文件一旦升级或修改就可能导致调用改DLL 程序无法加载到需要函数。...; 导出函数总数 NumberOfNames DWORD ? ; 名称方式导出函数总数 AddressOfFunctions DWORD ?...从函数名称查找入口地址 如果已知函数名称,如何得到函数入口地址呢?...如果某一项定义函数名与要查找函数名符合,那么记下这个函数名在字符串地址表中索引值,然后在 AddressOfNamesOrdinals 指向数组中同样索引值取出数组项值,我们这里假设这个值是...x 最后, x 值作为索引值,在 AddressOfFunctions 字段指向函数入口地址表中获取 RVA 就是函数入口地址 一帮情况下病毒程序就是通过函数名称查找入口地址,因为病毒程序作为一段额外代码被附加到可执行文件中

    95810

    驱动开发:内核解析PE结构导出

    通过导出表,DLL文件可以向系统提供导出函数名称、序号和入口地址等信息,以便Windows装载器能够通过这些信息来完成动态链接整个过程。...导出起始位置有一个IMAGE_EXPORT_DIRECTORY结构,与导入表中有多个IMAGE_IMPORT_DESCRIPTOR结构不同,导出表只有一个IMAGE_EXPORT_DIRECTORY...DWORD NumberOfNames; // 名称导出函数总数 DWORD AddressOfFunctions; // 导出函数地址表RVA...DWORD AddressOfNames; // 函数名称地址表RVA DWORD AddressOfNameOrdinals; // 函数名序号表RVA} IMAGE_EXPORT_DIRECTORY...可得到导出数量,通过(PUCHAR)pDosHeader + pExportTable->AddressOfNames得到导出地址,依次循环读取即可得到完整导出表。

    32380

    PE知识复习之PE导出

    一个就是所有函数导出个数.一个就是以名字进行导出个数. DLL是可以序号导出. ? 所有函数导出是 62d个函数. 名字导出是 62d个函数....如果有按照序号导出.那么函数导出个数就会跟所有函数导出个数不一样. 那么就有公式可以计算出. 未导出函数是多少个. 所有导出函数个数 - 名字导出个数 == 差值个数....存储大小 跟导出函数名字导出个数 这个成员来决定. 名称导出函数个数 例如为10 .那么函数名称表就可以存储10个RVA. 每一个为4个字节....那么他是如何实现.如何通过名字查找函数地址. 或者如何通过序号进行查找函数地址? 首先我们要分成三张表,函数地址表中序号开始位置是导出表成员Base指定.假设为0开始.....先去遍历函数名称表.

    1.5K20

    PE格式:手工实现IAT导入表注入劫持

    DLL注入有多种方式,今天介绍这一种注入方式是通过修改导入表,增加一项导入DLL以及导入函数,我们知道当程序在被运行起来之前,其导入表中导入DLL与导入函数会被递归读取加载到目标空间中,我们向导入表增加导入函数同样可以实现动态加载...图片第五项是Name字段:2280 是RVA 将其转为FOA图片跳转到1080处发现时该DLL原始名称,这个名称就算把名字改掉,名称不会变。图片第七八项,代表导出函数个数。...图片RVA = 2268 其FOA = 0x00001068 它指向函数名字指针地址。图片2268 指向了 1068 而1068中存放了四个指针,分别指向四个导出函数名称。...被注入到多个进程中,此时就需要对DLL中数据进行重定位,确保特定函数还能够被调用到。...图片第一个300e为例,将其转为FOA = 0x0000140E,定位过去,程序没被装载,这里为空,装在后可能重定位修复。图片PETools解析后,可对比,计算结果无误。图片

    68700

    PE格式:手工实现IAT导入表注入劫持

    DLL注入有多种方式,今天介绍这一种注入方式是通过修改导入表,增加一项导入DLL以及导入函数,我们知道当程序在被运行起来之前,其导入表中导入DLL与导入函数会被递归读取加载到目标空间中,我们向导入表增加导入函数同样可以实现动态加载...msg函数名称 最后转到我们后面导入表位置,在后面填充这些位置。...第五项是Name字段:2280 是RVA 将其转为FOA 跳转到1080处发现时该DLL原始名称,这个名称就算把名字改掉,名称不会变。 第七八项,代表导出函数个数。...RVA = 2268 其FOA = 0x00001068 它指向函数名字指针地址。 2268 指向了 1068 而1068中存放了四个指针,分别指向四个导出函数名称。...,此时就需要对DLL中数据进行重定位,确保特定函数还能够被调用到。

    52910

    2.6 PE结构:导出表详细解析

    导出表(Export Table)是Windows可执行文件中一个结构,记录了可执行文件中某些函数或变量名称和地址,这些名称和地址可以供其他程序调用或使用。...导出表中包含了三种信息: 函数名称:记录了可执行文件中导出函数名称,在其他程序中调用时需要用到这个名称函数地址:记录了可执行文件中导出函数地址,使用时需要调用该函数地址。...通过导出表,DLL文件可以向系统提供导出函数名称、序号和入口地址等信息,以便Windows装载器能够通过这些信息来完成动态链接整个过程。...导出起始位置有一个IMAGE_EXPORT_DIRECTORY结构与导入表中有多个IMAGE_IMPORT_DESCRIPTOR结构不同,导出表只有一个IMAGE_EXPORT_DIRECTORY结构...// 导出函数起始序号 DWORD NumberOfFunctions; // 导出函数总数 DWORD NumberOfNames; // 名称导出函数总数

    21020

    2.6 PE结构:导出表详细解析

    导出表(Export Table)是Windows可执行文件中一个结构,记录了可执行文件中某些函数或变量名称和地址,这些名称和地址可以供其他程序调用或使用。...导出表中包含了三种信息:函数名称:记录了可执行文件中导出函数名称,在其他程序中调用时需要用到这个名称函数地址:记录了可执行文件中导出函数地址,使用时需要调用该函数地址。...通过导出表,DLL文件可以向系统提供导出函数名称、序号和入口地址等信息,以便Windows装载器能够通过这些信息来完成动态链接整个过程。...导出起始位置有一个IMAGE_EXPORT_DIRECTORY结构与导入表中有多个IMAGE_IMPORT_DESCRIPTOR结构不同,导出表只有一个IMAGE_EXPORT_DIRECTORY结构.../ 导出函数起始序号 DWORD NumberOfFunctions; // 导出函数总数 DWORD NumberOfNames; // 名称导出函数总数

    43410

    PE格式:手写PE结构解析工具

    当PE文件被装载时候,Windows装载器根据xxxx处RVA得到函数名,再根据函数名在内存中找到函数地址,并且用函数地址将xxxx处内容替换成真正函数地址。...通过导出表,DLL文件可以向系统提供导出函数名称、序号和入口地址等信息,以便Windows装载器能够通过这些信息来完成动态链接整个过程。...导出起始位置有一个IMAGE_EXPORT_DIRECTORY结构与导入表中有多个IMAGE_IMPORT_DESCRIPTOR结构不同,导出表只有一个IMAGE_EXPORT_DIRECTORY结构...DWORD NumberOfNames; // 名称导出函数总数 DWORD AddressOfFunctions; // 导出函数地址表RVA...DWORD AddressOfNames; // 函数名称地址表RVA DWORD AddressOfNameOrdinals; // 函数名序号表RVA} IMAGE_EXPORT_DIRECTORY

    1.5K20

    PE格式:手写PE结构解析工具

    当PE文件被装载时候,Windows装载器根据xxxx处RVA得到函数名,再根据函数名在内存中找到函数地址,并且用函数地址将xxxx处内容替换成真正函数地址。...通过导出表,DLL文件可以向系统提供导出函数名称、序号和入口地址等信息,以便Windows装载器能够通过这些信息来完成动态链接整个过程。...导出起始位置有一个IMAGE_EXPORT_DIRECTORY结构与导入表中有多个IMAGE_IMPORT_DESCRIPTOR结构不同,导出表只有一个IMAGE_EXPORT_DIRECTORY结构...DWORD NumberOfNames; // 名称导出函数总数 DWORD AddressOfFunctions; // 导出函数地址表RVA...DWORD AddressOfNames; // 函数名称地址表RVA DWORD AddressOfNameOrdinals; // 函数名序号表RVA } IMAGE_EXPORT_DIRECTORY

    99320

    PE格式第六讲,导出

    导出表,作用就是我们写DLL或者EXE导出函数,那么记载这些函数.作用就是这个 那么是你自己设计导出表,你要怎么设计....;      //函数导出函数个数 DWORD AddressOfFunctions; // 导出函数地址表RVA(入口地址) DWORD AddressOfNames...; // 函数名称地址表RVA(名称表) DWORD AddressOfNameOrdinals; // 函数序号地址表(序号表) } IMAGE_EXPORT_DIRECTORY...)位置,是不是DLL名称,0结尾 红色方块第二个,base成员,起始导出序号,这个很重要,一会讲解 红色方块第三个,这个我直接把两个4字节弄在一起来,要分开来看,  第一个四个字节,3,表示了所有导出函数是...此时Base成员作用就来了,它默认是1,那么我们输入3序号时候,减去base值,得出下标,再去序号表中查找.

    1K60

    完美实现GetProcAddress

    一般指函数名称字符串地址,也可能是指序号,如何区分呢?...} { //这里是函数名称导出 } 最终真找到匹配函数地址,然后返回就ok了,但是前提是你需要了解PE导出表 下面简单说一下...,从这个数开始递增 NumberOfFunctions 本dll一共有多少个导出函数,不管是以序号还是以函数导出 NumberOfFunctions 本dll中能够函数名称导出函数个数(注意...,说一下,其实函数每一个函数都能通过序号导出,但是为了兼容性等等,也给一些函数提供用函数名称导出) AddressOfFunctions 指向一个DWORD数组首地址,共有NumberOfFunctions...,怎样做dll才会出现查找导出地址时候返回一个字符串呢?

    2.6K10

    Hells Gate一次尝试入门

    ,我们在根据Flink值查找对应结构时,一定要减去16字节,保证我们正确对齐(x86或x64皆如此)。...WORD类型(16位无符号整数),并存储在EAX寄存器中,并且实际上我们是能够动态获得系统调用号,NtOpenProcess为例: 图片 这就是地狱之门原理,直接读取进程第二个导入模块,也就是...NtDLL,解析结构然后遍历导出表,根据函数哈希找到函数地址,将这个函数读取出来后通过0xb8操作码动态获取对应系统调用号,从而绕过内存监控,在自己程序中执行了NTDLL导出函数而不是直接LoadLibrary...图片 取得导出表后,我们需要循环遍历导出表内导出函数名称与地址,根据djb2算法加密函数名称拿到指定导出函数 //利用djb2算法提前加密好dwhash,等待后续与后期导出函数名称进行对比查找指定函数...GetVxTableEntry,在这里我们将遍历模块内导出函数用以查找指定函数,并判断模块中导出函数是否被hook,以及取得函数系统调用号、函数地址、dwHash获得PVX_TABLE_ENTRY完整结构

    1.1K20

    PE解析器编写(四)——数据目录表解析

    ; //在读取这些数据时候,是从内存中读取,从内存中读取时,需要考虑文件被加载到内存中基址 return (PIMAGE_IMPORT_DESCRIPTOR)RVA2fOffset...这个值对它最高位进行判断,如果为0,那么就可以获得函数名称,在获得名称时,也是需要注意函数名称在Unicode环境下需要转化。...导出结构如下: typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; //属性信息...,数组中每一项是一个RVA 值,存储是所有导出函数入口地址,数组元素个数等于NumberOfFunctions AddressOfNames:这个RVA指向一个包含所有导出函数名称指针...在dll中导出一个函数A,它会根据这个函数名称名称表中查找,假设它找到函数名称表中第x项与之相同,那么它会在AddressOfNameOrdinals表中查找第x项得到函数序号,最后根据这个序号在

    1.6K20

    逆向初级-PE(五)

    ; //函数名字导出函数个数 DWORD AddressOfFunctions; // RVA from base of image 导出函数地址表RVA DWORD...:导出函数个数 2个 NumberOfNames:函数名字导出函数个数 2个 AddressOfFunctions:导出函数地址表RVA AddressOfNames:导出函数名称表...序号是两个字节,序号个数跟函数名称个数相同 这里序号为0和1 4、参考 总共四个函数 所有导出函数个数为5,因为序号中间隔了个14没有。...函数个数 = 最大序号 - 最小序号 + 1 函数导出函数个数为3,因为有一个函数没有名字 把函数地址对应二进制复制到OD里面,可以查看到具体是什么函数 5.12.导入表_确定依赖模块 1、...{ WORD Hint; //可能为空,编译器决定,如果不为空,是函数导出表中索引 BYTE Name[1]; //函数名称0结尾 } IMAGE_IMPORT_BY_NAME

    1.2K30

    PE文件和COFF文件格式分析——导出

    你想,当我们调用GetProcAddress时,我们在导入名称表中找到该名称对应index,然后再返回导出函数地址表中该index数据即可。...针对以上问题,可能有人会想到,有多少个导出函数名(导出函数数量为标准)就设置多少个导出地址,导出地址表中数据可以重复,比如上图中ParseXML和XMLParse函数名对应导出地址都设置成0xXXXXXXXX...通过以上分析,我们可以得出,我们还是要一个能在导出函数地址表和导出函数名称表建立纽带结构体。这个我们期待辅助结构体就是我们下面介绍导出序数表。   导出序数表。...是的,它元素数量和导出名称元素数量是一样。可能有人疑问,什么这个表元素个数不是和导出地址表元素个数一致呢?...比如我们导出地址表有1个函数入口,而我们有2个函数名都指向这个地址,那么导出序数表个数如果是1,则如何表示这两个名称函数入口对应呢?

    55210
    领券