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]