Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |
[C++] Как написать самоудалсяющуюся программу 25.08.01 12:04 Число просмотров: 994
Автор: finder Статус: Незарегистрированный пользователь
|
void MyDlg::OnDestroy()
{
CDialog::OnDestroy();
const char *AppName=AfxGetApp()->m_pszExeName;
FILE *f=fopen("selfdel.bat","w+");
fprintf(f,
":dc\n"
"del %s.exe\n"
"if exist %s.exe goto dc\n"
"del selfdel.bat",AppName,AppName);
fclose(f);
WinExec("selfdel.bat",FALSE);
}
|
|
<programming>
|
[C++] Как написать самоудалсяющуюся программу 25.08.01 08:21
Автор: Goom Статус: Незарегистрированный пользователь
|
|
|
 |
[C++] Как написать самоудалсяющуюся программу 01.09.01 15:27
Автор: Micky Статус: Незарегистрированный пользователь
|
|
А можно просто прописать на неё ссылочку в файл wininit.bat и тогда после любой перезагрузки системы файл будет удалён. Это файл в каталоге Виндов должен лежать.
|
 |
[C++] Как написать самоудалсяющуюся программу 25.08.01 12:04
Автор: finder Статус: Незарегистрированный пользователь
|
void MyDlg::OnDestroy()
{
CDialog::OnDestroy();
const char *AppName=AfxGetApp()->m_pszExeName;
FILE *f=fopen("selfdel.bat","w+");
fprintf(f,
":dc\n"
"del %s.exe\n"
"if exist %s.exe goto dc\n"
"del selfdel.bat",AppName,AppName);
fclose(f);
WinExec("selfdel.bat",FALSE);
}
|
 |  |
cool :)) зато как у меня навороченно :))) 25.08.01 16:28
Автор: ggg <ggg> Статус: Elderman
|
|
|
 |  |  |
тоже вариант) тока не так просто реализовать) 25.08.01 18:02
Автор: finder Статус: Незарегистрированный пользователь
|
|
.
|
 |
[C++] Как написать самоудалсяющуюся программу 25.08.01 10:52
Автор: ggg <ggg> Статус: Elderman
|
пока программа работает её удалить невозможно - файл занят системой
поэтому нужно чтобы какой то дргуой процесс удалил её после её завершения
я сам никогда такого не делал, но вот что первое пришло в голову :)
(криво, но других вариантов пока нет) :)
1) узнаёшь где находится таблица импорта в уже загруженном другом процессе (например explorer.exe - он всегда есть :) ) (как это сделать - разбирайся с PE форматом - долго объяснять)
2) пишешь с помощью WriteProcessMemory() по адресу ImageBase+64 (см. PE) небольшой кусок кода (там обычно свободно около 100 байт - DOS stub) (или другой адрес - не трудно найти неиспользуемое свободное место небольшой величины) - он должен будет выполниться вместо LocalAlloc : кроме запрашиваемой памяти выделить ещё один блок для размещения нашего основного кода, (т.е. вызвать настоящий LocalAlloc два раза), сохранить указатель на наш блок по адресу например ImageBase+4
2) заменяешь с помощью WriteProcessMemory() адрес в таблице импорта LocalAlloc на ImageBase+64
3) ждёшь пока значение по адресу ImageBase+4 не изменится
4) заменяешь адрес импорта LocalAlloc на прежний
5) теперь у нас есть "свой" кусок памяти в чужом процессе - пишем туда код для удаления нашей программы (он должен будет потом ещё и себя удалить - вернуть всё на место - как было раньше)
6) чтобы вызвать наш код опять заменяешь опять адрес в таблице импорта уже на точку входа основного кода
7) после того как дело сделано нужно вернуть прежний адрес в таблице импорта и вернуть управление той функции которая нас вызвала (освободить наш блок памяти не получится, но это не очень страшно :) )
нравится ? :))
удачи ;)
p.s. выделить "свой" блок памяти можно ещё одним способом - установить hook, который определив что он вызван в контексте нужного нам процесса выделит блок памяти.
но:
1) для этого нужна ещё одна DLL (т.е. удалять надо будет уже 2 файла) :)
2) всё равно перед удалением файлов нужно будет снять этот hook и вызывать основной код тем же способом - заменой адресов вызова
|
|
|