Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.13;
Скачать: CL | DM;

Вниз

Удаление программы самой из себя!   Найти похожие ветки 

 
Anatoly Podgoretsky ©   (2004-01-26 15:21) [40]

DiamondShark © (26.01.04 15:17) [39]
А чего так, не работает :-)


 
DiamondShark ©   (2004-01-26 15:25) [41]


> Anatoly Podgoretsky © (26.01.04 15:21) [40]
> DiamondShark © (26.01.04 15:17) [39]
> А чего так, не работает :-)

Оказывается, из-под среды тоже работает.
Шаманство...


 
Vint ©   (2004-01-26 15:30) [42]

не, у меня под 98 не работает...

а вот на королевстве лежит функция, эта работает!
найди десять отличий ;)

procedure DeleteSelf;
var hModule:THandle;
szModuleName:array[0..MAX_PATH] of char;
hKrnl32 : THandle;
pExitProcess, pDeleteFile, pFreeLibrary,pUnmapViewOfFile : pointer;
ExitCode:UINT;
begin
hModule:= GetModuleHandle(nil);

GetModuleFileName(hModule, szModuleName, sizeof(szModuleName));

hKrnl32 := GetModuleHandle ( "kernel32" );
pExitProcess := GetProcAddress ( hKrnl32, "ExitProcess" );
pDeleteFile := GetProcAddress ( hKrnl32, "DeleteFileA" );
pFreeLibrary := GetProcAddress ( hKrnl32, "FreeLibrary" );
pUnmapViewOfFile := GetProcAddress ( hKrnl32, "UnmapViewOfFile" );

ExitCode := system.ExitCode;

if($80000000 and GetVersion())<>0 then
// Win95, 98, Me
asm

lea eax, szModuleName
push ExitCode
push 0
push eax
push pExitProcess
push hModule
push pDeleteFile
push pFreeLibrary
ret
end
else
begin
CloseHandle(THANDLE(4));

asm
lea eax, szModuleName
push ExitCode
push 0
push eax
push pExitProcess
push hModule
push pDeleteFile
push pUnmapViewOfFile
ret
end
end
end;


 
RealRascal ©   (2004-01-26 16:06) [43]

А я делаю так:
procedure SelfDestruct;
var f:textfile; s,s1:string; i:integer;
begin
s:=Application.ExeName;
i:=length(s);
repeat
if s[i]="\" then break;
s1:=s[i]+s1;
dec(i);
until false;
Assignfile(f,"kill.bat");
Rewrite(f);
Writeln(f,"del "+s1);
Writeln(f,"del kill.bat");
Closefile(f);
WinExec(pchar("kill.bat"),sw_Hide);
Application.Terminate;
end;

Хех, похоже, он самый короткий из всех вышеперечисленных.
B-P


 
Digitman ©   (2004-01-26 16:14) [44]


> RealRascal © (26.01.04 16:06) [43]


> он самый короткий из всех вышеперечисленных

.. добавь - и не имеет к сабжу никакого отношения


 
Rauf ©   (2004-01-26 16:17) [45]

Так дурдом какой-то. Только что протестил код, который вставил еще вначале на "С" на VC++7.1, только под Win2k SP4, и пашет, даже из под среды пашет!!!

А вообще где можно почитать про эти дела, ну на счет таблицы хендлов например и многое многое другое, связанное с системным программированием???


 
Sergey_Masloff   (2004-01-26 22:34) [46]

Rauf ©
хотел написать но работы до крыши и выше. Не успеваю.
Вкратце:
ret запишет в eip значение с вершины стека (и соотв. передаст управление по этому адресу - то есть в точку входа FreeLibrary. Ну и ....
Вобщем ставь брекпойнт на рет когда остановишься открываешь CPU Window, окошко справа внизу как ты наверное знаешь - содержимое стека. Ну и пошагово смотри что куда идет. ret $0004 встреченое на пути это снятие с верхушки стека 4 байт и потом переход - ну я думаю принцип уловил.


 
Rauf ©   (2004-01-27 13:30) [47]

Большой СЕНКС!!! Уловил!!!
Кстати проверял, в XP точно не пахало!!!



Страницы: 1 2 вся ветка

Текущий архив: 2004.02.13;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.029 c
14-39030
vopros
2004-01-26 12:44
2004.02.13
Есть плазменный телевизор есть компьютер


1-38944
Лысый
2004-02-04 08:19
2004.02.13
ComboBox


14-39078
ИМХО
2004-01-23 22:45
2004.02.13
Теория Большого Взрыва


3-38678
Grayver
2004-01-24 06:42
2004.02.13
запрос


3-38749
Kadr
2004-01-21 12:00
2004.02.13
Проблема с подключением