Как я могу заставить свое приложение C# стереть себя (самоликвидируются)? Вот два способа, которыми я думаю, мог бы работать:
Оба из тех методов кажутся неэффективными. У меня есть чувство, что существует некоторый встроенный флаг или что-то в Windows, который допускает такой материал. Как я должен сделать это? Кроме того, можно ли предоставить некоторый код кода?
ОБНОВЛЕНИЕ: Спасибо за все Ваши ответы! Я собираюсь судить их и видеть, где это получает меня.
В первую очередь, некоторые люди спросили, почему я хотел бы, чтобы мое приложение сделало это. Вот ответ: несколько дней назад я считал спецификацию Муравьеда Проекта, которую Joel Spolsky разместил в своем блоге, и это упомянуло, что клиентское приложение удалит себя после удаленного сеанса. Я задаюсь вопросом, как это работает, и как, если я когда-нибудь должен делать это, я могу выполнить такой подвиг.
Вот немного обзора того, что было предложено:
У обоих из тех, конечно, есть свои недостатки, как обрисовано в общих чертах в комментариях.
Однако был бы такой метод, как обрисовано в общих чертах ниже работы?
Существует два исполняемых файла: Program.exe и Cleaner.exe. Первый - сама программа, последний является приложением, которое удаляет Program.exe и его (если это загружается в память, поскольку я собираюсь объяснить). Действительно ли это возможно для Program.exe (который имеет зависимости) загрузить весь Cleaner.exe, который не имеет никаких зависимостей, в память и выполнять ее?
Если это возможно, Cleaner.exe мог бы быть упакован в Program.exe, загрузился в память и работал?
Есть API 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();
Существует также 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
или $1
- первое вложенное выражение в скобках и т. д. Как изложено, один картует другому без всяких раздумий.
Также следует отметить, что m.Groups [«0»]
предоставляет всю соответствующую подстроку, поэтому не забудьте пропустить «0»
, если выполняется итерация над regex.GetGroupNames ()
.
Я использую метод .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 и посмотрел, не порождает ли он какие-либо процессы для достижения этого.
Вы никогда не сможете гарантировать, что это будет работать, пока вам потребуется физическое присутствие на машине. Например:
Если вашему приложению требуется такой уровень безопасности, рассмотрите возможность размещения его на машине, которую вы контролируете (например, предоставив веб-службу и разрешив клиенту-заглушке получить к ней доступ таким образом).
В некотором роде примечание: возникает соблазн порассуждать о мотивах человека, который (1) требует физического присутствия на чьей-то машине и (2) хочет удалить свидетельство того, что приложение существовало.