开源
功能说明:本程序是一个基于易语言开发的实用功能模块,其核心目的是实现“在内存中直接运行 EXE 程序”,无需将可执行文件释放到磁盘即可执行。该模块由作者“易语言我吃了”制作,主要涉及到底层 Windows API 的调用与进程内存操作技术,通常被称为"RunPE"或“进程空洞化(Process Hollowing)”技术。
一、程序核心功能
该程序集的主要入口函数为公开子程序“在内存中运行 EXE"。其核心功能是接收一个字节集格式的 EXE 文件数据,通过特定的 Windows 系统 API 序列,将其加载到另一个 suspended(挂起)状态的系统进程内存空间中,并修改该进程的执行入口点,从而实现对目标 EXE 的隐形运行。这种方法避免了文件落地,常用于软件保护、临时工具执行或特定的系统管理任务。
二、技术实现原理分析
通过对代码逻辑的分析,该程序实现了以下关键步骤:
1. PE 文件头验证:程序首先检查输入的字节集是否包含有效的 DOS 头(e_magic)和 NT 头(Signature),确保传入的数据是一个合法的可执行文件。
2. 创建挂起进程:调用 CreateProcess API 创建一个外壳进程(默认为 cmd.exe,也可指定为 svchost.exe 等系统程序),并将其创建为挂起状态(CREATE_SUSPENDED)。注释中提到使用系统程序做外壳可以实现“穿防火墙”,暗示了该技术具有绕过某些基于文件路径监控的安全策略的能力。
3. 内存卸载与分配:获取主线程上下文后,通过 ZwUnmapViewOfSection API 卸载外壳进程原有的内存映像。随后使用 VirtualAllocEx 在外壳进程空间中分配新的内存区域,大小与目标 EXE 所需的映像大小一致。
4. 写入内存与重定位:将目标 EXE 的文件头和各个节(Section)数据写入到新分配的内存地址中,并调用 VirtualProtectEx 设置相应的内存保护属性(如可读、可写、可执行)。
5. 修改执行上下文:修改线程上下文结构(CONTEXT),将入口地址(Eax)指向新写入的 EXE 入口点,并修改 PEB 中的图像基址(ImageBase)。
6. 恢复运行:调用 SetThreadContext 应用修改后的上下文,最后通过 ResumeThread 恢复主线程,使外壳进程实际上开始执行目标 EXE 的代码。
三、参数功能详解
该子程序提供了丰富的参数以适应不同的使用场景:
1. 欲执行的程序(字节集):必需参数,传入需要运行的 EXE 文件的二进制数据。
2. 命令行(文本型):可选参数,用于向目标程序传递启动参数。
3. 外壳程序路径(文本型):可选参数,指定用于承载目标程序的宿主进程路径。留空默认使用 cmd.exe。作者建议可尝试不同程序以兼容性。
4. 等待程序运行完毕(逻辑型):可选参数,决定调用者是否阻塞直到目标程序结束。
5. 窗口显示方式(整数型):可选参数,控制运行窗口的显示状态,包括隐藏、普通激活、最小化、最大化等六种模式,默认普通激活。
6. 运行信息(运行信息型):可选参数,用于输出运行后的进程 ID、进程句柄、主线程 ID 及句柄,方便后续管理或关闭进程。
四、辅助子程序说明
除了主功能外,模块还包含若干辅助子程序以支持核心逻辑:
1. ClearProcess:用于清理进程资源,当执行失败或需要终止时,负责终止进程并关闭相关的句柄,防止资源泄漏。
2. Protect:根据 PE 节区的特征值(characteristics)计算对应的内存保护标志,确保内存页权限正确。
3. RShift 与 vbLongToULong:用于处理位运算和有符号数转无符号数的底层数学逻辑,服务于内存保护标志的计算。
五、应用场景与注意事项
1. 软件保护:开发者可将主程序加密后存放在资源中,通过此模块在内存中解密运行,防止主程序文件被直接分析或篡改。
2. 无痕工具:适用于需要运行临时工具但不希望在磁盘留下痕迹的系统维护场景。
3. 安全风险提示:由于该技术原理与许多恶意软件(如木马、病毒)的注入技术高度相似,容易被杀毒软件识别为可疑行为并拦截。代码注释中也提到“不支持某些加了壳的程序”,说明兼容性受目标文件特征影响。使用者应确保用途合法合规,仅用于正当的软件开发或系统管理目的。
综上所述,该程序是一个典型的易语言底层进程操作模块,实现了高质量的内存加载 EXE 功能,具有较高的技术价值和特定的应用场景,但在使用时需注意兼容性与安全软件的拦截问题。
======程序集1
| |
| |------ 在内存中运行EXE
| |
| |------ ClearProcess
| |
| |------ Protect
| |
| |------ RShift
| |
| |------ vbLongToULong
| |
| |------ 数值_求次方
| |
| |------ 字节集_取长度
| |
| |------ 取cmd路径
| |
| |
======窗口程序集1
| |
| |------ __启动窗口_创建完毕
| |
| |------ _按钮3_被单击
| |
| |------ 在内存中运行EXE
| |
| |------ ClearProcess
| |
| |------ Protect
| |
| |------ RShift
| |
| |------ vbLongToULong
| |
| |------ 数值_求次方
| |
| |------ 字节集_取长度
| |
| |------ 取cmd路径
| |
| |------ _按钮1_被单击
| |
| |------ _按钮2_被单击
| |
| |------ __启动窗口_将被销毁
| |
| |------ __启动窗口_托盘事件
| |
| |------ __启动窗口_可否被关闭
| |
| |------ 窗口渐显
| |
| |------ 窗口渐隐
| |
| |------ __启动窗口_位置被改变
| |
| |------ _打开主程序_被选择
| |
| |------ _退出主程序_被选择
| |
| |------ _图片框1_鼠标左键被按下
| |
| |
======窗口程序集2
| |
| |------ _窗口1_创建完毕
| |
| |
======调用的Dll
| |
| |---[dll]------ Len_idh
| |
| |---[dll]------ CopyMemory_inh
| |
| |---[dll]------ CopyMemory_idh
| |
| |---[dll]------ Len_inh
| |
| |---[dll]------ Len_si
| |
| |---[dll]------ GetThreadContext
| |
| |---[dll]------ ReadProcessMemory
| |
| |---[dll]------ ZwUnmapViewOfSection
| |
| |---[dll]------ CreateProcess
| |
| |---[dll]------ VirtualAllocEx
| |
| |---[dll]------ WriteProcessMemory
| |
| |---[dll]------ CopyMemory_ish
| |
| |---[dll]------ Len_ish
| |
| |---[dll]------ VirtualProtectEx
| |
| |---[dll]------ WriteProcessMemory2
| |
| |---[dll]------ SetThreadContext
| |
| |---[dll]------ ResumeThread
| |
| |---[dll]------ TerminateProcess
| |
| |---[dll]------ CloseHandle
| |
| |---[dll]------ lstrcpyn
| |
| |---[dll]------ RtlMoveMemory
| |
| |---[dll]------ GetEnvironmentVariable
| |
| |---[dll]------ WaitForSingleObject
注:本站源码主要来源于网络收集。如有侵犯您的利益,请联系我们,我们将及时删除!
部分源码可能含有危险代码,(如关机、格式化磁盘等),请看清代码在运行。
由此产生的一切后果本站均不负责。源码仅用于学习使用,如需运用到商业场景请咨询原作者。
使用本站源码开发的产品均与本站无任何关系,请大家遵守国家相关法律。