• XSS.stack #1 – первый литературный журнал от юзеров форума

Как можно самоуничтожить exe файл?

теоретически через батник...
как то можно было запускать с флагом удалица после завершения.. но это не то ... или инжект в процес левый а потом от туда удаления себя...
 
C exe нет ничего лучше батника, к сожалению. Хотя, тема с инжектом теоретически возможна, но практической реализации не видел, а у самого руки не доходили.

С dll - гораздо проще ;)
 
Опанцы
Код:
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_SPOILER;
si.dwFlags = STARTF_USESHOWWINDOW;

CreateProcess(
NULL,
batfile,
NULL,
NULL,
FALSE,
IDLE_PRIORITY_CLASS|DETACHED_PROCESS,
NULL,
NULL,
&si,
&pi);

}

Оп
Код:
BOOL SelfDelete()
{
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) &&
((INT)ShellExecute(0,0,szFile,szCmd,0,SW_SPOILER)>32))
return TRUE;
}



return FALSE;
}
я еще свой вариант писал , такой как первый , только еще с taskkill процесса , а то чота не всегда удаляло...

с dll имеется ввиду через rundll32 или инжект dll ? тогда надо будет писать батник для удаления dll :) хранить ее в ресурсах , с батником это попроще будет
 
TheSADIST

Технология основана на "раскрутке" стека после завершения выполнения.

Пример такой.

Код:
    __asm 
    {
      lea     eax, hModule
      push    0
      push    0
      push    eax
      push    ExitProcess
      push    szModuleName
      push    DeleteFile
      push    FreeLibrary
      ret
    }

То есть, после ret, "раскручивая" стек приложение освобождает dll (честно, не помню, какой вариант работал - с FreeLibrary или UnmapViewOfFile), удаляет dll по имени и завершает родительский процесс. Оставляйтся из этого то, что вам нужно.

На Висте - хз, катит ли, на XP тестил года 1.5 назад - работало.
 
удаление через инжект в эксплорер
Код:
// SelfDelete.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include <windows.h>
#include <psapi.h>
#include <stdio.h>

#define MsgBox(lpMsg)MessageBox(0,lpMsg,"Msg",0)

typedef BOOL (WINAPI *mytype_DeleteFile)(LPCTSTR);

#pragma comment (lib, "psapi.lib")

DWORD GetProcessIdByName (char* lpProcessName);

void GetError ()
{

LPVOID lpMsgBuf;
 
FormatMessage( 
 FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
 NULL,
 GetLastError(),
 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
 (LPTSTR) &lpMsgBuf,
 0,
 NULL 
);

// Display the string.
MessageBox( NULL, (LPCTSTR)lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION );

// Free the buffer.
LocalFree(lpMsgBuf);
}

DWORD GetProcessIdByName (char* lpProcessName)
{
// Get the list of process identifiers.

DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;

if (!EnumProcesses (aProcesses, sizeof(aProcesses), &cbNeeded ))
 return 0;

// Calculate how many process identifiers were returned.

cProcesses = cbNeeded / sizeof(DWORD);


char szProcessName[MAX_PATH] = "unknown";
for (i = 0; i < cProcesses; i++)
{
 HANDLE hProcess = OpenProcess (PROCESS_QUERY_INFORMATION |
 PROCESS_VM_READ,
 FALSE, aProcesses[i]);

 // Get the process name.

 if ( hProcess )
 {
  HMODULE hMod;
  DWORD cbNeeded;

  if ( EnumProcessModules (hProcess, &hMod, sizeof(hMod), 
   &cbNeeded) )
  {
   GetModuleBaseName (hProcess, hMod, szProcessName, 
    sizeof(szProcessName));
  }
 }

 // Print the process name and identifier.
 if(!lstrcmpi (szProcessName, lpProcessName))
 {
  CloseHandle (hProcess);
  return aProcesses[i];
 }

 CloseHandle (hProcess);
}
return NULL;
}

typedef struct _addr_data
{
LPVOID deletefile;
char szFileName [0xFF];
} addr_data, *paddr_data;

static void WINAPI my_injected (void* address)
{
paddr_data my_addr_data;
   my_addr_data = (paddr_data)address; 
mytype_DeleteFile deletefile;
deletefile = (mytype_DeleteFile)(my_addr_data->deletefile);
deletefile (my_addr_data->szFileName);
}

static void WINAPI my_injected_end (void* address)
{
}

int APIENTRY _tWinMain(HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPTSTR    lpCmdLine,
                    int       nCmdShow)
{
addr_data my_data;
HINSTANCE hKernel = LoadLibrary ("kernel32.dll");
my_data.deletefile = GetProcAddress (hKernel, "DeleteFileA");
char szBuffer [MAX_PATH];
GetModuleFileName (GetModuleHandle (NULL), szBuffer, sizeof(szBuffer));
strcpy(my_data.szFileName, szBuffer);
DWORD dwExplorerID = GetProcessIdByName("explorer.exe");
HANDLE hExplorer = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwExplorerID);
if(hExplorer==INVALID_HANDLE_VALUE)
{
 MsgBox ("Can\'t open process");
 return 0;
}

LPVOID lpDataMem = VirtualAllocEx(hExplorer, 0, sizeof (addr_data), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (lpDataMem == NULL)
{
 MsgBox("Can\'t allocate memory for data in process space");
 GetError ();
 return 0;
}

   DWORD dwThreadLength = (PBYTE)&my_injected_end-(PBYTE)&my_injected;
LPVOID lpMem = VirtualAllocEx(hExplorer, 0, dwThreadLength, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (lpMem == NULL)
{
 MsgBox("Can\'t allocate memory for thread in process space");
 GetError ();
 return 0;
}

PVOID pIntruderAddress = &my_injected;
ULONG ulBytesWritten = 0;
BOOL res = WriteProcessMemory (hExplorer, lpMem, pIntruderAddress, dwThreadLength, &ulBytesWritten);
if(res == NULL)
{
 MsgBox("Can\'t write thread in process space");
 return 0;
}

res = WriteProcessMemory (hExplorer, lpDataMem, &my_data, sizeof(addr_data),&ulBytesWritten);
if(res == NULL)
{
 MsgBox("Can\'t write data in process space");
 return 0;
}

DWORD dwThreadId = 0;
HANDLE hRemote = CreateRemoteThread(hExplorer, NULL, dwThreadLength, (unsigned long (__stdcall *)(void *))lpMem, lpDataMem, 0, &dwThreadId);
 
return 0;
}

Namelles One

хотелось бы увидеть рабочий пример , я так понимаю что dll удаляет exe , а потом саму себя ?
 
а теоретически можно так замутить))))
еси файл лежит на C:\1.exe
сделать шару диска c:\ например
запустить файл через \\127.0.0.1\c\1.exe

потом закрыть шару и удалить файл C:\1.exe
он удалица..
но прога останеца запущенной ))
но многое работать так скорее у нее не будет )))


да... наркаманский способ а чо !)))
[mod][TheSADIST:] Наркоманите камрад =)[/mod]
 
кстати батники помоему могут удалять сами себя
потому мона сделать прогу, которая бы записывала такой bat-файл:

Код:
:delcycle
del "prog.exe"
if exist "prog.exe" goto delcycle
del "selfdel.bat"

и тутже запускала его, а потом вырубалась. батник удалит и прогу, и себя. можно еще дописать rmdir чтобы еще и папку удалить в которой это все происходит)

единственное палево - в то время, када bat запущен, а прога еще работает, палится окошко консоли с ошибкой доступа к файлу) но если это все происходит быстро, то палева никакого не будет :)
 
karabas-barabas
ну а можно сделать так чтобы прога побыстрее завершилась :D
а так - ведь если сделаешь задержку, то ведь во время задержки будет палиться окно cmd.
просто так ведь в батнике задержку не сделаешь, можно поюзать через пинг, но это совсем по-наркомански))
 
Инжект в че-нить типа services.exe, и пущай се этот код удаляет всех подряд)))
 
karabas-barabas
да, тут ты прав, забыл я родной апи)) слишком углубился в бат, забыв о том, что его вызывает

да много еще способов мона придумать - просто через батник помоему наиболее простой и понятный метод(ну по крайней мере для меня))
 
во, все, допер))

Код:
@echo off
taskkill /f /im prog.exe>nul
del prog.exe>nul
del selfdel.bat>nul

мона сделать так)) и запустить bat со sw_SPOILER..
или если не нравиться завершение по имени - можно по пиду сделать
 
лучше делать иначе.. передавать бату параметр в котором содержица PID процеса и так уже грохать...а то вдруг имя процеса какоенить аля winlogon или lsass ))
 
AHTOLLlKA
ну зачем передавать? мона в прогу включить чтоб писала
Код:
taskkill /PID xxxx /F
а вместо xxxx писала свой пид)
я ж и говорил что если не подходит по имени - фигачим по пиду :)
 
Код:
void MyDelSelf_lowCPUusage() // задержка перед каждой попыткой удаления 1 сек
{
	char batlines[512];char temp[256];
	strcpy(batlines, "@echo off\r\n:label1\r\nping -n 1 -w 1 127.0.0.1 > nul\r\ndel \"");//после -n - задержка в сек, 1 - 1 сек
	GetModuleFileName(0,temp,sizeof(temp));
	strcat(batlines,temp);strcat(batlines,"\"\r\nif EXIST \""); strcat(batlines,temp);
	strcat(batlines,"\" goto label1\r\ndel \"");
    ZeroMemory(temp, sizeof(temp));
	GetEnvironmentVariable("TEMP",temp,sizeof(temp)); strcat(temp,"\\del.bat");
	strcat(batlines,temp); strcat(batlines,"\"");
	HANDLE delbat= CreateFile(temp, GENERIC_WRITE | GENERIC_READ,
  FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
  FILE_ATTRIBUTE_NORMAL, NULL);
	DWORD NOfBytes;
	WriteFile(delbat,batlines,strlen(batlines),&NOfBytes, NULL);
	
CloseHandle(delbat);
	ShellExecute(0,"open",temp,0,0,SW_SPOILER);

	
}
 
taskkill /PID xxxx /F

а вместо xxxx писала свой пид)
я ж и говорил что если не подходит по имени - фигачим по пиду
туплю =))
переработал)))
 
нафига вам taskkill если можно проще,
в коде вызывать процедуру самоудаления и делать ExitProcess(0);
Код:
DelSelf();
ExitProcess(0);

да кстати не советовал бы такой код
Код:
taskkill /f /im prog.exe>nul
del prog.exe>nul
del selfdel.bat>nul
не из-за пида, а то что перейти к команде del prog.exe может быстрее чем выполнится taskkill /f /im prog.exe и тогда нифига не удалиться :P
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх