繁体   English   中英

C# 我如何以append代码结尾运行一个.NET.EXE,最好是从那个.EXE里面?

[英]C# How do I append code to the end of a running .NET .EXE, preferably from inside that .EXE?

能不能跑.NET.EXE append数据给自己? 是什么阻止了它?

我可以启动一个单独的过程来完成它。

但是我不知道如何在它运行时给自己写信。 有没有办法做到这一点? 在 .NET

编辑:最好不要像把它写在其他地方然后复制/重命名这样的骇人听闻的解决方案

EDIT2:阐明可执行文件的类型

EDIT3:目的:将二进制 stream 写入我正在运行的 EXE 文件,然后我可以解析磁盘上的 .EXE 文件以获取这些字节并在程序中使用它们 无需创建任何新文件或注册表项或类似的东西。 它是独立的。 这非常方便。

EDIT4:对于那些反对这个文件的人,请在试图抹黑这个想法之前考虑以下功能: FILE ZIPPINGDLL LINKINGPORTABLE APPLICATIONS

正如评论中所说,以这种方式存储数据有很多不好的后果,但还有一个更大的问题:“是什么阻止了它?”的答案。 题。 Windows PE 加载器在执行时锁定图像文件以进行写入,因此您无法获得具有写入权限的文件的HANDLE ,因为带有FILE_WRITE_DATA选项的NtCreateFileNtOpenFile系统调用将失败,以及任何删除文件的尝试. 该块在内核级实现并在NtCreateProcess系统调用期间设置,在进程及其模块入口点被实际调用之前。

在不将数据写入磁盘、将其发送到远程服务器且没有内核权限的情况下,唯一可能的肮脏技巧是通过辅助可执行文件、代码注入或命令行参数脚本(例如使用 PowerShell)使用另一个进程,这可以杀死您的进程释放锁,将数据附加到文件末尾并重新启动它。 当然,这些选项有更糟糕的后果,我写它只是为了说明操作系统的限制(故意造成的)以及为什么没有专业软件使用这种技术来存储数据。

尽管存在所有负面因素,但有一种干净的方法可以做到这一点:

我发现的方法只需要在 NTFS 驱动器上执行程序。

诀窍是让您的应用程序在启动后立即将其自身复制到备用 stream,然后执行该映像并立即自行关闭。 这可以使用以下命令轻松完成:

type myapp.exe > myapp.exe:image
forfiles /m myapp.exe /c myapp.exe:image

一旦您的应用程序从备用 stream (myapp.exe:image) 运行,就可以自由修改原始文件 (myapp.exe) 并读取其中存储的数据。 下次程序启动时,修改后的应用程序将被复制到备用stream并执行。

这允许您在运行时获得可执行文件写入自身的效果,而无需处理任何额外的文件,并允许您将所有设置存储在一个 single.exe 文件中。

该文件必须在 NTFS 分区上执行,但这没什么大不了的,因为所有 Windows 安装都使用这种格式。 您仍然可以将文件复制到其他文件系统,只是不能在那里执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM