Форум программистов, компьютерный форум CyberForum.ru
С наступающим Новым годом!
CyberForum.ru - форум программистов и сисадминов > >
Восстановить пароль Регистрация
фсякая инитиресссная фсячина
Оценить эту запись

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

Запись от 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;
Просмотров 25388 Комментарии 12
Всего комментариев 12

Комментарии

  1. Старый комментарий
    Аватар для AzaKendler
    а нельзя ли например сделать так. в исполняемом файле должен быть код, который "воткнется" в память стороннего процесса и будет "присматривать" за твоей прогой. по выполнении - удалит ее. ну а после перезагрузки помрет и сам. это может кажется сложнее, но зато без bat и прочего
    permalink
    Запись от AzaKendler размещена 28.03.2012 в 22:41 AzaKendler вне форума
  2. Старый комментарий
    Цитата:
    "воткнется" в память стороннего процесса
    и его тут же порежет предусмотрительный авирь, отсутствие которого на машине пользователя вы предусмотреть не сможете.
    permalink
    Запись от raxp размещена 29.03.2012 в 11:43 raxp на форуме
  3. Старый комментарий
    Аватар для Pure
    ну породить сторонний процесс из текста никто не мешает. можно и не трогать работающие процессы. это условности.
    permalink
    Запись от Pure размещена 30.03.2012 в 15:38 Pure вне форума
  4. Старый комментарий
    ...это все же разные подходы: породить свой процесс или цеплятся к чужим. Только чем это (первое) будет отличаться от создания того же батника?
    permalink
    Запись от raxp размещена 30.03.2012 в 15:49 raxp на форуме
  5. Старый комментарий
    Аватар для Vovan-VE
    WinAPI, удаление при перезагрузке:
    Код Delphi
    1
    
    MoveFileEx(PChar(ParamStr(0)), nil, MOVEFILE_DELAY_UNTIL_REBOOT);
    permalink
    Запись от Vovan-VE размещена 30.03.2012 в 16:12 Vovan-VE вне форума
  6. Старый комментарий
    Аватар для deathNC
    Просто у меня возникла задача - удалиться сразу после завершения работы, не оставив никаких следов, и не трогая никаких процессов.
    но тут у меня опять косяк... если перевести имя в OEM русскую кодировку, то, например, имя с китайским не удалит. Но на этот случай в батнике можно обращаться к параметрам
    Код Code
    1
    2
    3
    4
    5
    
    @echo off
    :lbl1
    del %1%
    if exist %1% goto lbl1
    del %0%
    я мог ошибиться с синтаксисом, ибо командный язык windows для меня ещё тёмный лес, но примерно такой код батника должен удалить хоть что, хоть где... выложу более правильный вариант, когда найду его...

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

    а подходы конечно разные. ты же завел волынко про авири какие-то
    permalink
    Запись от Pure размещена 30.03.2012 в 19:59 Pure вне форума
  8. Старый комментарий
    ...гляньте выше в контексте чего был коммент про авири
    permalink
    Запись от raxp размещена 30.03.2012 в 20:12 raxp на форуме
  9. Старый комментарий
    Аватар для deathNC
    Конечно, можно при желании хоть военный самолёт взломать и прописать бесконечные патроны.
    Действительно ли стоит внимания такой метод - внедряться в процессы? Надо учитывать, что эта прога может попасть на любой компьютер. А так как это полезный софт, а не вирусятина - мне не надо, чтобы антивирусники начали материться... так что мне кажется, что батником обойтись легче
    хотя я не боженька (я вообще в боженьку не верю), и могу ошибаться
    если ошибаюсь - покажите более правильный способ самоудаления
    permalink
    Запись от deathNC размещена 30.03.2012 в 21:16 deathNC вне форума
    Обновил(-а) deathNC 30.03.2012 в 22:17
  10. Старый комментарий
    Аватар для БогДелфей
    Смысл всех этих танцев с бубном? Ну один раз это прокатит, потом хитрый юзер просечёт, что прога самоликвидируется и в следующий раз перед запуском, юзер её скопирует и будет пользоваться, конечно не удобно каждый раз копировать файл и запускать, но может прога стоит того
    permalink
    Запись от БогДелфей размещена 18.05.2012 в 13:06 БогДелфей вне форума
  11. Старый комментарий
    Аватар для #pragma
    Интересная статья
    http://deadbeef.narod.ru/work/articles/selfdel.htm
    permalink
    Запись от #pragma размещена 13.08.2012 в 22:07 #pragma вне форума
    Обновил(-а) #pragma 26.09.2012 в 00:38
  12. Старый комментарий
    Аватар для snake32
    Надо как-нить на досуге написать последний метод...
    permalink
    Запись от snake32 размещена 08.11.2012 в 18:27 snake32 вне форума
 
Текущее время: 21:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.7 PL3
Copyright ©2000 - 2014, vBulletin Solutions, Inc.
Яндекс.Метрика