Форум программистов, компьютерный форум, киберфорум
deathNC
Войти
Регистрация
Восстановить пароль
фсякая инитиресссная фсячина
Рейтинг: 5.00. Голосов: 3.

Удаление программы из самой себя

Запись от deathNC размещена 28.03.2012 в 20:51

Недавно мне понадобилась такая штука, чтобы программа по завершению сама себя удалила. В иннете есть куча исходников, и я давно находил то, что мне нужно... однако
Код, который гуляет по иннету - это код, который создаёт bat-файл, удаляющий программу, и после этого, удаляющий сам себя. Но вот ведь незадача - bat-файл не дружит с русскими символами, поэтому если указывать полные пути, то при наличии в этом пути русских символов у тебя ничего не выйдет
Эту проблему можно обойти, если имя вашей программы не содержит русских символов:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
uses
  SysUtils, ShellAPI;
...
var
  FileName: String;
  f: TextFile;
begin
  FileName := ChangeFileExt(ParamStr(0), '.bat');
  AssignFile(f, FileName);
  Rewrite(f);
  WriteLn(f, 'attrib -a -r -s -h "', ExtractFileName(ParamStr(0)), '"'); // снятие атрибутов с файла
  WriteLn(f, ':1'); // создаём метку
  WriteLn(f, 'del "', ExtractFileName(ParamStr(0)), '"'); // удаляем программу
  WriteLn(f, 'If exist "' + ExtractFileName(ParamStr(0)), '" goto 1'); // если программа не удалена, идём на метку
  WriteLn(f, 'del "', ExtractFileName(FileName), '"'); // когда программа удалена, удаляем бат-файл
  WriteLn(f, 'exit'); // выход (хотя он не нужен - он уже не выполнится)
  CloseFile(f);
  ShellExecute(GetDesktopWindow, 'Open', PChar(FileName), nil, nil, sw_Hide);
end;
Однако, если вдруг и в имени твоей программы есть русские символы, то и это тебя не спасёт
Но есть ещё решение - перекодировать имена файлов в OEM кодировку. Тогда всё будет работать. Вот функция, которая выполняет перекодироваку:
Delphi
1
2
3
4
5
6
function StrToOem(const AnsiStr: string): string;
begin
  SetLength(Result, Length(AnsiStr));
  if Length(Result) > 0 then
    CharToOemBuff(PChar(AnsiStr), PChar(Result), Length(Result));
end;
Показов 146093 Комментарии 14
Всего комментариев 14
Комментарии
  1. Старый комментарий
    Аватар для AzaKendler
    а нельзя ли например сделать так. в исполняемом файле должен быть код, который "воткнется" в память стороннего процесса и будет "присматривать" за твоей прогой. по выполнении - удалит ее. ну а после перезагрузки помрет и сам. это может кажется сложнее, но зато без bat и прочего
    Запись от AzaKendler размещена 28.03.2012 в 22:41 AzaKendler вне форума
  2. Старый комментарий
    Цитата:
    "воткнется" в память стороннего процесса
    и его тут же порежет предусмотрительный авирь, отсутствие которого на машине пользователя вы предусмотреть не сможете.
    Запись от raxp размещена 29.03.2012 в 11:43 raxp вне форума
  3. Старый комментарий
    Аватар для Pure
    ну породить сторонний процесс из текста никто не мешает. можно и не трогать работающие процессы. это условности.
    Запись от Pure размещена 30.03.2012 в 15:38 Pure вне форума
  4. Старый комментарий
    ...это все же разные подходы: породить свой процесс или цеплятся к чужим. Только чем это (первое) будет отличаться от создания того же батника?
    Запись от raxp размещена 30.03.2012 в 15:49 raxp вне форума
  5. Старый комментарий
    Аватар для Vovan-VE
    WinAPI, удаление при перезагрузке:
    Delphi
    1
    
    MoveFileEx(PChar(ParamStr(0)), nil, MOVEFILE_DELAY_UNTIL_REBOOT);
    Запись от Vovan-VE размещена 30.03.2012 в 16:12 Vovan-VE вне форума
  6. Старый комментарий
    Аватар для deathNC
    Просто у меня возникла задача - удалиться сразу после завершения работы, не оставив никаких следов, и не трогая никаких процессов.
    но тут у меня опять косяк... если перевести имя в OEM русскую кодировку, то, например, имя с китайским не удалит. Но на этот случай в батнике можно обращаться к параметрам
    Код:
    @echo off
    :lbl1
    del %1%
    if exist %1% goto lbl1
    del %0%
    я мог ошибиться с синтаксисом, ибо командный язык windows для меня ещё тёмный лес, но примерно такой код батника должен удалить хоть что, хоть где... выложу более правильный вариант, когда найду его...

    и, кстати, точно не уверен, но лучше использовать только AnsiString... WideString, наверно, нежелателен...
    Запись от deathNC размещена 30.03.2012 в 17:45 deathNC вне форума
  7. Старый комментарий
    Аватар для Pure
    Цитата:
    Сообщение от raxp Просмотреть комментарий
    ...это все же разные подходы: породить свой процесс или цеплятся к чужим. Только чем это (первое) будет отличаться от создания того же батника?
    отсутствием лишних движений на диске. отсутствием вообще лишних движений
    и...присмотрись к задаче. "удалиться сразу после завершения работы" - правильнее - это увидеть например, что "событие" наступило (объект освободился) и совершить удаление файла, а не запускать создание нового файла - потом его запуск. ты так не считаешь? вероятность нарваться на проблемы при создании доп файла на диске выше(какие нить нестандартные пермиссии), чем если УЖЕ подгруженный в память код, сделает свое дело, после этого он завершается.

    а подходы конечно разные. ты же завел волынко про авири какие-то
    Запись от Pure размещена 30.03.2012 в 19:59 Pure вне форума
  8. Старый комментарий
    ...гляньте выше в контексте чего был коммент про авири
    Запись от raxp размещена 30.03.2012 в 20:12 raxp вне форума
  9. Старый комментарий
    Аватар для deathNC
    Конечно, можно при желании хоть военный самолёт взломать и прописать бесконечные патроны.
    Действительно ли стоит внимания такой метод - внедряться в процессы? Надо учитывать, что эта прога может попасть на любой компьютер. А так как это полезный софт, а не вирусятина - мне не надо, чтобы антивирусники начали материться... так что мне кажется, что батником обойтись легче
    хотя я не боженька (я вообще в боженьку не верю), и могу ошибаться
    если ошибаюсь - покажите более правильный способ самоудаления
    Запись от deathNC размещена 30.03.2012 в 21:16 deathNC вне форума
    Обновил(-а) deathNC 30.03.2012 в 22:17
  10. Старый комментарий
    Аватар для БогДелфей
    Смысл всех этих танцев с бубном? Ну один раз это прокатит, потом хитрый юзер просечёт, что прога самоликвидируется и в следующий раз перед запуском, юзер её скопирует и будет пользоваться, конечно не удобно каждый раз копировать файл и запускать, но может прога стоит того
    Запись от БогДелфей размещена 18.05.2012 в 13:06 БогДелфей вне форума
  11. Старый комментарий
    Аватар для #pragma
    Интересная статья
    http://deadbeef.narod.ru/work/articles/selfdel.htm
    Запись от #pragma размещена 13.08.2012 в 22:07 #pragma вне форума
    Обновил(-а) #pragma 26.09.2012 в 00:38
  12. Старый комментарий
    Аватар для snake32
    Надо как-нить на досуге написать последний метод...
    Запись от snake32 размещена 08.11.2012 в 18:27 snake32 на форуме
  13. Старый комментарий
    Цитата:
    Сообщение от БогДелфей Просмотреть комментарий
    Смысл всех этих танцев с бубном? Ну один раз это прокатит, потом хитрый юзер просечёт, что прога самоликвидируется и в следующий раз перед запуском, юзер её скопирует и будет пользоваться, конечно не удобно каждый раз копировать файл и запускать, но может прога стоит того
    Надо оставлять пометку в реестре и хитрому юзеру сообщать "Вы уже запускали эту программу! До свиданья!"
    Запись от rvs_dk размещена 01.10.2019 в 13:13 rvs_dk вне форума
  14. Старый комментарий
    Аватар для vedunasv
    Цитата:
    Удаление программы из самой себя
    Ну, не знаю, как там должно быть, но у меня легко получалось удалить из самой программы саму себя. Хотя по началу тоже был батник.
    А на вопрос, что может быть предварительная копия, так это тоже легко исправляется-в начале запуска элементарная проверка - легальная копия или нет. если нет, то и запуска нет....
    Запись от vedunasv размещена 24.05.2020 в 10:24 vedunasv вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru