导入表

数据目录表的第二项为导入表
导入表 即 应用程序需要调用函数的地址一个表

导入表结构
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
DWORD OriginalFirstThunk;//指向INT表 导入名字表
DWORD TimeDateStamp;
DWORD ForwarderChain;
DWORD Name;
DWORD FirstThunk;//指向IAT表 导入地址表
} IMAGE_IMPORT_DESCRIPTOR, *PIMAGE_IMPORT_DESCRIPTOR;

导入表结构是 多个连续的IMAGE_IMPORT_DESCRIPTOR结构体,可以用Name来判断是否遍历完.

OriginalFirstThunk 指向INT表
IMAGE_THUNK_DATA32结构为4字节大小 如果这个值的最高位(32位)为1 那么剩下的31位为所需要函数的导出序号(该函数在dll中是以序号导出的),如果为0,那么这个值是IMAGE_IMPORT_BY_NAME结构的RVA

typedef struct _IMAGE_IMPORT_BY_NAME {
WORD Hint;
CHAR Name[1];
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
该结构的前两个字节为函数在地址表的索引(没多大用),第三个字节是函数名字的开始。

在这里插入图片描述

Name
DLL文件的名字RVA,从结果可以看出导入表的dll名字都是挨在一起的。
在这里插入图片描述
在这里插入图片描述

FirstThunk
指向IAT表 ,一般情况下,在程序加载前IAT表的值与INT表一样。在加载后,IAT表的值为函数的地址。
在加载时,通过INT表找到第一个函数的名字,然后通过GetProcAddress得到函数的地址,写入IAT表同样索引的位置。然后找第二个函数的地址,遍历完INT表,IAT表的地址也就写入完成。

还有一种情况是IAT表在加载前就直接写成了绝对地址,所需DLL的ImageBase设置成不同的值,这个表即可在程序加载前直接写入。通过_IMAGE_IMPORT_DESCRIPTOR的TimeDateStamp(时间戳)可以判断导入表是否被绑定,当这个值为0时,未绑定,这个值为-1时,被绑定。

typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR {
DWORD TimeDateStamp;
WORD OffsetModuleName;
WORD NumberOfModuleForwarderRefs;
// Array of zero or more IMAGE_BOUND_FORWARDER_REF follows
} IMAGE_BOUND_IMPORT_DESCRIPTOR, *PIMAGE_BOUND_IMPORT_DESCRIPTOR;

绑定导入表,位于数据目录表的第12项。它的TimeDateStamp记录了绑定的时间。
OffsetModuleName 模块的名字RVA
NumberOfModuleForwarderRefs 这个模块所依赖的DLL个数,有几个DLL依赖项,它的后面就跟着几个_IMAGE_BOUND_FORWARDER_REF结构

typedef struct _IMAGE_BOUND_FORWARDER_REF {
DWORD TimeDateStamp;时间戳
WORD OffsetModuleName; DLL文件名的偏移
WORD Reserved;
} IMAGE_BOUND_FORWARDER_REF, *PIMAGE_BOUND_FORWARDER_REF;
OffsetModuleName真正的文件名=第一个绑定导入表的开始地址+这个偏移
最后一个绑定导入表为全0结构
在这里插入图片描述

修复IAT表

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用MySQL的命令行工具或者图形界面工具,例如Navicat等,在工具中打开相应的数据库,然后执行导入数据的SQL语句。另外,也可以使用LOAD DATA INFILE命令导入数据。具体操作方法可以参考MySQL官方文档或者相关的教程。 ### 回答2: 在sqlyang中,导入可以通过以下步骤完成: 1. 首先,确保你拥有待导入的数据文件。常见的数据文件格式可以是CSV、TXT或XLS等。 2. 打开sqlyang,连接到你的数据库。你可以使用如下命令连接到数据库: ``` mysql -h 主机名 -u 用户名 -p 密码 ``` 其中,主机名是你数据库所在的主机名,用户名是你的数据库用户名,密码是你的数据库密码。 3. 在sqlyang的命令行中,使用以下命令来导入: ``` LOAD DATA INFILE '文件路径' INTO TABLE 名; ``` 其中,文件路径是待导入数据文件的完整路径,名是你想要导入数据的目标的名称。 4. 如果你的数据文件采用不同的分隔符(如逗号、制符等),你需要在LOAD DATA INFILE命令中指定分隔符。例如,如果你的数据文件采用逗号分隔,你可以使用以下命令: ``` LOAD DATA INFILE '文件路径' INTO TABLE 名 FIELDS TERMINATED BY ','; ``` 这样,sqlyang就会根据逗号作为字段的分隔符。 5. 导入的同时,你可以选择指定数据的格式、列的顺序和插入条件等。根据你的需求,你可以使用LOAD DATA INFILE命令的不同选项来完成。 6. 导入的过程可能需要一些时间,具体取决于你的数据文件的大小和服务器的性能。完成导入后,sqlyang会显示导入的行数以及其他相关信息。 以上就是在sqlyang中导入的简单介绍,希望对你有帮助! ### 回答3: 要导入到sqlyang中,可以按照以下步骤操作: 1. 打开sqlyang软件。 2. 在软件的菜单栏中找到“文件”选项,并点击打开。 3. 在弹出的文件选择窗口中,找到要导入的文件路径,并选择该文件。 4. 点击“打开”按钮,软件将读取并加载该文件。 5. 在软件界面的侧边栏或菜单栏中找到“导入”选项,并点击打开。 6. 在弹出的导入设置窗口中,可以选择设置的属性、字段和数据类型等。 7. 在设置完成后,点击“确定”按钮,软件将开始导入的过程。 8. 导入完成后,可以在软件的界面上查看导入以及其内容。 需要注意的是,导入的过程可能需要根据具体的结构和导入设置进行适当的调整和配置,并且要确保导入的文件格式符合sqlyang的要求。若导入过程中出现错误或问题,可以参考软件的帮助文档或咨询相关专业人士进行解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值