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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
hrustash
3 / 3 / 1
Регистрация: 05.04.2013
Сообщений: 42
#1

Самоудаляющаяся программа - C++

27.06.2013, 15:33. Просмотров 1448. Ответов 9
Метки нет (Все метки)

Не знал, в какой именно топик написать, и, т.к. сам еще начинающий, написал сюда.

Нужно написать программу, которая требует ввода пароля, если пароль трижды введен неверно, программа самоудаляется. (.exe файл)
Самоудаление реализовывал через создание батника. Сразу скажу, что какое именно содержимое записывать в батник додумался я не сам.

Проблема в том, что батник создается, его содержание даже, на мой взгляд, имеет смысл, но екзешник не удаляется.
вот код СИ-шной части
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
#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
using namespace std;
void main()
{
    setlocale(0, "RUS");
    string password = "password", enter;
    unsigned short counter = 0;
    while(counter!=3)
    {
        cout<<"Please enter password: "<<endl;
        cin>>enter;
        counter=counter+1;
        if(password==enter)
        {
            cout<<"Success"<<endl;
            system("pause");
            exit(0);
        }
        else cout<<"Fail"<<endl;
    }
    cout<<"Delete"<<endl;
    system("pause");
    char* filename = new char [1000];
    GetModuleFileName(0, filename, 1000); // посылается в filename полное имя файла.
    string tmp=filename;
    int index = tmp.find_last_of("\\");
    tmp=tmp.substr(index+1);
    ofstream del("deleting.bat");
    del<<"chcp1251"<<endl;          
    del<<":Repeat\ndel\""<<tmp<<"\"\nif exist\""<<tmp<<"\"go to Repeat"<<endl<<"del%0";
    del.close();
    string str = filename;
    index = str.find_first_of("\\");
    while(index!=-1)
    {
        str[index]='/';
        index=str.find_first_of("\\");
    }
    index=str.find_last_of("/");
    str.erase(index+1);
    str=str+"deleting.bat";
    ShellExecute(0, "open", (char*)str.c_str(), 0, 0, 0);
    exit(0);
}
и вот содержимое батника (открыл в блокноте), которое получается.

chcp1251
:Repeat
del"лаба№3.exe"
if exist"лаба№3.exe"go to Repeat
del%0

Может, кто-нибудь сможет мне тут помочь?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2013, 15:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Самоудаляющаяся программа (C++):

Программа , которая выводит время, за которое программа работает - C++
Вообщем, нужно что бы считалось время от начала работы программы, и выводилось на экран.

Первая программа. Код не компилируется и не запускается программа. - C++
Первая программа, первая ошибка Здравствуйте! Решил учить С++. Скачал книгу Programming: Principles and Practice Using C++, Бьерн...

Программа не может быть запущена, т.к. на Вашем компьютере установлена программа-эмулятор - Игры
При запуске лицензионной детской игровой программы выскакивает сообщение: Программа не может быть запущена, т.к. на Вашем компьютере...

Квин-программа, или программа, печатающая свой исходный текст - Visual Basic
Задаю этот вопрос под влиянием этой темы и предлагаю решение: Sub Kvin() Dim A(1 To 13) As String X = Chr$(65) + Chr$(40) ...

Программа циков с неизвестным число повторений и программа с внутренним ветвлением - Pascal
1.Дано натуральное число n. Получить наименьшее натуральное число вида m в степени 2, превосходящее n. 2.Дан числовой массив А, состоящий...

Программа подсчета числа неуспевающих и программа поиска владельца автомобиля... - Pascal
Помогите пожалуйста решить 2 задачи: Составьте программу подсчета числа неуспевающих по информатике школьников в классе, и выводящую...

9
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
27.06.2013, 17:16 #2
@hrustash, Нужно форкаться. В линукс POSIX API есть функция fork(), которая создаёт копию текущего процесса. В виндовс есть что-то похожее.
0
Dr_Quake
Заблокирован
27.06.2013, 17:37 #3
Нету. Но зато на NTFS работает DeleteFile на себя с зачисткой после завершения держащего процесса.
0
NoMasters
Псевдослучайный
1762 / 1105 / 73
Регистрация: 13.09.2011
Сообщений: 3,141
27.06.2013, 18:10 #4
Цитата Сообщение от xtorne21st Посмотреть сообщение
Нужно форкаться.
Но зачем? Винды не умеют, а в линуксах и так можно анлинкнуть бинарник.
0
Dr_Quake
Заблокирован
27.06.2013, 18:10 #5
@NoMasters, в винде тоже можно, но я просто не знаю как, надо покопать гугл на эту тему. И в никсах, и в винде - unlink на открытый файл - свойство ФАЙЛОВОЙ СИСТЕМЫ в первую очередь, а не ОС.
0
abit
271 / 270 / 34
Регистрация: 03.02.2013
Сообщений: 754
27.06.2013, 18:35 #6
можно попробывать через файловый флаг FILE_FLAG_DELETE_ON_CLOSE
вот тут поподробнее описано
http://deadbeef.narod.ru/work/articles/selfdel.htm
0
nxtech
77 / 59 / 2
Регистрация: 26.06.2013
Сообщений: 198
27.06.2013, 18:42 #7
Работает на Win XP и 7 x64. Используется файловая поточность NTFS. На FAT работать не будет.
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
#include <iostream>
#include <string>
#include <windows.h>
 
int main(int argc, char* argv[])
{
 
    if (argc == 1)
    {
        std::cout << std::endl << "I'm a victim" << std::endl;
 
        std::string src(argv[0]);
        std::string dst(src + ":killer");
        std::string cmd("\"" + dst + "\" " "\"" + src + "\"");
 
        CopyFile(src.c_str(), dst.c_str(), false);
        system("PAUSE");
        WinExec(cmd.c_str(), SW_SHOW);
    }
    if (argc > 1)
    {
        std::cout << std::endl << "I'm a killer and self-killer" << std::endl;
 
        system("PAUSE");
        DeleteFile(argv[1]);
    }
 
    return 0;
}
По хорошему нужно через CreateProcess передать PID родителя дочернему процессу. И дождаться завершения родительского процесса в дочернем, а потом удалять.
0
MrCold
855 / 753 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
27.06.2013, 21:12 #8
Чуток поправить код ТС
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
#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
 
void DeleteApplication()
    {
        std::cout<<"Good bye!"<< std::endl;
        Sleep(1000);
        char* filename = new char [200];
        GetModuleFileName(0, filename, 200); // посылается в filename полное имя файла.
        std::string tmp = filename;
        std::ofstream delbatfile("deleting.bat");
        delbatfile << (":dc\n del "
                 + tmp +  "\nif exist "
                 +  tmp + " goto dc\n del deleting.bat" );
        delbatfile.close();
        delete [] filename;
    WinExec( "deleting.bat", FALSE );
    }
 
int main()
{
    std::string password = "password", enter;
    unsigned short counter = 0;
    while(true)
    {
        std::cout<<"Please enter password: "<< std::endl;
        std::cin >> enter;
        
        if(password == enter)
        {
          break;
        }
         if(counter == 2)
        {
          DeleteApplication();
          return (0);
        }       
        std::cout << "Error input !!!" << std::endl;
        counter++;
    }
 
     std::cout<<"Authorization is successful."<< std::endl;
     system("pause");
}
0
hrustash
3 / 3 / 1
Регистрация: 05.04.2013
Сообщений: 42
28.06.2013, 13:01  [ТС] #9
нашел решение: чуток подправил вывод в батник, работает при запуске экзешника с рабочего стола. В принципе, так и надо
0
Asilis
0 / 0 / 0
Регистрация: 07.08.2014
Сообщений: 2
29.08.2015, 12:34 #10
hrustash, Как ты сделал, напиши пожалуйста!
0
29.08.2015, 12:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2015, 12:34
Привет! Вот еще темы с ответами:

Программа с метками и оператором перехода GOTO. Программа с циклом полусловия - Pascal
Задача №9. Прошу вас, помогите. Не знаю как решать вообще.

Программа для трёх маршрутов. Правильно ли написана программа? - PascalABC.NET
Всем здрасьте! Программа для трёх маршрутов. Кому не сложно подскажите правильно ли я написал?var a, b, c, d, e, f, g : boolean; s...

не пойму в чем дело, программа должна работать, но она черт побери не работает :( (программа по работе с реестром) - Delphi
Программа предназначена для поиска какого-нить слова по реестру и удаления ключа или раздела если в нем встречается искомое слово. С...

Что такое программа-сервер, программа-клиент - Базы данных
Учусь заочно и надо контрольную сделать вкратце я и сам объясню, но надо хотя бы листов на 10 Помогите плиз. Уже весь инет облазил....


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru