簡體   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