zoukankan      html  css  js  c++  java
  • 导出表微总结

    导入表和导出表是联合使用的!!!
    大部分的dll有导出表,很少的EXE文件才有导出表


    windows装载器在进行PE装载时候,会将导入表中登记的所有DLL一并装入,然后根据DLL的导出表中对导入函数的描述修正导入表的IAT值,

    通过导出表,DLL文件向调用它的程序或者系统提供导出函数的名称,序号,以及入口地址
    导出表的作用:
    1.通过导出表分析不认识的dll中所能提供的功能
    2.向调用PE提供函数指令在模块中的起始地址


    windows加载程序修正导入表IAT过程
    windows加载器将与进程相关的DLL加载到虚拟地址空间以后,会根据导入表中登记的与该动态链接库相关的由INT指向的名称或者编号来遍历DLL

    所在虚拟地址空间,通过函数名或者编号查找导出表结构,从而确定该导出函数在虚拟地址空间中国的起始地址VA,并将VA覆盖导入表的IAT相关

    项,在覆盖IAT的过程中,导出表起到了参照和指引的作用

    导入表的个数与PE加载器的dll数目一致,而导出表只有一个

    typedef struct _IMAGE_EXPORT_DIRECTORY {
    DWORD Characteristics;
    DWORD TimeDateStamp;
    WORD MajorVersion;
    WORD MinorVersion;
    DWORD Name;
    DWORD Base;
    DWORD NumberOfFunctions;
    DWORD NumberOfNames;
    DWORD AddressOfFunctions; // RVA from base of image
    DWORD AddressOfNames; // RVA from base of image
    DWORD AddressOfNameOrdinals; // RVA from base of image
    } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
    记住导出函数有的有名字有的没有所以字段中的NumberOfNames大多数下是小于NumberOfFunctions(函数的个数)
    nBase是导出函数编号的起始地址,某导出函数的第一个编号不是0而是nBase+0等是他的编号
    AddressOfNames 双字 指向的是定义了函数名的函数的字符串地址
    AddressOfNameOrdinals与AddressOfNames是一一对应的,只有有函数名的才有名字对应的序号,看下图
    但是要知道AddressOfNameOrdinals索引号的来源是看的AddressOfFunctions的里面的索引编号
    AddressOfFunctions的索引值对应的Hint/Name的Hint,不是函数编号
    函数编号=索引值+Base

    记住函数的地址走的是AddressOfFunctions最后都要走这,可不是AddressOfNames,它指向的是定义了函数名的函数的字符串地址。不一样

  • 相关阅读:
    org.hibernate.QueryException: could not resolve property
    tomcat启动异常(严重: Dispatcher initialization failed Unable to load configuration.
    MySQL开发规范
    JAVA字符串格式化-String.format()的使用
    使用 Ant 自动生成项目构建版本
    MySQL随机获取数据的方法,支持大数据量
    System.nanoTime与System.currentTimeMillis的区别
    [MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键
    inet_ntoa、 inet_aton、inet_addr
    MySQL关键字(保留字)列表
  • 原文地址:https://www.cnblogs.com/L-Sunny/p/8473548.html
Copyright © 2011-2022 走看看