易语言IAT注入

了解IAT注入

IAT的全称是Import Address Table。

IAT注入DLL‘就是修改一个程序的输入表,添加一个DLL进去,在这个程序运行前,就会运行你那个DLL里面的代码。

原理:

PE文件中的每一个导入表都代表一个库(dll),所以你添加一个导入表时,当你调用函数时就会去加载相应的DLL而达到注入。

IAT 注入 的主要思路就是在PE 中增加一个节,然后将导入表拷贝到当前的节中,在导入表后面增加一个新的导入项,并将导入表重定向到当前的表中。

一般情况下,我们的节头到段的真正的开始位置是有一定的空闲区域的。

每个dll一个IAT表,一般而言,这些IAT表都是统一存储在一起的。由于每个IAT表是以0结尾。

易语言IAT注入步骤

1、读入文件
2、获取文件数据长度
3、获取文件数据地址
4、获取DOS头
5、判断是否是PE文件,DOS头的开始两个字节一直都是MZ(5A4D)
6、获取NT头(PE头),NT头长度F8
7、 判断是否是PE文件,NT头的开始两个字节一直都是PE(4550)
8、获取输入表地址头,输入表地址在PE可选文件头数据目录数组中第二个
9、获取输入表数据,忽略最后保留的14个00字节
10、重定义节表数组,节表数目来至PE文件头NumberOfSections
11、获取节表数组,每个节长度是28个字节
12、改变.rdata区段特征
13、自定义新节,新节是加在文件的最后,文本到字节 (“.gdata”, 自定义新节.Name) ' 自定义新节名
14、 自定义新节在内存中的大小
15、自定义新节在内存中的地址
16、自定义新节在文件中的大小
17、自定义新节在文件中的地址
18、自定义新节特征
19、加入成员 (节表数组, 自定义新节)
20、修改PE文件头和PE可选文件头
21、 修改节数目
22、修改输入表大小
23、修改输入表地址
24 修改映射文件大小
25、修改节表数据
26、修改PE头数据
27、生成新的输入表
28、生成新的文件名

这是一个IAT永久注入的流程

自定义数据格式

DOS头(IMAGE_DOS_HEADER)

.版本 2

.数据类型 IMAGE_DOS_HEADER, , DOS头结构
.成员 e_magic, 短整数型, , , 魔数 一直都是MZ(0x5A4D)
.成员 e_cblp, 短整数型, , , 文件最后一页的字节数
.成员 e_cp, 短整数型, , , 文件的页数
.成员 e_crlc, 短整数型, , , 重定位信息
.成员 e_cparhdr, 短整数型, , , 段落中头部信息的大小
.成员 e_minalloc, 短整数型, , , 需要的最少额外段
.成员 e_maxalloc, 短整数型, , , 需要的最多额外段
.成员 e_ss, 短整数型, , , 初始的(相对的)SS寄存器值
.成员 e_sp, 短整数型, , , 初始的SP寄存器值
.成员 e_csum, 短整数型, , , 校验和
.成员 e_ip, 短整数型, , , 初始的IP寄存器值
.成员 e_cs, 短整数型, , , 初始的(相对的)CS寄存器值
.成员 e_lfarlc, 短整数型, , , 重定位表在文件中的地址
.成员 e_ovno, 短整数型, , , 覆盖数
.成员 e_res, 短整数型, , "4", 保留字 占用8个字节
.成员 e_oemid, 短整数型, , , OEM识别符(为e_oeminfo准备)
.成员 e_oeminfo, 短整数型, , , OEM信息; e_oemid详细说明
.成员 e_res2, 短整数型, , "10", 保留字 占用20个字节
.成员 e_lfanew, 整数型, , , 新exe头在文件中的地址。 Pe文件头真正开始处

NT头结果(PE头) IMAGE_NT_HEADERS

.版本 2

.数据类型 IMAGE_NT_HEADERS, , NT头结果(PE头)
.成员 Signature, 整数型, , , 魔数 PE文件开始标志,一直都是0x00004550
.成员 FileHeader, IMAGE_FILE_HEADER, , , 文件头结构
.成员 OptionalHeader, IMAGE_OPTIONAL_HEADER, , , 可选文件头结构

节表数组IMAGE_SECTION_HEADER

.版本 2

.数据类型 IMAGE_SECTION_HEADER, , 节描述结构
.成员 Name, 长整数型, , , 节名
.成员 Misc, 整数型, , , “PhysicalAddress(物理地址)”和“VirtualSize(虚拟大小)”组成的共用体
.成员 VirtualAddress, 整数型, , , 在内存中的地址
.成员 SizeOfRawData, 整数型, , , 在文件中的大小
.成员 PointerToRawData, 整数型, , , 在文件中的地址。如果是0,节数据不包含在文件内,在加载时被确定。
.成员 PointerToRelocations, 整数型, , , 重定位指针
.成员 PointerToLinenumbers, 整数型, , , 行数指针
.成员 NumberOfRelocations, 短整数型, , , 重定位数目
.成员 NumberOfLinenumbers, 短整数型, , , 行数数目
.成员 Characteristics, 整数型, , , 特征

文件头结构IMAGE_FILE_HEADER

.版本 2

.数据类型 IMAGE_FILE_HEADER, , 文件头结构PE文件头
.成员 Machine, 短整数型, , , 处理器型号
.成员 NumberOfSections, 短整数型, , , 节数目
.成员 TimeDateStamp, 整数型, , , Pe文件创建日期
.成员 PointerToSymbolTable, 整数型, , , 符号表指针,用于调试信息,一般为0
.成员 NumberOfSymbols, 整数型, , , 符号数 ,用于调试信息,一般为0
.成员 SizeOfOptionalHeader, 短整数型, , , 可选头大小
.成员 Characteristics, 短整数型, , , 文件特性

可选文件头结构IMAGE_OPTIONAL_HEADER

.版本 2

.数据类型 IMAGE_OPTIONAL_HEADER, , 可选文件头结构
.成员 Magic, 短整数型, , , 魔数
.成员 MajorLinkerVersion, 字节型, , , 链接器主版本号
.成员 MinorLinkerVersion, 字节型, , , 链接器次版本号
.成员 SizeOfCode, 整数型, , , 代码段大小
.成员 SizeOfInitializedData, 整数型, , , 已初始化的数据大小
.成员 SizeOfUninitializedData, 整数型, , , 未初始化的数据大小
.成员 AddressOfEntryPoint, 整数型, , , 程序入口点地址
.成员 BaseOfCode, 整数型, , , 代码地址
.成员 BaseOfData, 整数型, , , 数据地址
.成员 ImageBase, 整数型, , , 映像基址。加载到内存时优先加载的地址。
.成员 SectionAlignment, 整数型, , , 内存中单元块大小
.成员 FileAlignment, 整数型, , , 文件中单元块大小
.成员 MajorOperatingSystemVersion, 短整数型, , , 操作系统主版本号
.成员 MinorOperatingSystemVersion, 短整数型, , , 操作系统次版本号
.成员 MajorImageVersion, 短整数型, , , 映像文件主版本号
.成员 MinorImageVersion, 短整数型, , , 映像文件次版本号
.成员 MajorSubsystemVersion, 短整数型, , , 子系统主版本号
.成员 MinorSubsystemVersion, 短整数型, , , 子系统次版本号
.成员 Win32VersionValue, 整数型, , , 保留项,Win32版本值,一般为0
.成员 SizeOfImage, 整数型, , , 映像文件大小
.成员 SizeOfHeaders, 整数型, , , 所有头的大小 所有头的总和,包括数据目录和节头
.成员 CheckSum, 整数型, , , 校验和,对当前版本的NT,只校验映像是否是NT驱动程序。
.成员 Subsystem, 短整数型, , , 子系统
.成员 DllCharacteristics, 短整数型, , , DLL特性,貌似废弃了
.成员 SizeOfStackReserve, 整数型, , , 保留的栈大小
.成员 SizeOfStackCommit, 整数型, , , 交付使用的栈大小
.成员 SizeOfHeapReserve, 整数型, , , 保留的堆大小
.成员 SizeOfHeapCommit, 整数型, , , 交付使用的堆大小
.成员 LoaderFlags, 整数型, , , 加载器标志,貌似废弃了
.成员 NumberOfRvaAndSizes, 整数型, , , 数据目录个数
.成员 DataDirectory, IMAGE_DATA_DIRECTORY, , "16", 数据目录数组

数据目录数组IMAGE_DATA_DIRECTORY

.版本 2

.数据类型 IMAGE_DATA_DIRECTORY, , 数据目录结构
.成员 VirtualAddress, 整数型, , , 虚拟地址
.成员 Size, 整数型, , , 大小

用到的API

.版本 2

.DLL命令 lstrcpyn_字节集, 整数型, "kernel32.dll", "lstrcpyn", 公开, 字节集形式,将一个指定的字符字符串从一个源字符串复制到一个缓冲区中。如果函数成功,则返回值是指向缓冲区的指针
.参数 lpString1, 字节集, 传址, 目的指针,有传址
.参数 lpString2, 字节集, 传址, 源指针,有传址
.参数 iMaxLength, 整数型, , 复制长度,保留,0

.DLL命令 RtlMoveMemory_IMAGE_DOS_HEADER, , "kernel32", "RtlMoveMemory", 公开, 整数型,从指定内存中复制内存至另一内存里
.参数 Destination, IMAGE_DOS_HEADER, , 指向移动目的地址的指针
.参数 Source, 整数型, , 指向要复制的内存地址的指针。
.参数 Length, 整数型, , 指定要复制的长度。

.DLL命令 RtlMoveMemory_IMAGE_NT_HEADERS_1, , "kernel32", "RtlMoveMemory", 公开, 整数型,从指定内存中复制内存至另一内存里
.参数 Destination, IMAGE_NT_HEADERS, , 指向移动目的地址的指针
.参数 Source, 整数型, , 指向要复制的内存地址的指针。
.参数 Length, 整数型, , 指定要复制的长度。

.DLL命令 RtlMoveMemory_IMAGE_NT_HEADERS_2, , "kernel32", "RtlMoveMemory", 公开, 整数型,从指定内存中复制内存至另一内存里
.参数 Destination, 整数型, , 指向移动目的地址的指针
.参数 Source, IMAGE_NT_HEADERS, , 指向要复制的内存地址的指针。
.参数 Length, 整数型, , 指定要复制的长度。

.DLL命令 RtlMoveMemory_IMAGE_SECTION_HEADER_1, , "kernel32", "RtlMoveMemory", 公开, 整数型,从指定内存中复制内存至另一内存里
.参数 Destination, IMAGE_SECTION_HEADER, 数组, 指向移动目的地址的指针
.参数 Source, 整数型, , 指向要复制的内存地址的指针。
.参数 Length, 整数型, , 指定要复制的长度。

.DLL命令 RtlMoveMemory_IMAGE_SECTION_HEADER_2, , "kernel32", "RtlMoveMemory", 公开, 整数型,从指定内存中复制内存至另一内存里
.参数 Destination, 整数型, , 指向移动目的地址的指针
.参数 Source, IMAGE_SECTION_HEADER, 数组, 指向要复制的内存地址的指针。
.参数 Length, 整数型, , 指定要复制的长度。

.DLL命令 PathFindExtensionA, 文本型, "shlwapi.dll", "PathFindExtensionA", 公开, 获取绝对路径或文件名中的文件扩展名
.参数 pszPath, 文本型, , 文件路径


发布日期:

所属分类: 易语言 标签: