IAT的全称是Import Address Table,使用易语言完成IAT永久注入主程序,步骤繁杂,难度较大,请参考以下文章:
http://www.511yj.com/eyuyan-iat-hook.html
IAT注入步骤
1、读入注入文件
2、获取注入DLL长度
3、获取注入DLL文件数据地址
4、获取被注入文件的DOS头,DOS头长度40
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、自定义新节,新节是加在被注入文件的最后
14、文本到字节 (“.gdata”, 自定义新节.Name) ' 自定义新节名
15、自定义新节在内存中的大小,编辑框2.内容DLL路径
16、自定义新节在内存中的地址
17、自定义新节在文件中的大小
18、自定义新节在文件中的地址
19、自定义新节特征
20、 修改PE文件头和PE可选文件头
修改节数目
21、修改输入表大小
22、修改输入表地址
23、修改映射文件大小
24、修改节表数据
25、修改PE头数据
26、生成新的输入表
27、生成新的文件数据
28、生成新的文件名
IAT注入源码:
.版本 2 .子程序 IAT注入, 逻辑型 .参数 文件名, 文本型, , 被注入的文件路径名称 .参数 函数名, 文本型, , 注入的DLL中的函数名称 .局部变量 文件数据, 字节集 .局部变量 文件数据长度, 整数型 .局部变量 文件数据地址, 整数型 .局部变量 DOS头, IMAGE_DOS_HEADER .局部变量 PE头, IMAGE_NT_HEADERS .局部变量 输入表地址, 整数型 .局部变量 输入表, 字节集 .局部变量 节表数组, IMAGE_SECTION_HEADER, , "0" .局部变量 自定义新节, IMAGE_SECTION_HEADER .局部变量 i, 整数型 文件数据 = 读入文件 (文件名) 文件数据长度 = 取字节集长度 (文件数据) 文件数据地址 = lstrcpyn_字节集 (文件数据, 文件数据, 0) ' 获取被注入文件的DOS头,DOS头长度40 RtlMoveMemory_IMAGE_DOS_HEADER (DOS头, 文件数据地址, 64) ' 判断被注入文件是否是PE文件,DOS头的开始两个字节一直都是MZ(5A4D) .如果真 (DOS头.e_magic ≠ #IMAGE_DOS_SIGNATURE) 信息框 (“不是一个有效的PE文件1”, 0, , ) 返回 (假) .如果真结束 ' 获取被注入文件的NT头(PE头),NT头长度F8 RtlMoveMemory_IMAGE_NT_HEADERS_1 (PE头, 文件数据地址 + DOS头.e_lfanew, 248) ' 判断被注入文件是否是PE文件,NT头的开始两个字节一直都是PE(4550) .如果真 (PE头.Signature ≠ #IMAGE_NT_SIGNATURE) 信息框 (“不是一个有效的PE文件2”, 0, , ) 返回 (假) .如果真结束 ' 获取输入表地址头,输入表地址在PE可选文件头数据目录数组中第二个 输入表地址 = PE头.OptionalHeader.DataDirectory [2].VirtualAddress .如果真 (输入表地址 = 0) 信息框 (“没有输入表!”, 0, , ) 返回 (假) .如果真结束 ' 获取输入表数据,忽略最后保留的14个00字节 输入表 = 指针到字节集 (文件数据地址 + 输入表地址, PE头.OptionalHeader.DataDirectory [2].Size - 20) ' 重定义节表数组,节表数目来至PE文件头NumberOfSections 重定义数组 (节表数组, 假, PE头.FileHeader.NumberOfSections) ' 获取节表数组,每个节长度是28个字节 RtlMoveMemory_IMAGE_SECTION_HEADER_1 (节表数组, 文件数据地址 + DOS头.e_lfanew + 248, PE头.FileHeader.NumberOfSections × 40) ' 改变.rdata区段特征 .计次循环首 (取数组成员数 (节表数组), i) .如果真 (输入表地址 ≥ 节表数组 [i].VirtualAddress 且 输入表地址 ≤ 节表数组 [i].VirtualAddress + 节表数组 [i].Misc) ' 2147483648代表IMAGE_SCN_MEM_WRITE(内存可写节) 节表数组 [i].Characteristics = 2147483648 跳出循环 () .如果真结束 .计次循环尾 () ' 自定义新节,新节是加在被注入文件的最后 ' 文本到字节 (“.gdata”, 自定义新节.Name) ' 自定义新节名 自定义新节.Name = 取字节集数据 (到字节集 (“.gdata”), #长整数型, ) ' 自定义新节在内存中的大小,编辑框2.内容DLL路径 自定义新节.Misc = PE头.OptionalHeader.DataDirectory [2].Size + 20 + 8 + 取文本长度 (_启动窗口.编辑框2.内容) + 1 + 2 + 取文本长度 (函数名) + 1 ' 自定义新节在内存中的地址 自定义新节.VirtualAddress = PE头.OptionalHeader.SizeOfImage ' 自定义新节在文件中的大小 自定义新节.SizeOfRawData = 自定义新节.Misc ' 自定义新节在文件中的地址 自定义新节.PointerToRawData = 文件数据长度 ' 自定义新节特征 自定义新节.Characteristics = #IMAGE_SCN_MEM_WRITE 加入成员 (节表数组, 自定义新节) ' 修改PE文件头和PE可选文件头 ' 修改节数目 PE头.FileHeader.NumberOfSections = PE头.FileHeader.NumberOfSections + 1 ' 修改输入表大小 PE头.OptionalHeader.DataDirectory [2].Size = PE头.OptionalHeader.DataDirectory [2].Size + 20 ' 修改输入表地址 PE头.OptionalHeader.DataDirectory [2].VirtualAddress = 自定义新节.VirtualAddress ' 修改映射文件大小 PE头.OptionalHeader.SizeOfImage = PE头.OptionalHeader.SizeOfImage + 自定义新节.Misc ' 修改节表数据 RtlMoveMemory_IMAGE_SECTION_HEADER_2 (文件数据地址 + DOS头.e_lfanew + 248, 节表数组, PE头.FileHeader.NumberOfSections × 40) ' 修改PE头数据 RtlMoveMemory_IMAGE_NT_HEADERS_2 (文件数据地址 + DOS头.e_lfanew, PE头, 248) ' 生成新的输入表 输入表 = 输入表 + 取空白字节集 (12) + 到字节集 (到整数 (自定义新节.VirtualAddress + PE头.OptionalHeader.DataDirectory [2].Size + 8)) + 到字节集 (到整数 (自定义新节.VirtualAddress + PE头.OptionalHeader.DataDirectory [2].Size)) + 取空白字节集 (20) + 到字节集 (到整数 (自定义新节.VirtualAddress + PE头.OptionalHeader.DataDirectory [2].Size + 8 + 取文本长度 (_启动窗口.编辑框2.内容) + 1)) + { 0, 0, 0, 0 } + 到字节集 (_启动窗口.编辑框2.内容) + { 0, 0, 0 } + 到字节集 (函数名) + { 0 } ' 生成新的文件数据 文件数据 = 文件数据 + 输入表 ' 生成新的文件名 文件名 = 子文本替换 (文件名, 文件取扩展名 (文件名), “_注入后” + 文件取扩展名 (文件名), , , 真) 复制文件 (选中DLL, 文件取目录 (文件名) + _启动窗口.编辑框2.内容) .如果真 (写到文件 (文件名, 文件数据) = 假) 信息框 (“生成新的文件失败,请稍后再试!”, 0, , ) 返回 (假) .如果真结束 信息反馈 (“注入并生成新的文件成功!新文件地址:” + 文件名) 信息反馈 (“DLL文件已经复制到新文件目录中!”) 返回 (真)
教程获取下载:
百度网盘链接:https://pan.baidu.com/s/158ikKVjIwaoF4438MG4fhA
提取码:加QQ群:521068947 群文件下载
资源教程交流①群:521068947
511遇见QQ: 272586593