Рішення задач як програму видалити саму себе або як змінити назву виконуваного файлу borland

1. Введення
В інтернеті переглядаючи форуми з програмування я натрапляв на питання пов'язані c питанням «Як програму змусити видалити або перейменувати себе під час виконання». У цій статті описується самий елементарний спосіб.

2. Що потрібно?
Borland Delphi бажано 7 - вимагає установки
Блокнот (notepad.exe) - стоїть на всіх комп'ютерах з Windows
cmd.exe - стоїть на всіх комп'ютерах з Windows

3. Починаємо
Навіщо нам потрібен блокнот і cmd.exe запитаєте ви?
Ми для вирішення цього завдання будемо використовувати Пакетний файл, докладніше: У Вікіпедії
Функція для видалення:

Функція для перейменування:

4. Висновок
Як бачите нічого складного тут немає. Ці функції не вимагають ніяких додаткових модулів.

Прошу вас якщо ви скопіювали цю статтю до себе на сайт або форум або блог, то вкажіть посилання на джерело.

Дійсно, все геніальне просто.

😉 Спасибі величезне за статтю))))

Немає гарантії, що з exe-шника завжди вдасться вийти раніше, ніж запуститься bat-файл. Відповідно, при видаленні bat-файлу можуть дати по руках.

У батника пінг чи є певний: намагається виконати завдання на певному інтеравале часу.

Ще один спосіб вирішення поставленого завдання. На мій погляд більш оптимальний.

procedure DeleteSelf;
var
module: HModule;
buf: array [0..MAX_PATH - 1] of char;
p: ULong;
hKrnl32: HModule;
pExitProcess,
pDeleteFile,
pFreeLibrary: pointer;
begin
module: = GetModuleHandle (nil);
GetModuleFileName (module, buf, SizeOf (buf));
CloseHandle (THandle (4));
p: = ULONG (module) + 1;
hKrnl32: = GetModuleHandle ( 'kernel32');
pExitProcess: = GetProcAddress (hKrnl32, 'ExitProcess');
pDeleteFile: = GetProcAddress (hKrnl32, 'DeleteFileA');
pFreeLibrary: = GetProcAddress (hKrnl32, 'FreeLibrary');
asm
lea eax, buf
push 0
push 0
push eax
push pExitProcess
push p
push pDeleteFile
push pFreeLibrary
ret
end;
end;

DonDD, а твоє рішення навіть простіше, ну принаймні мені більше подобається.

Так з цим зрозуміло, а як зробити щоб програма змінює свій код в ході виконання? Таке можливо? Хочу зробити програму для постоенія графіків функцій.Ідея така: у вікні вводиться фунция, потім вона вставляється в програму деякою кількістю рядків нижче y: = f ( x) Потім будується розрахункова таблиця а по ній графік

DonDD, ваш код можна теж використовувати, але якщо ви уважно подивитеся - ваша одна процедура видалення займає цілих 30 рядків, а мої ДВІ процедури видалення і перейменування займають всього 38 рядків. + Ваш код тільки може видаляти.

Олексій, я тестував свій код на двох комп'ютерах і все працювало.

DonDD, або хто в курсі,
поясніть будь ласка роботу функції DeleteSelf, в якій застосований асемблер (без батники).

3) і ще, я чув, що все це не буде працювати в XP і пізніших версіях, а в цих версіях можна застосовувати спосіб: \\ 127.0.0.1 \ C $ \ my_program.exe

Дякуємо! Але для мене поки що це все складно! 😥

enzo_amd, після ret нагорі Слека залишиться

7C831D93 / CALL to FreeLibrary
00400001 0400001 (00400000-хендл файлів, а 00400001 - хрень якась)

після неї DeleteFileA з параметрами (який, до речі, поверне ERROR_ACCESS_DENIED) і, нарешті, ExitProcess

Фішка в тому, щоб залишити після себе в стеці код, який буде виконаний в надрах kernel32 при завершенні, але в ХР ні FreeLibrary ні UnmapViewOfFile вже не прокатує. Загадкове CloseHandle (THandle (4)) теж

Код прикольний. Але ... після виконання у мене створюється дійсно Bat-файл, І exe-файл не видаляється. Видаляється тільки після запуску безпосередньо натисканням клавіші миші.

Виходить, що Bat-файл виконується ще до виходу програми.

Як це можна вирішити?

Схожі статті