كيف يمكنني إجراء تطبيق .NET محو نفسه؟
-
20-09-2019 - |
سؤال
كيف يمكنني جعل تطبيقي C # محو نفسه (التدمير الذاتي)؟ هنا طريقتان أعتقد أنه قد تعمل:
- توريد برنامج آخر يحذف البرنامج الرئيسي. كيف يتم حذف هذا البرنامج المسند بعد ذلك؟
- إنشاء عملية إلى CMD التي تنظر بضع ثوان، ثم حذف الملف الخاص بك. خلال تلك الثواني القليلة، يمكنك إغلاق التطبيق الخاص بك.
كل من تلك الأساليب تبدو غير فعالة. لدي شعور بأن هناك بعض العلم المدمج أو أي شيء في نظام Windows يسمح بهذه الأشياء. كيف أفعل ذلك؟ أيضا، هل يمكنك تقديم بعض التعليمات البرمجية؟
تحديث: شكرا لإجاباتك! سأحاولهم، ونرى أين يحصلني.
بادئ ذي بدء، سأل بعض الناس لماذا أريد تطبيقي للقيام بذلك. إليك الجواب: قبل بضعة أيام، قرأت مشروع Aardvark المواصفات التي نشرت جويل spolsky على مدونته، وذكر أن تطبيق العميل سيقوم بحذف نفسه بعد الجلسة البعيدة. أنا أتساءل كيف يعمل هذا، وكيف، إذا كنت بحاجة إلى القيام بذلك، يمكنني إنجاز مثل هذا الفذ.
إليك نظرة عامة على ما تم اقتراحه:
- قم بإنشاء إدخال تسجيل يخبر Windows بحذف الملف على إعادة التشغيل
- قم بإطلاق CMD مع أمر Ping للانتظار بضع ثوان ثم حذف الملف
كل من، بالطبع، لديهم عيوبهم، كما هو موضح في التعليقات.
ومع ذلك، هل هذه الطريقة كما هو موضح أدناه العمل؟
هناك اثنين من الملفات التنفيذية: programe.exe و cleaner.exe. السابق هو البرنامج نفسه، هذا الأخير هو التطبيق الذي يحذف program.exe وحده (إذا تم تحميله في الذاكرة، وأنا على وشك أن أشرح). هل من الممكن لبرنامج Program.exe (الذي يحتوي على تبعيات) حمل كل من Cleaner.exe، الذي لا يحتوي على أي تبعيات، في الذاكرة وتشغيله؟
إذا كان ذلك ممكنا، فيمكن تعبئتها داخل البرامج. هل تم تحميلها في الذاكرة، وتشغيلها؟
المحلول
هناك movefileex. واجهة برمجة التطبيقات، التي، عند إعطاء MOVEFILE_DELAY_UNTIL_REBOOT
العلم، سيحذف الملف المحدد في بدء تشغيل النظام التالي.
نصائح أخرى
هناك عظيم CodeProject المادة حول هذا الموضوع.
تعديل: في الأساس انها مكالمة CMD بسيطة والتي ستحذف الملفات المحددة بعد بعض الثواني.
Process.Start("cmd.exe", "/C ping 1.1.1.1 -n 1 -w 3000 > Nul & Del " + Application.ExecutablePath);
Application.Exit();
لن تتمكن أبدا من ضمان أن هذا سيعمل، طالما أنك تحتاج إلى وجود جسدي على الجهاز. علي سبيل المثال:
- ماذا لو فشل التطبيق في إصدار مورد في الأزياء في الوقت المناسب أثناء تحاول حذفه؟ يحدث خطأ، ولا يزال التطبيق.
- سلوك تطبيق واحد بدء آخر ثم يحذف التطبيق الأول هو مريب جدا من وجهة نظر AV. من المحتمل أن تشغل الدفاعات على جهاز مستخدم قد يقتل العملية التي تحاول قتل تطبيقك الأصلي.
- إذا كنت تفعل شيئا مثل حذف ملف في إعادة التشغيل، فماذا إذا كان المستخدم يتحرك ملفك بين أو إصدار نسخة؟ إنه ليس في المكان الأصلي بعد الآن، ويبقى التطبيق.
إذا كان طلبك يتطلب هذا المستوى من الأمان، ففكر في استضافة تشغيله على جهاز تقوم به (على سبيل المثال، من خلال توفير خدمة ويب واستيفاء عميل الروتين الوصول إليه بهذه الطريقة).
في ملاحظة ذات صلة إلى حد ما، يتم إغراء المرء أيضا التكهن حول دوافع شخص ما (1) يتطلب وجود مادي على آلة شخص ما و (2) يريد حذف الأدلة على أن التطبيق موجود.
تصحيح إلى Bobby Answer، في حالة العثور على الأشخاص مفيدين - يجب نقل المسار القابل للتنفيذ. بالإضافة إلى ذلك، يوجد أدناه نافذة CMD.EXE لتكون مخفية (وإلا فهي تومض كبرنامج وحدة التحكم السوداء) وتحويلها لتشغيلها دون الاعتماد على System.windows.forms التجميع (فئة التطبيق).
var exepath = extensival.getentryassembly (). الموقع؛ var info = processstartinfo ("cmd.exe"، / c ping 1.1.1.1 -n 1 -W 3000> nul & del "" + exepath + "" ")؛ info.windowstyle = processwindowstyle.hidden؛ process.start (info) .dispose ()؛ البيئة.exit (0)؛
يوجد ايضا FileOptions.DeleteOnClose
, ، ولكن هذا يتطلب أن يكون الملف مفتوحا للكتابة. قد تكون قادرا على القيام بذلك بتسلسل مثل هذا (غير مختبر):
- برنامج إطلاق البرنامج
Original.exe
, والكشف عن (من اسمها الخاص) الذي يحتاج إلى إثارة وظيفة التدمير الذاتي. Original.exe
يخلق ملف جديدTemp.exe
معFileOptions.DeleteOnClose
ونسخ المحتوى الخاص به في ذلك، لكنه لا يغلقه بعدOriginal.exe
يفتح ثانية، مقبض للقراءة فقطTemp.exe
ويغلق مقبض الكتابة الأول. يمكن التعايش مع مقبض القراءة فقط مع مقبض تنفيذ، مع الحفاظ على فتح الملف لتأخير الحذف التلقائي.Original.exe
إطلاقTemp.exe
.Temp.exe
يكتشف أنه تم إطلاقه من دليل TEMP وتجاوز تسلسل التدمير الذاتي ويستمر في التشغيل العادي.Original.exe
مخارج (أخذ مقبض القراءة فقط لTemp.exe
معها.)Temp.exe
يستمر قيد التشغيل. عندما يخرج، الملفTemp.exe
لن تكون قيد الاستخدام لذلك سيتم حذفها تلقائيا.
تحرير رقم 2: في الواقع لا أعتقد أن هذا ممكن، لأنه يعتمد على kernel فتح الملف مع FILE_SHARE_DELETE
العلم، وهو أمر غير مرجح.
مرتبة حسب NJ C # الرموز الأخرى لا تعمل بحيث تكون بسيطة إذا قمت بإنشاء ملف الحمام حلقات إلى Del Application وملف الدفعات نفسه يمكنك استخدام أمر Takkill لقتل العملية إذا كنت لا ترغب في استخدام التطبيق.
`string delname = "test.cmd";
string fileurl = Application.ExecutablePath;
System.IO.StreamWriter file = new System.IO.StreamWriter(delname);
file.WriteLine(":Repeat");
file.WriteLine("del \"" + fileurl + "\"");
file.WriteLine("if exist \"" + fileurl + "\" goto Repeat");
file.WriteLine("del \"" + delname + "\"");
file.Close();
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = false;
startInfo.FileName = delname;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
Process.Start(startInfo);`
`th3 3e3 واحد ليس أجزاء ثلاثية الأبعاد ov واحد i5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
فكر في CMD
int sectosleep = 5000;
string exename = "yourexe.exe";
string location = @"c:\yourexe.exe"
Process.Start("cmd.exe", "/C taskkill /f /im " + exename + " & ping 1.1.1.1 -n 1 -w " + sectosleep + " > Nul & Del /F /Q \"" + location + "\"");
;>
أعلم أن العاكس يحذف نفسه إذا كنت تستخدم نسخة قديمة واختر عدم التحديث. قد تحاول معرفة ما يفعله. أود أن أبدأ ب filemon ومعرفة ما إذا كان يطرد أي عمليات لتحقيق ذلك.
نظرا لأن طلبي (خدمة Windows) مثبتا عبر Windows Installer، فأنا حذف الذات باستخدام هذا:
Dim uninstall_params As String = "/x {MY-PRODUCTS-GUID} /qn /norestart REBOOT=ReallySuppress"
proc.StartInfo = New ProcessStartInfo("msiexec.exe", uninstall_params)
proc.Start()
Environment.Exit(-1)
آسف - إنه في VB، ولكن يجب أن يكون قابل للتحويل بسهولة إلى C #.
يعمل في نظام التشغيل Windows 7 & 8، ** تأكد من تشغيل التطبيق الخاص بك مع امتيازات المسؤول أو ستحصل على خطأ.
يوجد هذا الرمز في مكان آخر حتى لا أتمكن من اتخاذ ائتمان كامل وجدت أنني جعله يعمل من أجلي بإضافة "Application.exit ()؛"
static void autodelete()
{
string batchCommands = string.Empty;
string exeFileName = Assembly.GetExecutingAssembly().CodeBase.Replace("file:///", string.Empty).Replace("/", "\\");
batchCommands += "@ECHO OFF\n"; // Do not show any output
batchCommands += "ping 127.0.0.1 > nul\n"; // Wait approximately 4 seconds (so that the process is already terminated)
batchCommands += "echo j | del /F "; // Delete the executeable
batchCommands += exeFileName + "\n";
batchCommands += "echo j | del deleteMyProgram.bat"; // Delete this bat file
File.WriteAllText("deleteMyProgram.bat", batchCommands);
Process.Start("deleteMyProgram.bat");
Application.Exit();
}