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

Самоудаление/Удаление себя/Самоудаляющийся exe

Запись от Van111 размещена 31.12.2014 в 00:39

давно хотел разобраться с данным вопросом, но то ли ума не хватало, то ли находчивости. Сейчас выдалась свободная минутка и я решил попробовать реализовать старую идею.

Изначально код был написан на с++(правда я использовал char вместо std::string что уже отдаляло мой код от ООП) , но потом решил обойтись без всяких обёрток и абстракций и написать на чистом СИ.


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
#define _CRT_SECURE_NO_WARNINGS
 
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
 
//функция самоуничтожения
//name_execute_file - полный путь исполняемого файла
int self_destruction(char *name_execute_file)
{
    const int max_size_buffer = 256;// максимальный размер буфера
 
    int status_execute;// результат выполнения
 
    const char name_bat[] = "no_repeat_name_file_del.bat";// имя батника которое не должно повторится 
    char command[256] = "";// команда в кодировке 1251
 
    sprintf_s(command, max_size_buffer, "del \"%s\"\r\ndel %s", name_execute_file, name_bat); // обойдёмся без std::string
 
    char buffer[256];// команда в кодировке Oem
    CharToOemA((LPSTR)command, buffer);// теперь поддерживаем и русские символы
 
    FILE *f = fopen(name_bat, "w");// обойдёмся без std::ofstream
    fprintf(f, "%s", buffer);// записали команду
    fclose(f);//закрыли файл
 
    PROCESS_INFORMATION pinf = { 0 };// не используется, обязательна нужна для функции создания процесса
    STARTUPINFO sinf = { 0 };// не используется, обязательна нужна для функции создания процесса
    if ((status_execute = CreateProcessA(name_bat, 0, 0, 0, FALSE, CREATE_NO_WINDOW, 0, 0, &sinf, &pinf)) == 0)// если не удалось по какой то причине запустить батник
    {
        status_execute = GetLastError();// получаем код ошибки
    }
    else
    {
        status_execute = 0;// иначе возвращаем код успешного выполнения
    }
    return status_execute;// вернём результат работы
 
 
}
 
int main(int narg, char *args[])
{
    return self_destruction(args[0]); // в случаи успешного выполнения вернём 0, передаём функции полный путь к запускаемому файлу
}
Размещено в Без категории
Показов 4699 Комментарии 7
Всего комментариев 7
Комментарии
  1. Старый комментарий
    Аватар для Avazart
    C++
    1
    
    CharToOemA((LPSTR)command, buffer);// теперь поддерживаем и русские символы
    И зачем?

    В STARTUPINFO sinf = { 0 }; нужно размер инициализировать.
    А вообще ShellExecute() должно быть достаточно.
    Запись от Avazart размещена 12.01.2015 в 14:32 Avazart вне форума
  2. Старый комментарий
    Аватар для Avazart
    C++
    1
    
    char command[256] = "";// команда в кодировке 1251
    Тоже вопрос, а зачем, если передаем ?
    C++
    1
    
    sprintf_s(command, max_size_buffer, "del \"%s\"\r\ndel %s", name_execute_file, name_bat);
    Ну да к черту С++, подавай sprintf_s() приблуду.

    Итого многобукв как для простого решения с батником.
    Запись от Avazart размещена 12.01.2015 в 14:33 Avazart вне форума
    Обновил(-а) Avazart 12.01.2015 в 14:37
  3. Старый комментарий
    Цитата:
    Код C++
    1
    CharToOemA((LPSTR)command, buffer);// теперь поддерживаем и русские символы
    И зачем?
    в пути к файлу могут быть русские символы

    Цитата:
    Итого многобукв как для простого решения с батником.
    я так понял единственное что у вас получается это обсирать людей.
    но мне это в принципе по боку, вы свою репутацию давно потеряли, достаточно вспомнить ваши склоки с
    -=ЮрА=-, где он несомненно был прав а вы в свою очередь только воду лили.
    Запись от Van111 размещена 14.01.2015 в 20:49 Van111 вне форума
  4. Старый комментарий
    Аватар для Avazart
    Цитата:
    Сообщение от Van111 Просмотреть комментарий
    я так понял единственное что у вас получается это обсерать людей.
    В этом нет нужны ибо некоторые давно уже себя загнали в яму с нечистотами своей невосприимчивостью к чужой критике.
    Запись от Avazart размещена 15.01.2015 в 18:26 Avazart вне форума
    Обновил(-а) Avazart 16.01.2015 в 23:10
  5. Старый комментарий
    Цитата:
    невосприимчивостью к чужой критике
    может критике не хватает адекватности
    Запись от Van111 размещена 16.01.2015 в 13:04 Van111 вне форума
  6. Старый комментарий
    Цитата:
    в пути к файлу могут быть русские символы
    OEM - 866, а виндовским функциям надо 1251. Зачем батнику символы в 866?
    Запись от Enno размещена 16.01.2015 в 17:49 Enno вне форума
    Обновил(-а) Enno 16.01.2015 в 17:51
  7. Старый комментарий
    Аватар для Avazart
    Цитата:
    И зачем?
    Это был вопрос.
    Цитата:
    В STARTUPINFO sinf = { 0 }; нужно размер инициализировать.
    Читаем Рихтера: (ну и смотрим примеры MSDN)
    Цитата:
    Элементы структуры STARTUPINFO используются Windows-функциям и при созда-
    нии нового процесса. Надо сказать, что большинство приложений порождает процес-
    сы с атрибутами по умолчанию, Но и в этом случае Вы должны инициализировать все
    элементы структуры STARTUPINFO хотя бы нулевыми значениями, а в элемент сb —
    заносить размер этой структуры
    :
    C++
    1
    2
    
    STARTUPINFO si = { sizeof(si) };
    CreateProcess(..., &si, ...);
    К сожалению, разработчики приложений часто забывают о необходимости инициализации этой структуры.
    //...
    Цитата:
    А вообще ShellExecute() должно быть достаточно.
    Цитата:
    Итого многобукв как для простого решения с батником.
    На С++ + ShellExecute()
    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <windows.h>
     
    int main(int narg, char *args[])
    {
      using namespace std;
      stringstream batName;
      batName<<args[0]<<"~.bat";
     
      ofstream ofs(batName.str().c_str());
      ofs<<"chcp 1251"    <<endl
          <<"del \""<<args[0]<<"\""<<endl
          <<"del \""<<batName.rdbuf()<<"\""<<endl;
      ofs.close();
     
      return (int)ShellExecuteA(0,0,batName.str().c_str(),0,0,SW_HIDE)>32;   
    }


    Цитата:
    Сообщение от Van111
    может критике не хватает адекватности
    Ну и в чем неадекватность критики?
    Запись от Avazart размещена 16.01.2015 в 20:39 Avazart вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru