سؤال

كيف يمكنني جعل تطبيقي 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();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top