[TulaAnti&ViralClub] PRESENTS ...
MooN_BuG, Issue 9, Dec 1998 file 002
Самовоспроизведение кода на языке PASCAL
by RedArc
Терминология.
Размножение программного кода - это создание идентичной копии кода
внешним объектом. В качестве объекта может выступать устройство, человек или
другой программный код. Это свойство используется программными вирусами -
троянами. Это же свойство используют файловые и загрузочные вирусы для
инфицирования новой системы.
Саморазмножение программного кода - это создание идентичной копии кода
самим кодом. Это свойство присуще только вирусам и используется для
самостоятельного производства собственных копий в инфицируемой системе.
Самовоспроизводство программного кода - это создание исходного текста
кода самим кодом. Это свойство использовалось уже устаревшими вирусами,
написанными на языке BASIC для DOS.
Рассмотрим более подробно самовоспроизводство.
В старые, добрые времена, когда компьютеры были еще слабенькими и размеры
их оперативной памяти редко превышали 512 kB, а в качестве основного носителя
информации были пятидюймовые дискеты емкостью 360 kB, люди не знали что такое
Windows... Да-да, не удивляйтесь, было такое время ;-) Так вот,
программировать в машинных кодах и на Assembler могли только системные
программисты, которых было не так, чтобы много и, они были просто завалены
работой. Посему вирусы, инфицирующие исполняемые программы были довольно
большой редкостью. А весь несистемный программерский народ писал свои
программы на языках, использующих для исполнения программ интепритаторы.
Такими когда-то были C и Pascal, но распространеннее всех оказался BASIC
(GW-BASIC, BASICA, ...). Интерпритаторы подразумевали, что у них всегда под
рукой должен быть исходный текст программы, по этому, программы
распространялись в виде исходных текстов ;-) Ни о какой интеллектуальной
собственности тогда речь еще не шла... Так вот, в те самые исторические
времена и появились умельцы, которые писали вирусы на этих языках,
инфицирующих исходные тексты. Выполняясь под интерпритатором, операторы
вирусной подпрограммы производили поиск на диске еще не инфицированных
исходных текстов программ и записывались в них.
Но, как вы уже догадались, программирование развивалось и появились...
компиляторы. Народ быстренько смекнул, что не гоже раздавать на лево и на
право исходники своих программ и стал раздовать программы в виде исполняемых
файлов, да еще навешал на них разного рода защиты от изучения любопытными и от
несанкционированного копирования страждущими. Копировать исходники стали очень
и очень редко и то в основном для бэкапа (не побоюсь этого слова)... ;-) Ну и
само собой разумеющееся - вирусы стали писать для исполняемых файлов. Против
этих вирусов понаписано столько хитрых программ-антивирусов, что прям аж жуть.
Это и мониторы и полифаги и ревизоры и инспекторы и шерифы...Конечно, развитие
антивирусной индустрии сильно воздействовало на развитие вирусных
технологий. Теперь принято писать вирусы для мастдая и ворда, ексела и
пуверпойнта, джавы и скриптов... А ведь некоторые до сих пор еще программирую
на Pascal и C++... и не потому, что лениво многобегомайтное DDK читать, а
потому хотя бы, что в институте заставляют. А там антивирусов понаставили, что
ни халфом, ни чихом не пролезть... жуть...
Дык о чем это я? Ах да, о самовоспроизводстве. Кто вам сказал, что
свойство это устарело? Не устарело оно, да еще открывает столько возможностей!
Ни один современный антивирус не рассчитан на этод способ инфицирования
университетских компов... А зря. Ну да ладно. Как же это реализовать для того
же Borland Pascal? Как найти EXE-программе свой исходный текст, чтобы дописать
его в еще недописанную программу соседа? Все время таскать за собой PAS-файлы
нельзя - лаборант прибьет. А вот хорошую студенческую работу вряд ли прибьют,
даже еще кому-нибудь подарят или продадут... в другой университет... нате,
мол, посмотрите, какие мы крутые! И все бы хорошо... но распространение то
получит EXE-программа... Дык вот, не отчаивайтесь... и для современных языков
программирования возможно самовоспроизводство аж из самого EXE'шника!
Ниже идет исходный код самой примитивной программы, которая создает при
запуске свой исходный код на диске. Этот код компилируется снова в программу,
а та при запуске снова создает свой исходный код... Бесконечно вкусный
апельсин ;-) Комментировать 35 строк кода на Pascal'е мне даже как то не
удобно. Но на всякий случай привожу в конце эту программу в виде EXE-файла.
Программа эта работает на "ура". По принципу ее работы я сделал два вируска,
которые вы найдете в следующих статьях. Только вот незадача ;-) програмка то
работает, а вот в вирусы я вставил малозаметные ошибки. Вирусы жизнеспособны
поколений на пять - не больше. И не потому, что мне жалко вирусов, а потому,
чтобы вы сами разобрались в них... Ну, желаю удачи... ;-)
=== Cut === COP.PAS
PROGRAM COP;
VAR
T : Text;
I, J : Integer;
S1 : String;
{$I COP.INC}
BEGIN
Assign (T, 'cop.pas');
ReWrite (T);
for I := 1 to MaxConst do begin
S1 := C_Const [I];
while Pos ('"', S1) > 0 do begin
J := Pos ('"', S1);
Delete (S1, J, 1);
Insert (#39, S1, J);
end;
while Pos (#38, S1) > 0 do begin
J := Pos (#38, S1);
Delete (S1, J, 1);
Insert (#34, S1, J);
end;
WriteLn (T, S1);
end;
Close (T);
Assign (T, 'cop.inc');
ReWrite (T);
WriteLn (T, 'CONST');
WriteLn (T, 'MaxConst = ', MaxConst,';');
WriteLn (T, 'C_Const : Array [1..MaxConst] of String [100] =');
WriteLn (T, '(');
for I := 1 to MaxConst-1 do
WriteLn (T, #39, C_Const [I], #39, ',');
WriteLn (T, #39, C_Const [MaxConst], #39, ');');
Close (T);
END.
=== Cut ===
=== Cut === COP.INC
CONST
MaxConst = 35;
C_Const : Array [1..MaxConst] of String [100] =
(
'PROGRAM COP;',
'VAR',
' T : Text;',
' I, J : Integer;',
' S1 : String;',
'{$I COP.INC}',
'BEGIN',
' Assign (T, "cop.pas");',
' ReWrite (T);',
' for I := 1 to MaxConst do begin',
' S1 := C_Const [I];',
' while Pos ("&", S1) > 0 do begin',
' J := Pos ("&", S1);',
' Delete (S1, J, 1);',
' Insert (#39, S1, J);',
' end;',
' while Pos (#38, S1) > 0 do begin',
' J := Pos (#38, S1);',
' Delete (S1, J, 1);',
' Insert (#34, S1, J);',
' end;',
' WriteLn (T, S1);',
' end;',
' Close (T);',
' Assign (T, "cop.inc");',
' ReWrite (T);',
' WriteLn (T, "CONST");',
' WriteLn (T, "MaxConst = ", MaxConst,";");',
' WriteLn (T, "C_Const : Array [1..MaxConst] of String [100] =");',
' WriteLn (T, "(");',
' for I := 1 to MaxConst-1 do',
' WriteLn (T, #39, C_Const [I], #39, ",");',
' WriteLn (T, #39, C_Const [MaxConst], #39, ");");',
' Close (T);',
'END.');
=== Cut ===
=== Cut === COP.EXE
section 1 of 1 of file cop.zip -={ UUE 1.06, ARA (C) 1995 }=-
begin 644 cop.zip 1-6-1999 21:21:54
M4$L#!!0````(`!:J)B;W]9OR&@P``!`=```'````0T]0+D581=59#5`4UQU_
MMWOL+<O=@N)7_3@6A(URB,!%*B!&@H"D"A<002@2J\3047#N]D";>IQE.@FW
M:#O3CYDR22>6--,!)G,:.SVPE<.#\&$8$#/%HFVLYF,S9U(C&3`1N?[?WIV"
M(>TD@<SD#3]V][W___?[_]][^][NWH[B$$4PBD4LJN46_XDFT#&$2A!"*P%[
M`(<!/P$T`<X`N@&C@$\`A`*AQ8!H0!J@`%`,J`0<`[P`^!W@]P`[H`/0#Q@$
M_!OP/F`<<`^PE$`H%I`$V`K(!CP#.`0X`O@YP`;X->`E@`)%HQ6*:/1G(AJ]
M'AB-^@#O`*8`TXMJ7]7AV,-[38H(Q6,*7KZJJ-P7D)Z;D[\S:,?>(^E5E2:!
M2^76IY=Y3Y.Y-*-Q[U&N)#XVUM]>RE4]R^4+QHK*`U`?%U?*I1)K4QHA<U10
M_UY'!*LM[$"(+6P4(1KYLI$EHU$/%1&L0&ZE!XZ.<C3!1P2+=X_WO.P!<SY8
M6^CP($/[email protected]:-1H-.2^DA54V2P?.%)C`QV*,"-@3P[&+\-9L)-
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
MABH3MR:"CX@!T;7<9BYN#M)9S3U2GL+IS%#ZY@E%/"[email protected]!^?&P#,1P
M<Z&!(A\5R:XTE1OA172U/@GG`4K?7(9]2%]>N7^>5LC9!WZU?N.W-/!^I>_^
MP#_^W1KXY0]%Y"5RNW<IGI.A>%"8^<[BP?;+<>D'JTSSM=!_Z:8%7]^_:YO6
MBB\.>H3\`\(<)H+6SR(R[?<)6.S]5S$1*5]7.&.V3+[:#Q__7WKI+")KYK*K
M<`G_7P\2Z^)A"9X#D839[WAYRYKV3.&KB8CY6DDF_C^!!X/AUUG[U<?_6[GC
ME1DY6V/1MU\\GJ_6%UL0>@6^##O@%TP$G\=GE/\"4$L!`A0`%`````@`%JHF
M)O?UF_(:#```$!T```<````````````@`````````$-/4"Y%6$502P4&````
/``$``0`U````/PP`````
`
end
sum -r/size 1039/4467 section (from "begin" to "end")
sum -r/size 54214/3210 entire input file
=== Cut ===