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

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

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

Нужно написать программу, которая требует ввода пароля, если пароль трижды введен неверно, программа самоудаляется. (.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

Может, кто-нибудь сможет мне тут помочь?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
27.06.2013, 17:16     Самоудаляющаяся программа #2
@hrustash, Нужно форкаться. В линукс POSIX API есть функция fork(), которая создаёт копию текущего процесса. В виндовс есть что-то похожее.
Dr_Quake
Заблокирован
27.06.2013, 17:37     Самоудаляющаяся программа #3
Нету. Но зато на NTFS работает DeleteFile на себя с зачисткой после завершения держащего процесса.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
27.06.2013, 18:10     Самоудаляющаяся программа #4
Цитата Сообщение от xtorne21st Посмотреть сообщение
Нужно форкаться.
Но зачем? Винды не умеют, а в линуксах и так можно анлинкнуть бинарник.
Dr_Quake
Заблокирован
27.06.2013, 18:10     Самоудаляющаяся программа #5
@NoMasters, в винде тоже можно, но я просто не знаю как, надо покопать гугл на эту тему. И в никсах, и в винде - unlink на открытый файл - свойство ФАЙЛОВОЙ СИСТЕМЫ в первую очередь, а не ОС.
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
27.06.2013, 18:35     Самоудаляющаяся программа #6
можно попробывать через файловый флаг FILE_FLAG_DELETE_ON_CLOSE
вот тут поподробнее описано
http://deadbeef.narod.ru/work/articles/selfdel.htm
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 родителя дочернему процессу. И дождаться завершения родительского процесса в дочернем, а потом удалять.
MrCold
851 / 749 / 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");
}
hrustash
3 / 3 / 1
Регистрация: 05.04.2013
Сообщений: 42
28.06.2013, 13:01  [ТС]     Самоудаляющаяся программа #9
нашел решение: чуток подправил вывод в батник, работает при запуске экзешника с рабочего стола. В принципе, так и надо
Asilis
0 / 0 / 0
Регистрация: 07.08.2014
Сообщений: 2
29.08.2015, 12:34     Самоудаляющаяся программа #10
hrustash, Как ты сделал, напиши пожалуйста!
Yandex
Объявления
29.08.2015, 12:34     Самоудаляющаяся программа
Ответ Создать тему
Опции темы

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