VMP保护程序dll/exe合成工具,通用DLL注入器/PE补丁

易语言 2020-03-07 17:13:42

VMP保护程序dll/exe合成工具,通用DLL注入器/PE补丁

读入文件和DLL数据
文件数据 = 读入文件 (文件名)
DLL数据 = 读入文件 (DLL文件)
DLL数据 = 子字节集替换 (DLL数据, #明月DOSPE标记头 + #NOP1024 + #NOP1024 + #NOP1024 + #NOP1024, #明月DOSPE标记头 + 取字节集左边 (文件数据, 4096), , )
载入的DLL数据 = #Load + DLL数据
文件数据地址 = 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头.OptionalHeader.ImageBase
映像大小 = PE头.OptionalHeader.SizeOfImage
区段数目 = PE头.FileHeader.NumberOfSections
文件入口地址 = PE头.OptionalHeader.AddressOfEntryPoint
' 建立一个内存文件并将文件数据写入
文件号 = 打开内存文件 ()
写出字节集 (文件号, 文件数据)
' 移动到PE头.OptionalHeader.SizeOfImage的位置
移动读写位置 (文件号, #文件首, DOS头.e_lfanew + 80)
' 改变映像文件大小
写出字节集 (文件号, 到字节集 (到整数 (PE头.OptionalHeader.SizeOfImage + 取内存对齐值 (取字节集长度 (载入的DLL数据), PE头.OptionalHeader.SectionAlignment))))
' 移动到PE头.FileHeader.NumberOfSections的位置
移动读写位置 (文件号, #文件首, DOS头.e_lfanew + 6)
' 改区段数目 +1
写出字节集 (文件号, 到字节集 (到整数 (区段数目 + 1)))
重定义数组 (PE区段表, 假, 区段数目 + 1)
' 获取原有区段表
.计次循环首 (PE头.FileHeader.NumberOfSections, i)
RtlMoveMemory_IMAGE_SECTION_HEADER_3 (PE区段表 [i], 文件数据地址 + DOS头.e_lfanew + 208 + i × 40, 40)
.计次循环尾 ()
' 移动到区段表最后
移动读写位置 (文件号, #文件首, DOS头.e_lfanew + 208 + (区段数目 + 1) × 40)
PE区段表 [区段数目 + 1].Name = 取字节集数据 (到字节集 (“.gdata”), #长整数型, ) ' 自定义新区段名
PE区段表 [区段数目 + 1].Misc = 取字节集长度 (载入的DLL数据) ' 自定义新区段在内存中的大小
PE区段表 [区段数目 + 1].VirtualAddress = 取内存对齐值 (PE区段表 [区段数目].VirtualAddress + PE区段表 [区段数目].Misc, PE头.OptionalHeader.SectionAlignment) ' 自定义新区段在内存中的地址
PE区段表 [区段数目 + 1].SizeOfRawData = 取字节集长度 (载入的DLL数据) ' 自定义新区段在文件中的大小
PE区段表 [区段数目 + 1].PointerToRawData = 取内存对齐值 (PE区段表 [区段数目].PointerToRawData + PE区段表 [区段数目].SizeOfRawData, PE头.OptionalHeader.FileAlignment) ' 自定义新区段在文件中的地址
PE区段表 [区段数目 + 1].PointerToRelocations = 0 ' 自定义新区段重定位指针
PE区段表 [区段数目 + 1].PointerToLinenumbers = 0 ' 自定义新区段行数指针
PE区段表 [区段数目 + 1].NumberOfRelocations = 0 ' 自定义新区段重定位数目
PE区段表 [区段数目 + 1].NumberOfLinenumbers = 0 ' 自定义新区段行数数目
PE区段表 [区段数目 + 1].Characteristics = #IMAGE_SCN_MEM_EXECUTE ' 自定义新区段特性
' 保存新区段在文件中的地址
新区段文件地址 = PE区段表 [区段数目 + 1].PointerToRawData
' 写入新区段
写出字节集 (文件号, 区段块结构转换 (PE区段表 [区段数目 + 1]))
' 在文件最后写入长度为载入的DLL数据空白数据
移到文件尾 (文件号)
插入字节集 (文件号, 取空白字节集 (取字节集长度 (载入的DLL数据)))
' 读出新的文件数据
移到文件首 (文件号)
文件数据 = 读入字节集 (文件号, 取文件长度 (文件号))
关闭文件 (文件号)
' 获取新的文件数据1开始地址
文件数据地址 = lstrcpyn_字节集 (文件数据, 文件数据, 0)
' 建立一个内存文件并将新的文件数据1写入
文件号 = 打开内存文件 ()
写出字节集 (文件号, 文件数据)
' 移动到新区段地址
移动读写位置 (文件号, #文件首, 新区段文件地址)
' push dll数据地址
写入数据 = { 104 } + 到字节集 (到整数 (映像基址 + PE区段表 [区段数目 + 1].VirtualAddress + 15 + 取字节集长度 (#Load)))
写出字节集 (文件号, 写入数据)
' 移动到新区段地址+5
移动读写位置 (文件号, #文件首, 新区段文件地址 + 5)
' call load地址
写入数据 = { 232 } + 到字节集 (到整数 (-(映像基址 + 映像大小 + 15) + 映像基址 + PE区段表 [区段数目 + 1].VirtualAddress + 20))
写出字节集 (文件号, 写入数据)
' 移动到新区段地址+10
移动读写位置 (文件号, #文件首, 新区段文件地址 + 10)
' jmp 文件入口地址
写入数据 = { 233 } + 到字节集 (到整数 (-(映像基址 + 映像大小 + 15) + 映像基址 + 文件入口地址))
写出字节集 (文件号, 写入数据)
' 移动到新区段地址+15
移动读写位置 (文件号, #文件首, 新区段文件地址 + 15)
' 写入load数据
写入数据 = #Load
写出字节集 (文件号, 写入数据)
' 移动到新区段地址+15+取字节集长度 (#Load)
移动读写位置 (文件号, #文件首, 新区段文件地址 + 15 + 取字节集长度 (#Load))
' 写入DLL数据
写入数据 = DLL数据
写出字节集 (文件号, 写入数据)
' 读出新的文件数据
移到文件首 (文件号)
文件数据 = 读入字节集 (文件号, 取文件长度 (文件号))
关闭文件 (文件号)
' 获取新的文件数据2开始地址
文件数据地址 = lstrcpyn_字节集 (文件数据, 文件数据, 0)
RtlMoveMemory_IMAGE_DOS_HEADER (DOS头, 文件数据地址, 64)
RtlMoveMemory_IMAGE_NT_HEADERS_1 (PE头, 文件数据地址 + DOS头.e_lfanew, 248)
' 建立一个内存文件并将新的文件数据2写入
文件号 = 打开内存文件 ()
写出字节集 (文件号, 文件数据)
' 移动到PE头.OptionalHeader.AddressOfEntryPoint
移动读写位置 (文件号, #文件首, DOS头.e_lfanew + 40)
' 改变程序入口点地址
写出字节集 (文件号, 到字节集 (PE区段表 [区段数目 + 1].VirtualAddress))
加入日志 (“新文件入口地址RVA:” + 取十六进制文本 (PE区段表 [区段数目 + 1].VirtualAddress))
' 读出新的文件数据
移到文件首 (文件号)
文件数据 = 读入字节集 (文件号, 取文件长度 (文件号))
关闭文件 (文件号)
' 生成新的文件名
文件名 = 子文本替换 (文件名, 文件取扩展名 (文件名), “_注入后” + 文件取扩展名 (文件名), , , 真)
' 生成新的文件
.如果真 (写到文件 (文件名, 文件数据) = 假)
信息框 (“生成新的文件失败,请稍后再试!”, 0, , )
返回 (假)
.如果真结束
加入日志 (“注入并生成新的文件成功!新文件地址:” + 文件名)