内存EXE加载器,指定程序加载到内存中运行,支持命令行参数

易语言 2020-08-16 22:16:13

内存EXE加载器,指定程序加载到内存中运行,支持命令行参数

说明:
1.待运行程序和外壳程序不得为空.
2.命令行参数可省略
.子程序 在内存中运行EXE, 逻辑型, 公开, 可以直接运行资源中的程序,不必释放。成功返回真,失败返回假。
.参数 欲执行的程序, 字节集, , 欲执行的程序,不支持某些加了壳的程序,请自行测试。
.参数 命令行, 文本型, 可空, 为程序提供的命令行参数,不需要请留空。
.参数 外壳程序路径, 文本型, 可空, 外壳程序的路径(如果用系统程序做外壳,如cmd.exe、svchost.exe,可以实现穿防火墙,呵呵),不支持某些程序,请自行测试;不在当前目录下要提供绝对路径;留空默认为cmd.exe,如果无法运行,请换用不同的程序尝试。
.参数 等待程序运行完毕, 逻辑型, 可空, 默认为假,即不等待。
.参数 窗口显示方式, 整数型, 可空, 1#隐藏窗口; 2#普通激活; 3#最小化激活; 4#最大化激活; 5#普通不激活; 6#最小化不激活。如果省略本参数,默认为“普通激活”方式。
.参数 运行信息, 运行信息, 参考 可空, 用来接收在内存中执行的exe的运行信息(进程、主线程的句柄和ID)。不需要可留空。
.局部变量 idh, IMAGE_DOS_HEADER
.局部变量 inh, IMAGE_NT_HEADERS
.局部变量 ish, IMAGE_SECTION_HEADER
.局部变量 si, STARTUPINFO
.局部变量 context, CONTEXT86
.局部变量 ImageBase, 整数型
.局部变量 i, 整数型
.局部变量 addr, 整数型
.局部变量 lOffset, 整数型

连续赋值 (0, 运行信息.进程ID, 运行信息.进程句柄, 运行信息.主线程ID, 运行信息.主线程句柄)
.如果真 (欲执行的程序 = { })
返回 (假)
.如果真结束
CopyMemory_idh (idh, 欲执行的程序 [1], Len_idh (idh))
.如果真 (idh.e_magic ≠ 23117)
返回 (假)
.如果真结束
CopyMemory_inh (inh, 欲执行的程序 [idh.e_lfanew + 1], Len_inh (inh))
.如果真 (inh.Signature ≠ 17744)
返回 (假)
.如果真结束
si.cb = Len_si (si)
.如果真 (是否为空 (窗口显示方式) = 假 且 窗口显示方式 ≠ 2 且 窗口显示方式 > 0 且 窗口显示方式 ≤ 6)
si.dwFlags = 1
si.wShowWindow = 多项选择 (窗口显示方式, 0, 5, 2, 3, 8, 7)
.如果真结束
.如果真 (CreateProcess (0, 选择 (是否为空 (外壳程序路径), 取cmd路径 (), 外壳程序路径) + 选择 (是否为空 (命令行) 或 命令行 = “”, “”, “ ” + 命令行), 0, 0, 0, 4, 0, 0, si, 运行信息) = 0)
返回 (假)
.如果真结束
context.ContextFlags = 65538
.如果真 (GetThreadContext (运行信息.主线程句柄, context) = 0)
ClearProcess (运行信息)
返回 (假)
.如果真结束
ReadProcessMemory (运行信息.进程句柄, context.Ebx + 8, addr, 4, 0)
.如果真 (addr = 0)
ClearProcess (运行信息)
返回 (假)
.如果真结束
.如果真 (ZwUnmapViewOfSection (运行信息.进程句柄, addr) = 0)
ClearProcess (运行信息)
返回 (假)
.如果真结束
ImageBase = VirtualAllocEx (运行信息.进程句柄, inh.OptionalHeader.ImageBase, inh.OptionalHeader.SizeOfImage, 12288, 4)
.如果真 (ImageBase = 0)
ClearProcess (运行信息)
返回 (假)
.如果真结束
WriteProcessMemory (运行信息.进程句柄, ImageBase, 欲执行的程序 [1], inh.OptionalHeader.SizeOfHeaders, 0)
lOffset = idh.e_lfanew + Len_inh (inh)
.计次循环首 (inh.FileHeader.NumberOfSections, i)
CopyMemory_ish (ish, 欲执行的程序 [lOffset + (i - 1) × 40 + 1], Len_ish (ish))
.如果真 (ish.PointerToRawData + 1 > 字节集_取长度 (欲执行的程序))
ClearProcess (运行信息)
返回 (假)
.如果真结束
WriteProcessMemory (运行信息.进程句柄, ImageBase + ish.VirtualAddress, 欲执行的程序 [ish.PointerToRawData + 1], ish.SizeOfRawData, 0)
VirtualProtectEx (运行信息.进程句柄, ImageBase + ish.VirtualAddress, ish.VirtualSize, Protect (ish.characteristics), addr)
.计次循环尾 ()
WriteProcessMemory2 (运行信息.进程句柄, context.Ebx + 8, ImageBase, 4, 0)
context.Eax = ImageBase + inh.OptionalHeader.AddressOfEntryPoint
SetThreadContext (运行信息.主线程句柄, context)
ResumeThread (运行信息.主线程句柄)
.如果真 (等待程序运行完毕)
WaitForSingleObject (运行信息.进程句柄, -1)
.如果真结束
.如果真 (是否为空 (运行信息))
CloseHandle (运行信息.主线程句柄)
CloseHandle (运行信息.进程句柄)