Форум программистов, компьютерный форум CyberForum.ru

Самоудаление программы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.88
лендер
46 / 46 / 2
Регистрация: 12.01.2010
Сообщений: 183
30.08.2010, 15:00     Самоудаление программы #1
возможно ли, удаление самой себя проги сразу после запуска, на крайняк по окончанию работы, и как это осуществить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2010, 15:00     Самоудаление программы
Посмотрите здесь:

C++ Подскажите. Не компилирует текст программы, запрашивает в коде мол не достающую скобку. Ниже приведен текст программы.
C++ Дан текст программы на С++...Записать в выходной файл текст программы без комментариев
Открытие файла другой программы из программы.Косяк. C++
обясните структуру программы , что выполнняет каждая строчка программы, зараннее благодарен! C++
Ребята, . пожалуйста! Вот текстовые программы. Вообще в строках не соображаю, прошу о .! программы на С++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Black Fregat
 Аватар для Black Fregat
1353 / 983 / 215
Регистрация: 31.05.2009
Сообщений: 4,093
30.08.2010, 15:24     Самоудаление программы #2
Прямого способа не существует - пока программа работает, ее файл открыт монопольно и удален быть не может.

Мне встречалась статья, в которой приводилось с десяток "обходных" способов.

Лично я создаю и запускаю bat-файл, который в цикле пытается удалить программу, проверяя, удалось ли ему это, а потом удаляет сам себя (для bat-файлов это возможно - интерпретатор закрывает файл перед выполнением команды). Для удаления остается только завершить саму программу.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
30.08.2010, 15:55     Самоудаление программы #3
Можно создать системный таск, к-рый выполниться через секунду после окончания программы и удалит екзешник.

Добавлено через 24 минуты
Здесь подробнее о Task Scheduler 2.0 - но он появился только в Висте.
http://msdn.microsoft.com/en-us/magazine/cc163350.aspx
лендер
46 / 46 / 2
Регистрация: 12.01.2010
Сообщений: 183
30.08.2010, 19:17  [ТС]     Самоудаление программы #4
можешь написать текст батника если к примеру прога называется name.exe а то я в батниках к сожалению не очень
Vladimir616
110 / 110 / 3
Регистрация: 05.07.2009
Сообщений: 224
30.08.2010, 19:44     Самоудаление программы #5
лендер, а в этом ничего сложного нет:
Batch.bat -
Lisp
1
2
ping -n 1 -w 1000 0.0.0.0 >nul
del name.exe
Здесь первая команда создаёт задержку в 1 секунду, чтобы дать программе закрыться.
name.exe -
C++
1
2
3
4
5
6
7
#include <windows.h>
int main()
{
    //что-то делаем
    ShellExecute(NULL, "open", "Batch.bat", NULL, NULL, NULL);
    return 0;
}
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
30.08.2010, 20:47     Самоудаление программы #6
Цитата Сообщение от Vladimir616 Посмотреть сообщение
ping -n 1 -w 1000 0.0.0.0 >nul
Вместо задержки ругается на неправильный айпишник, с 0.0.0.1 работает вроде.
Цитата Сообщение от Black Fregat Посмотреть сообщение
Прямого способа не существует - пока программа работает, ее файл открыт монопольно и удален быть не может.
Но есть кривой способ: если загнать exeшник в NTFS поток какого-то файла, то этот файл нормально удаляется.
Вот я попробовал написать - если вариант с NTFS потоком прокатывает, то прога перезапускается из нового места и файл удаляется, если не прокатывает - то удаляется после закрытия.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <cstdio>
#include <cstdlib>
#include <string>
#include <windows.h>
 
using namespace std;
 
const char batText[] = ":1\r\n ping -n 1 -w 1000 0.0.0.1\r\n del %1\r\n if exist %1 goto 1\r\n del %0";
const char batName[] = "1.bat";
const char tempName[] = "1.bat:qq.exe";
const char tempNameWithParam[] = "1.bat:qq.exe x2";
 
void Work()
{
    while (1)
        printf("%d ", rand());
}
 
int Execute(const char* cmdLine, WORD visibility)
{
    STARTUPINFO si = {sizeof(STARTUPINFO)};
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = visibility;
    PROCESS_INFORMATION pi;
    BOOL res = CreateProcess(0, const_cast<char*>(cmdLine), 0, 0, FALSE, CREATE_NEW_CONSOLE, 0, 0, &si, &pi);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    return res;
}
 
int main(int argc, char *argv[])
{
    if (argc >= 2 && strcmp(argv[1], "x2") == 0)
        Work();
 
    FILE* f = fopen(batName, "wb");
    fwrite(batText, 1, sizeof(batText) - 1, f);
    fclose(f);
    Execute((string(batName) + ' ' + argv[0]).c_str(), SW_HIDE);
 
    if (!CopyFile(argv[0], tempName, FALSE) || !Execute(tempNameWithParam, SW_SHOW))
        Work();
}
(ShellExecute название с потоком не переварил)
hromjo
0 / 0 / 0
Регистрация: 04.04.2010
Сообщений: 82
30.08.2010, 21:50     Самоудаление программы #7
Ну не знаю. У меня в ubuntu можно напрямую. Даже apt-get пакет из самого же
Автор темы, ты бы хоть какая система сказал
Black Fregat
 Аватар для Black Fregat
1353 / 983 / 215
Регистрация: 31.05.2009
Сообщений: 4,093
30.08.2010, 23:05     Самоудаление программы #8
Цитата Сообщение от hromjo Посмотреть сообщение
Автор темы, ты бы хоть какая система сказал
Уел, да. Невнимательность налицо - почему-то вопросов о системе не возникло

Добавлено через 6 минут
Цитата Сообщение от лендер Посмотреть сообщение
можешь написать текст батника если к примеру прога называется name.exe а то я в батниках к сожалению не очень
Примерно так:
Код
@echo off
:loop
del Name.exe
if exist Name.exe goto :loop
del %0
Но это сработает, если батник запускать из той же папки, иначе надо полные пути писать
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
30.08.2010, 23:15     Самоудаление программы #9
А можно как-то найти указатель на программу в памяти,или на диске,или что-то подобное,загрузить саму программу в память полностью,и уже потом все обращения процесса (или ОС?) сделать не к диску,а в эту область памяти?
Я примерно понимаю,что хочет автор
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
31.08.2010, 10:29     Самоудаление программы #10
Автор, держи. Прога удаляет сама себя
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <stdio.h>
#include <windef.h>
#include <WINDOWS.H>
#include <WINBASE.H>
 
void DelSelf(void)
{
           char modulename[MAX_PATH];
           char batfile[MAX_PATH];
           char batlines[MAX_PATH*4];
           LPSTR tempdir;
           char Buf[MAX_PATH];
 
           GetModuleFileName(NULL,modulename,MAX_PATH);
 
           tempdir = ((GetEnvironmentVariable(TEXT("TEMP"),
           Buf, MAX_PATH) > 0) ? Buf : NULL);
 
           strcpy(batfile,tempdir);
           strcat(batfile,"\\");
           strcat(batfile,"delself.bat");
           strcpy(batlines,"@echo off\n:try\ndel ");
           strcat(batlines,modulename);
           strcat(batlines,"\nif exist ");
           strcat(batlines,modulename);
           strcat(batlines," goto try\n");
           strcat(batlines,"del ");
           strcat(batlines,batfile);
 
           DWORD NOfBytes;
 
           HANDLE hbf= CreateFile(batfile, GENERIC_WRITE | GENERIC_READ,
           FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
           FILE_ATTRIBUTE_NORMAL, NULL);
 
           WriteFile(hbf,batlines,strlen(batlines),&NOfBytes, NULL);
           CloseHandle(hbf);
 
           STARTUPINFO si;
           PROCESS_INFORMATION pi;
           ZeroMemory( &si, sizeof(si) );
           si.cb = sizeof(si);
           si.wShowWindow = SW_HIDE;
           si.dwFlags = STARTF_USESHOWWINDOW;
          
           CreateProcess(
                                           NULL,
                                           batfile,
                                           NULL,
                                           NULL,
                                           FALSE,
                                           IDLE_PRIORITY_CLASS|DETACHED_PROCESS,
                                           NULL,
                                           NULL,
                                           &si,
                                           &pi);
 
}
int main()
{
           DelSelf();
 return 0;
}
Компиль, получившийся экзешник вставляй в любую директорию, в полном имени которой НЕТ ПРОБЕЛОВ.
Русские буквы канают
ПОсле запускай экзешник и смотри, как он исчезнет.
Пиши.

Добавлено через 16 минут
Код не мой, но мы же здесь вроде как одна семья?!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2010, 14:20     Самоудаление программы
Еще ссылки по теме:

Запуск программы без создания окна. Запуск фоновой программы C++
Составить блок схему для программы упорядочивания чисел в массиве(код программы прилагается) C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
31.08.2010, 14:20     Самоудаление программы #11
Поправка: строка 39
C++
1
    Execute((string(batName) + " \"" + argv[0] + "\"").c_str(), SW_SHOW);
А то с путём с пробелами не работает. Хотя вся равно в варианте с bat файлом будут проблемы с символами, которых в досовской кодировке нет. Например, если в пути есть "©", то он заменит его на "c" и зависнет в цикле удаления.
Yandex
Объявления
31.08.2010, 14:20     Самоудаление программы
Ответ Создать тему
Опции темы

Текущее время: 15:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru