Идёт загрузка страницы...

htp://aptem.net.ru





Как стереть самого себя

Den is Com советует:

// проверено и работает для WIN 9x. Не работает в WinNT

При работе программы происходит блокировка исполняемого файла программы на диске, до завершения работы программы. Данный код позволяет программе стереть саму себя с диска. При этом если программа уже загрузилась в память, то может работать и работать. Метод действия: создаётся временный bat файл в временной директории на диске, который удаляет программу и удаляет себя сам. При использовании кода в защите желательно использовать хотя бы простейшую шифровку текстовых строчек XOR-ом - они хорошо просматриваются диссассемблером и разумеется, хакеру не составит труда обнаружение защиты.


    var Filename:String;
aTempBuf:array[0..MAX_PATH] of char;
bat_file:String;
f:TextFile;
si:TStartUpInfo;
pi:TProcessInformation;
begin
FileName:=Application.ExeName;
if GetShortPathName(PChar(FileName),aTempBuf,Sizeof(aTempBuf)-1)>0 then
FileName:=StrPAs(aTempBuf);

GetEnvironmentVariable('TEMP',aTempBuf,MAX_PATH);
bat_file:=StrPas(aTempBuf)+'\'+'delself.bat';
if GetShortPathName(PChar(bat_file),aTempBuf,Sizeof(aTempBuf)-1)>0 then
bat_file:=StrPAs(aTempBuf);

AssignFile(f,bat_file);
rewrite(f);
Writeln(f,'@echo off');
Writeln(f,':try');
Writeln(f,'del '+FileName);
Write(f,'if exist '+FileName);
Writeln(f,' goto try');
Write(f,'del '+ bat_file);
CloseFile(f);
//Memo1.Lines.LoadFromFile(bat_file);

ZeroMemory(@si,sizeof(si));
si.cb:=sizeof(si);
si.wShowWindow:=SW_HIDE;
si.dwFlags:=STARTF_USESHOWWINDOW;
CreateProcess(nil,PChar(bat_file),nil,nil,False,IDLE_PRIORITY_CLASS or DETACHED_PROCESS,
nil,nil,si,pi);

Привожу полностью все файлы проекта:

Project1.dpr


    program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Unit1.dfm


    object Form1: TForm1
Left = 192
Top = 107
Width = 435
Height = 300
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 48
Top = 200
Width = 313
Height = 49
Caption = 'Del me !'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -32
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
TabOrder = 0
OnClick = Button1Click
end
object Memo1: TMemo
Left = 48
Top = 16
Width = 305
Height = 169
TabOrder = 1
end
end

Unit1.pas


    unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var Filename:String;
aTempBuf:array[0..MAX_PATH] of char;
bat_file:String;
f:TextFile;
si:TStartUpInfo;
pi:TProcessInformation;
begin
FileName:=Application.ExeName;
if GetShortPathName(PChar(FileName),aTempBuf,Sizeof(aTempBuf)-1)>0 then
FileName:=StrPAs(aTempBuf);

GetEnvironmentVariable('TEMP',aTempBuf,MAX_PATH);
bat_file:=StrPas(aTempBuf)+'\'+'delself.bat';
if GetShortPathName(PChar(bat_file),aTempBuf,Sizeof(aTempBuf)-1)>0 then
bat_file:=StrPAs(aTempBuf);

AssignFile(f,bat_file);
rewrite(f);
Writeln(f,'@echo off');
Writeln(f,':try');
Writeln(f,'del '+FileName);
Write(f,'if exist '+FileName);
Writeln(f,' goto try');
Write(f,'del '+ bat_file);
CloseFile(f);
Memo1.Lines.LoadFromFile(bat_file);

ZeroMemory(@si,sizeof(si));
si.cb:=sizeof(si);
si.wShowWindow:=SW_HIDE;
si.dwFlags:=STARTF_USESHOWWINDOW;
CreateProcess(nil,PChar(bat_file),nil,nil,False,IDLE_PRIORITY_CLASS or DETACHED_PROCESS,
nil,nil,si,pi);
end;

end.

[000806]