易语言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].Size20)
 
' 重定义节表数组,节表数目来至PE文件头NumberOfSections
重定义数组 (节表数组, 假, PE头.FileHeader.NumberOfSections)
 
' 获取节表数组,每个节长度是28个字节
RtlMoveMemory_IMAGE_SECTION_HEADER_1 (节表数组, 文件数据地址 + DOS头.e_lfanew248, PE头.FileHeader.NumberOfSections × 40)
 
' 改变.rdata区段特征
.计次循环首 (取数组成员数 (节表数组), i)
 
    .如果真 (输入表地址 ≥ 节表数组 [i].VirtualAddress 且 输入表地址 ≤ 节表数组 [i].VirtualAddress + 节表数组 [i].Misc)
        ' 2147483648代表IMAGE_SCN_MEM_WRITE(内存可写节)
        节表数组 [i].Characteristics2147483648
        跳出循环 ()
    .如果真结束
 
.计次循环尾 ()
 
' 自定义新节,新节是加在被注入文件的最后
' 文本到字节 (“.gdata, 自定义新节.Name)  ' 自定义新节名
自定义新节.Name = 取字节集数据 (到字节集 (“.gdata”), #长整数型, )
' 自定义新节在内存中的大小,编辑框2.内容DLL路径
自定义新节.Misc = PE头.OptionalHeader.DataDirectory [2].Size208 + 取文本长度 (_启动窗口.编辑框2.内容)12 + 取文本长度 (函数名)1
' 自定义新节在内存中的地址
自定义新节.VirtualAddress = PE头.OptionalHeader.SizeOfImage
' 自定义新节在文件中的大小
自定义新节.SizeOfRawData = 自定义新节.Misc
' 自定义新节在文件中的地址
自定义新节.PointerToRawData = 文件数据长度
' 自定义新节特征
自定义新节.Characteristics = #IMAGE_SCN_MEM_WRITE
加入成员 (节表数组, 自定义新节)
 
' 修改PE文件头和PE可选文件头
' 修改节数目
PE头.FileHeader.NumberOfSections = PE头.FileHeader.NumberOfSections1
' 修改输入表大小
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_lfanew248, 节表数组, PE头.FileHeader.NumberOfSections × 40)
 
' 修改PE头数据
RtlMoveMemory_IMAGE_NT_HEADERS_2 (文件数据地址 + DOS头.e_lfanew, PE头, 248)
 
' 生成新的输入表
输入表 = 输入表 + 取空白字节集 (12) + 到字节集 (到整数 (自定义新节.VirtualAddress + PE头.OptionalHeader.DataDirectory [2].Size8)) + 到字节集 (到整数 (自定义新节.VirtualAddress + PE头.OptionalHeader.DataDirectory [2].Size)) + 取空白字节集 (20) + 到字节集 (到整数 (自定义新节.VirtualAddress + PE头.OptionalHeader.DataDirectory [2].Size8 + 取文本长度 (_启动窗口.编辑框2.内容)1)){ 0, 0, 0, 0 } + 到字节集 (_启动窗口.编辑框2.内容){ 0, 0, 0 } + 到字节集 (函数名){ 0 }
 
' 生成新的文件数据
文件数据 = 文件数据 + 输入表
 
' 生成新的文件名
文件名 = 子文本替换 (文件名, 文件取扩展名 (文件名), “_注入后” + 文件取扩展名 (文件名), , ,)
 
复制文件 (选中DLL, 文件取目录 (文件名) + _启动窗口.编辑框2.内容)
 
.如果真 (写到文件 (文件名, 文件数据) = 假)
    信息框 (“生成新的文件失败,请稍后再试!”, 0, , )
    返回 ()
.如果真结束
信息反馈 (“注入并生成新的文件成功!新文件地址:” + 文件名)
信息反馈 (“DLL文件已经复制到新文件目录中!”)
返回 ()

教程获取下载:


发布日期:

所属分类: 易语言 标签: