• 导出表微总结


    导入表和导出表是联合使用的!!!
    大部分的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,它指向的是定义了函数名的函数的字符串地址。不一样

  • 相关阅读:
    SAP的一些HR函数
    如何在sap的screen中使用ListBox
    关于SAP的SD的定价公式的资料(强力推荐,有时间我会进行翻译)
    如何设计和使用自定义的权限对象(自定义权限检查函数)
    [转载]ASP.NET面试题收集
    [转载]sql in与exists区别
    删除A数据表中的一行数据时,不小心将表名写成了B,现在想恢复B中刚删除的的着一行数据怎么办
    删除A数据表中的一行数据时,不小心将表名写成了B,现在想恢复B中刚删除的的着一行数据怎么办
    oracle优化总结经验
    oracle优化总结经验
  • 原文地址:https://www.cnblogs.com/L-Sunny/p/8473548.html
Copyright © 2020-2023  润新知