r3xq1
Проверенный
Проверенный

r3xq1
Проверенный
Проверенный
- Сообщения
- 53
- Реакции
- 29
Код для само удаления программы после выполнения всех функций
Вариант первый:
Вариант второй: (без использования командного файла)
Ещё один вариант:
Затем просто вызываем в конце метод SelfDeleteApp
Вариант первый:
C++:
#include <iostream>
#include <windows.h>
void autoDelete()
{
TCHAR szFile[MAX_PATH], szCmd[MAX_PATH];
if ((GetModuleFileName(0, szFile, MAX_PATH) != 0) && (GetShortPathName(szFile, szFile, MAX_PATH) != 0))
{
lstrcpy(szCmd, "/c del ");
lstrcat(szCmd, szFile);
lstrcat(szCmd, " >> NUL");
if (GetEnvironmentVariable("ComSpec", szFile, MAX_PATH) != 0) ShellExecute(0, 0, szFile, szCmd, 0, SW_HIDE);
}
exit(0);
}
int main()
{
autoDelete();
return 0;
}
C++:
#include <Windows.h>
#include <stdlib.h>
#include <tchar.h>
/////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE h, HINSTANCE h2, LPSTR psz, int n)
{
// Это оригинальный EXE-файл или клон ?
// Исходный EXE получает один аргумент,
// клон больше.
if (__argc == 1)
{
// Оригинальный EXE: Запустит клон.
// Скопируем EXE во временную директорию
TCHAR szPathOrig[_MAX_PATH], szPathClone[_MAX_PATH];
GetModuleFileName(NULL, szPathOrig, _MAX_PATH);
GetTempPath(_MAX_PATH, szPathClone);
GetTempFileName(szPathClone, __TEXT("Del"), 0, szPathClone);
CopyFile(szPathOrig, szPathClone, FALSE);
// Откроем клон с помощью FILE_FLAG_DELETE_ON_CLOSE
HANDLE hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, NULL,
OPEN_EXISTING,FILE_FLAG_DELETE_ON_CLOSE);
// Запустите клон. Передайте PID и полный путь
// или оригинальный файл
TCHAR szCmdLine[512];
HANDLE hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE,
GetCurrentProcessId());
wsprintf(szCmdLine, __TEXT("%s %d \"%s\""), szPathClone,
hProcessOrig, szPathOrig);
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, 0,
NULL, NULL, &si, &pi);
CloseHandle(hProcessOrig);
CloseHandle(hfile);
// Теперь оригинальный процесс может прекратиться
} else {
// Clone-EXE: удалит оригинальный EXE после завершения
HANDLE hProcessOrig = (HANDLE) _ttoi(__targv[1]);
WaitForSingleObject(hProcessOrig, INFINITE);
CloseHandle(hProcessOrig);
DeleteFile(__targv[2]);
}
return(0);
}
C++:
#include <windows.h>
#include <strsafe.h>
#define SELF_REMOVE_STRING TEXT("cmd.exe /C ping 1.1.1.1 -n 1 -w 3000 > Nul & Del /f /q \"%s\"")
void SelfDeleteApp() {
TCHAR szModuleName[MAX_PATH], szCmd[2 * MAX_PATH];
STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi = { 0 };
GetModuleFileName(NULL, szModuleName, MAX_PATH);
StringCbPrintf(szCmd, 2 * MAX_PATH, SELF_REMOVE_STRING, szModuleName);
CreateProcess(NULL, szCmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
C++:
int _tmain(int argc, char **argv){
SelfDeleteApp();
}
Последнее редактирование: