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

兖州网站建设/网站历史权重查询

兖州网站建设,网站历史权重查询,深圳本地网站建设,如何网络推广新产品导出表 什么是导出表? 导出表是PE文件中记录动态链接库(DLL)对外提供的函数或数据的列表,包含函数名称、序号和内存地址等信息,供其他程序调用 我们写一个dll来查看一下导出函数 int exportFunc1(int a, int b) {ret…

导出表


什么是导出表?

导出表是PE文件中记录动态链接库(DLL)对外提供的函数或数据的列表,包含函数名称、序号和内存地址等信息,供其他程序调用

我们写一个dll来查看一下导出函数

int exportFunc1(int a, int b) {return a + b;
}char exportFunc2(char a, char b) {return 'c';
}BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;
}

可以使用IDA等工具查询dll,sys,exe的导出函数

在这里插入图片描述

可以看到在IDA中已经成功的给我们查找出了当前dll的导出函数

如何自通过二进制文本工具查找对应的导入表呢?

首先先回忆一下之前pe的内容

1.DOS头,DOS块
2.NT头,标准pe头,扩展pe头

在扩展pe头的最后一个属性中,就存放着对应的16张表 ( IMAGE_DATA_DIRECTORY )

typedef struct _IMAGE_OPTIONAL_HEADER64 {WORD        Magic;BYTE        MajorLinkerVersion;BYTE        MinorLinkerVersion;DWORD       SizeOfCode;DWORD       SizeOfInitializedData;DWORD       SizeOfUninitializedData;DWORD       AddressOfEntryPoint;DWORD       BaseOfCode;ULONGLONG   ImageBase;DWORD       SectionAlignment;DWORD       FileAlignment;WORD        MajorOperatingSystemVersion;WORD        MinorOperatingSystemVersion;WORD        MajorImageVersion;WORD        MinorImageVersion;WORD        MajorSubsystemVersion;WORD        MinorSubsystemVersion;DWORD       Win32VersionValue;DWORD       SizeOfImage;DWORD       SizeOfHeaders;DWORD       CheckSum;WORD        Subsystem;WORD        DllCharacteristics;ULONGLONG   SizeOfStackReserve;ULONGLONG   SizeOfStackCommit;ULONGLONG   SizeOfHeapReserve;ULONGLONG   SizeOfHeapCommit;DWORD       LoaderFlags;DWORD       NumberOfRvaAndSizes;IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; // 这个结构体数组中就存放着对应16张表的位置和大小
} IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;

第一个结构体数组就存放的是导出表的位置和大小

导出表的结构体

typedef struct _IMAGE_EXPORT_DIRECTORY {DWORD   Characteristics;DWORD   TimeDateStamp;WORD    MajorVersion;WORD    MinorVersion;DWORD   Name;             // DLL名称的RVADWORD   Base;             // 导出函数序号的起始值DWORD   NumberOfFunctions; // 实际导出的函数数量DWORD   NumberOfNames;     // 按名称导出的函数数量DWORD   AddressOfFunctions;    // 函数地址数组的RVADWORD   AddressOfNames;        // 函数名称数组的RVADWORD   AddressOfNameOrdinals; // 函数序号数组的RVA
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;

首先,确认导出表的位置,由于扩展pe头的后面紧跟着的是节表,一个 IMAGE_DATA_DIRECTORY 结构体的大小是8个字节,所以从节表开始的地方向后数128个字节就是导出表开始的位置

在这里插入图片描述

IMAGE_NUMBEROF_DIRECTORY_ENTRIES 结构体中有两个属性

typedef struct _IMAGE_DATA_DIRECTORY {DWORD   VirtualAddress; // 表的虚拟位置DWORD   Size;			// 表的大小(不一定正确)
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

由此可知我们导出表的地址为:0x1B8D0
但是光知道了位置还是不够,这个位置是相对虚拟位置,我们需要把它(RVA)转为FOA(如果内存对齐和文件对齐一至则不用转换)

转换方法和公式之前有讲过

由于我们程序的内存对齐和文件对齐不一致
所以 0x1B8D0 - imageBase 看地址落在在那个节的范围中,然后用0x1B8D0 - 节的起始地址 = 节到当前地址的偏移,最后再通过节表中的PointerToRawData属性 + 偏移求出在文件中的位置

经计算求得导出表在文件中的位置为:0xA8D0

在这里插入图片描述

IMAGE_EXPORT_DIRECTORY 导出表结构体当中第五个属性DWORD Name存放的是导出文件的名称,以及导出的方法名(这里的地址也是一个虚拟地址)

后面重点说一下导出表中的这三个子表属性

  DWORD   AddressOfFunctions;    // 函数地址数组的RVADWORD   AddressOfNames;        // 函数名称数组的RVADWORD   AddressOfNameOrdinals; // 函数序号数组的RVA

AddressOfFunctions的值为(RVA):0x1B8F8->FOA = 0xA8F8
AddressOfNames的值为(RVA):0x1B900->FOA = 0xA900
AddressOfNameOrdinals(RVA):0x1B908->FOA = 0xA908


AddressOfFunctions

通过NumberOfFunctions属性我们可以得知所有的导出函数个数有两个,函数地址是从0xA8F8地址开始,一个地址占4个字节
在这里插入图片描述
按小端序来排列就是 0x110C3 , 0x11069 这两个地址(RVA地址)
通过RVA->FOA后才是真实的方法地址


AddressOfNames

接下来我们看一下导出方法的名称
首先我们看下NumberOfNames这个属性的值,这个值表示有多少个方法是已方法名称导出的(我这里是2表示两个方法都是通过名称导出)

AddressOfNames在文件中的地址为:0xA900,有两个方法都是通过名称导出
在这里插入图片描述
我们就可以知道两个方法名称的地址为:0x1B9220x1B916 (RVA)
转为在文件中的地址就可以知道两个导出方法的名称了


AddressOfNameOrdinals

序号表的个数和按文件导出的个数是一样的
AddressOfNameOrdinals在文件中的地址为:0xA908 (序号表每个为2个字节)
在这里插入图片描述
我们就知道两个值为:0x10x00 (1,0)

函数表是用来通过函数方法名的下标(在第几个方法),再查询序号表,最后再通过序号表中的值去函数地址表通过下标查询 (有点抽象 - 。- )

函数地址表序号表函数名称表
0x4C30x00exportFunc1
0x4690x01exportFunc2
比如我想找 exportFunc1 这个方法的地址,首先这个方法在函数名称表中下标为0,然后再到序
号表中查下标为0的值,查询的值为0,最后再到函数地址表查下标为0的值 (0x4C3),最后查
询到我们要找的函数

Base

base导出函数序号的起始值,在没有通过函数名导出的情况下,还可以通过序号来进行查找,我这个程序的base值为1,就表示函数地址表的下标从1开始找依次递增,最终通过序号来查询出我们的函数地址

注:这里给出的导出函数方式是最简单的,还有几种比较特殊的情况,比如导出函数没有导出方法,导出函数序号不按递增序列增加时

http://www.whsansanxincailiao.cn/news/31963764.html

相关文章:

  • 长沙设计网站效果/百度推广优化技巧
  • jquery 开发网站/建站公司排名
  • 专业制作网站哪家好/sem优化服务公司
  • 电子商务网站流程图/企业建站免费模板
  • 做壁纸的专业网站/郑州高端网站制作
  • 注册公司费用会计分录/深圳白帽优化
  • 怎么做游戏自动充值的网站/广州网站优化外包
  • 求职网站建设/企业网站seo排名优化
  • 重庆短视频seo搜索多少钱/seo网络营销案例分析
  • 徐汇网站建设公司/网络推广seo教程
  • 免费图片制作app软件哪个好/长沙百度搜索排名优化
  • 黑客网站盗qq/磁力链搜索引擎入口
  • 整个网站的关键词/站长工具seo综合查询引流
  • 网站建设和技术服务合同范本/即刻搜索
  • 电子商务网站建设与规划教案/企业关键词优化推荐
  • 案例学习网站建设方案/抖音seo优化公司
  • 校园网站建设目标/网上有免费的网站吗
  • 官方网站建设的目标/北京百度推广优化排名
  • 360全景网站建设/最新军事动态
  • 政府网站管理方案/网站推广渠道
  • 网站开发合同范本大全/百度站长工具平台登录
  • 合肥网站优化费用/天津网站建设开发
  • js特效网站欣赏/徐州seo排名公司
  • 动态网站没有数据库怎么做/磁力搜索器kitty
  • 怎么接单做网站/任何小说都能搜到的软件
  • 建设部门户网站条例免费下载/2345网址导航主页
  • 网站建设需求分析调研/成都sem优化
  • 商城网站建设源码/平台交易网
  • 网站开发是网站后台开发吗/上海seo搜索优化
  • 网站源码酒类/广东做seo的公司