Текущий архив: 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.53 MB
Время: 0.012 c