Как я могу подать свою заявку.NET стереть себя?

Как я могу заставить свое приложение C# стереть себя (самоликвидируются)? Вот два способа, которыми я думаю, мог бы работать:

  • Предоставьте другую программу, которая удаляет основную программу. Как эта программа средства удаления удалена затем, хотя?
  • Создайте процесс к CMD, который ожидает, несколько секунд затем удаляют Ваш файл. В течение тех нескольких секунд Вы закрываете свое приложение.

Оба из тех методов кажутся неэффективными. У меня есть чувство, что существует некоторый встроенный флаг или что-то в Windows, который допускает такой материал. Как я должен сделать это? Кроме того, можно ли предоставить некоторый код кода?

ОБНОВЛЕНИЕ: Спасибо за все Ваши ответы! Я собираюсь судить их и видеть, где это получает меня.

В первую очередь, некоторые люди спросили, почему я хотел бы, чтобы мое приложение сделало это. Вот ответ: несколько дней назад я считал спецификацию Муравьеда Проекта, которую Joel Spolsky разместил в своем блоге, и это упомянуло, что клиентское приложение удалит себя после удаленного сеанса. Я задаюсь вопросом, как это работает, и как, если я когда-нибудь должен делать это, я могу выполнить такой подвиг.

Вот немного обзора того, что было предложено:

  • Создайте ключ реестра, который говорит Windows удалять файл на перезагрузке
  • Запустите CMD с командой ping, чтобы ожидать несколько секунд и затем удалить файл

У обоих из тех, конечно, есть свои недостатки, как обрисовано в общих чертах в комментариях.

Однако был бы такой метод, как обрисовано в общих чертах ниже работы?

Существует два исполняемых файла: Program.exe и Cleaner.exe. Первый - сама программа, последний является приложением, которое удаляет Program.exe и его (если это загружается в память, поскольку я собираюсь объяснить). Действительно ли это возможно для Program.exe (который имеет зависимости) загрузить весь Cleaner.exe, который не имеет никаких зависимостей, в память и выполнять ее?

Если это возможно, Cleaner.exe мог бы быть упакован в Program.exe, загрузился в память и работал?

23
задан Brian Tompsett - 汤莱恩 6 July 2015 в 11:40
поделиться

5 ответов

Есть API MoveFileEx , который при установке флага MOVEFILE_DELAY_UNTIL_REBOOT удаляет указанный файл в следующей системе. запускать.

19
ответ дан 29 November 2019 в 01:55
поделиться

На эту тему есть отличная статья CodeProject .

Изменить: По сути, это простой вызов cmd, который удаляет указанные файлы через несколько секунд.

Process.Start("cmd.exe", "/C ping 1.1.1.1 -n 1 -w 3000 > Nul & Del " + Application.ExecutablePath); 
Application.Exit();
10
ответ дан 29 November 2019 в 01:55
поделиться

Существует также FileOptions.DeleteOnClose , но для этого необходимо, чтобы файл был открыт для записи. Вы могли бы сделать это с помощью такой последовательности (непроверенной):

  • Программа запускается как Original.exe и обнаруживает (по своему имени), что ей необходимо запустить функцию самоуничтожения. .
  • Original.exe создает новый файл Temp.exe с FileOptions.DeleteOnClose и копирует в него собственное содержимое, но еще не закрывает его
  • Оригинал .exe открывает второй доступный только для чтения дескриптор для Temp.exe и закрывает первый дескриптор записи. Дескриптор, доступный только для чтения, может сосуществовать с дескриптором выполнения, при этом файл остается открытым для отсрочки автоудаления.
  • Original.exe запускает Temp.exe . Temp.exe определяет, что он был запущен из временного каталога, обходит последовательность самоуничтожения и продолжает нормальную работу.
  • Original.exe завершается (забирая с собой дескриптор Temp.exe , доступный только для чтения).
  • Temp.exe продолжает работу. После выхода файл Temp.exe больше не будет использоваться, поэтому он будет удален автоматически.

Правка №2 : На самом деле я не думаю, что это возможно, потому что это зависит от того, что ядро ​​открывает файл с флагом FILE_SHARE_DELETE , что маловероятно.

1
ответ дан 29 November 2019 в 01:55
поделиться

Обратные ссылки являются одноосновными, например , \1 или $1 - первое вложенное выражение в скобках и т. д. Как изложено, один картует другому без всяких раздумий.

Также следует отметить, что m.Groups [«0»] предоставляет всю соответствующую подстроку, поэтому не забудьте пропустить «0» , если выполняется итерация над regex.GetGroupNames () .

-121--2720142-

Я использую метод .get () - это предпочтительный метод.

Python 2.5.2 (r252:60911, Jul 22 2009, 15:33:10)
[GCC 4.2.4 (Ubuntu 4.2.4-1ubuntu3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import dis
>>> def f1(key, d):
...   if key in d:
...     return d[key]
...   else:
...     return "default"
...
>>> dis.dis(f1)
  2           0 LOAD_FAST                0 (key)
              3 LOAD_FAST                1 (d)
              6 COMPARE_OP               6 (in)
              9 JUMP_IF_FALSE           12 (to 24)
             12 POP_TOP

  3          13 LOAD_FAST                1 (d)
             16 LOAD_FAST                0 (key)
             19 BINARY_SUBSCR
             20 RETURN_VALUE
             21 JUMP_FORWARD             5 (to 29)
        >>   24 POP_TOP

  5          25 LOAD_CONST               1 ('default')
             28 RETURN_VALUE
        >>   29 LOAD_CONST               0 (None)
             32 RETURN_VALUE
>>> def f2(key, d):
...   return d.get(key, "default")
...
>>> dis.dis(f2)
  2           0 LOAD_FAST                1 (d)
              3 LOAD_ATTR                0 (get)
              6 LOAD_FAST                0 (key)
              9 LOAD_CONST               1 ('default')
             12 CALL_FUNCTION            2
             15 RETURN_VALUE
>>> def f3(key, d):
...   try:
...     return d[key]
...   except KeyError:
...     return "default"
...
>>> dis.dis(f3)
  2           0 SETUP_EXCEPT            12 (to 15)

  3           3 LOAD_FAST                1 (d)
              6 LOAD_FAST                0 (key)
              9 BINARY_SUBSCR
             10 RETURN_VALUE
             11 POP_BLOCK
             12 JUMP_FORWARD            23 (to 38)

  4     >>   15 DUP_TOP
             16 LOAD_GLOBAL              0 (KeyError)
             19 COMPARE_OP              10 (exception match)
             22 JUMP_IF_FALSE           11 (to 36)
             25 POP_TOP
             26 POP_TOP
             27 POP_TOP
             28 POP_TOP

  5          29 LOAD_CONST               1 ('default')
             32 RETURN_VALUE
             33 JUMP_FORWARD             2 (to 38)
        >>   36 POP_TOP
             37 END_FINALLY
        >>   38 LOAD_CONST               0 (None)
             41 RETURN_VALUE
-121--2246943-

Я знаю, что отражатель удаляет себя, если вы используете старую версию и решили не обновлять. Вы можете попытаться выяснить, что это делает. Я бы начал с FileMon и посмотрел, не порождает ли он какие-либо процессы для достижения этого.

0
ответ дан 29 November 2019 в 01:55
поделиться

Вы никогда не сможете гарантировать, что это будет работать, пока вам потребуется физическое присутствие на машине. Например:

  • Что, если приложению не удается своевременно освободить ресурс, пока вы пытаетесь его удалить? Возникает ошибка, а приложение остается.
  • Поведение одного приложения, запускающего другое, которое затем удаляет первое приложение, очень подозрительно с точки зрения антивируса. Вы, вероятно, активируете защиту на машине пользователя, которая может убить процесс, пытающийся убить ваше исходное приложение.
  • Если вы сделаете что-то вроде удаления файла при перезагрузке, что, если пользователь переместит ваш файл между ними или сделает копию? Его больше нет на исходном месте, и приложение остается.

Если вашему приложению требуется такой уровень безопасности, рассмотрите возможность размещения его на машине, которую вы контролируете (например, предоставив веб-службу и разрешив клиенту-заглушке получить к ней доступ таким образом).

В некотором роде примечание: возникает соблазн порассуждать о мотивах человека, который (1) требует физического присутствия на чьей-то машине и (2) хочет удалить свидетельство того, что приложение существовало.

7
ответ дан 29 November 2019 в 01:55
поделиться