Revirando meus materiais antigos encontrei um disquete, ainda funcionando, que continha um vírus criado no início de minha vida na informática. O código original estava em Pascal e foi criado para funcionar em DOS/Windows. Fiz algumas modificações, reescrevendo o código em C e adaptando seu funcionamento para Linux.
Normalmente, qualquer problema que aconteça com o computador durante sua operação é atribuído ao vírus (referência quase que exclusiva dos usuários Windows), mesmo que o problema se de por inexperiência do usuário ou mal funcionamento do sistema.
Todos sabemos da dificuldade dos usuários de se adaptarem a novos sistemas ou atualizações - novos paradigmas, novos botões, novas funcionalidades. Também é sabido da existência de defeitos nos softwares, principalmente no caso de versões recém lançadas, normalmente as versões X.0.
Qualquer um que atualize ou instale programas recém lançados se arriscam a ter problemas, normalmente as versões X.01 são correções de defeitos encontrados nas versões X.0. De acordo com pesquisa feita pela PC Magazine, 50% dos prejuízos em softwares são causados pelos motivos citados e não por ação de um vírus de computador.
Um vírus de computador é um programa capaz de infectar outro programa, através de uma modificação deste incluindo uma cópia de si mesmo no código original. Por isso o nome de vírus, uma analogia ao vírus biológico que transforma as células em fábricas de cópias do vírus original.
Para o usuário em geral, qualquer programa que apague dados ou atrapalhe o funcionamento de sua máquina é chamado de vírus. Para um programador, um vírus é algo bastante interessante, pois, se trata de um programa altamente sofisticado, capaz de tomar decisões, funcionar em diversos tipos de máquinas além de apresentar índices mínimos de problemas ou mal funcionamento.
Stephen Hawking se referiu ao vírus de computador como a primeira forma de vida criada pelo homem, pois podem se reproduzir e garantir sua sobrevivência sem a interferência do homem. Fato que faz com que muitos vírus existam até hoje, vários anos após sua criação.
Para muitos cientistas, a reprodução e a manutenção da sobrevivência são princípios básicos para que um organismo seja descrito como vivo.
Modus Operandi
Basicamente, o vírus pode infectar um computador de três formas:
1) vírus de disco - infectam o setor de boot do disco, parte responsável pela manutenção dos arquivos no HD. Funcionam como uma tabela de índice contendo a posição de cada arquivo gravado em disco; neste caso, qualquer operação feita com o arquivo - gravar, carregar etc - pode ativar o vírus que por sua vez fará uma copia de si mesmo para outra unidade e assim sucessivamente. Esse tipo de vírus atualmente não é muito comum, mas no passado era bastante criado pelos desenvolvedores.
2) vírus de arquivo - infectam arquivos executáveis. Eles se copiam para o início ou fim destes. Dessa forma, ao carregar um programa, código do vírus é executado, esse cumpre sua função e pula para o início do código do executável desejado, dando assim continuidade ao seu processo.
3) vírus mult-partite - bastante sofisticados, infectam tanto o setor de boot quanto arquivos executáveis.
Uma exceção é o DIR-II - Vírus deste tipo alteram a tabela de arquivos de forma a serem chamados antes dos programas a serem executados. Não são, nem propriamente dito, como "vírus de boot", "de arquivos" e muito menos "mult-partite".
Quanto a detecção
Um vírus, como todo o dado armazenado em disco ocupa espaço. No caso de vírus de arquivo, mesmo que seja criado em linguagem de montagem (Assembly), ocupando um espaço mínimo este "aumenta o tamanho do arquivo".
Ao copiar-se para dentro de um programa, duas coisas aconteciam: (I) o executável mudava de tamanho e (II) a data de gravação também era alterada.
Existiam vírus que infectavam arquivos já infectados, fazendo com que estes aumentassem de tamanho a cada execução, chegando a se auto infectar até tamanho absurdos.
Esse tipo de infecção era facilmente identificada por usuários mais atentos, pois um simples ls -l mostrava a alteração do tamanho e da data em arquivos infectados.
Passou-se então a fazer vírus que reconheciam suas cópias em executáveis, fazendo com que estes não infectassem arquivos já infectados. Neste caso, anti-vírus mais simples conseguia, identificá-los executando os programas e comparando a data de criação antes e pós execução.
Posteriormente, os vírus passaram a alterar a data de gravação dos hospedeiro (arquivo infectado) além de não se auto infectar. Com isso, tornou-se praticamente impossível a detecção pelo usuário sem a ajuda de um anti-vírus.
Para esses tipos de vírus, os mais comuns atualmente, o anti-vírus passou a manter uma base de dados com características dos vírus, então eles buscam essas características dentro dos arquivos, vasculhando todo seu conteúdo.
Como funciona um anti-vírus
Muita gente desconhece o funcionamento, mas um anti-vírus trabalha levando as considerações acima, basicamente de três formas:
1) vigiando a memória do micro e identificando a ação de qualquer novo programa.
2) mantendo um arquivo com as características dos arquivos antes da infecção, assim, qualquer alteração que o arquivo original sofra é identificado.
3) o mais comum: abrindo cada um dos arquivos possíveis de infecção e examinando o código do programa. Lembrando que eles mantém uma base de dados com o código ou parte do código dos vírus que eles conseguem identificar.
Porque os vírus são escritos
O vírus de computador sempre causa curiosidade. Quando fizeram esta pergunta em uma convenção de produtores de vírus e hackers, na Argentina, a resposta foi:
[3] Comentário enviado por elgio em 14/07/2008 - 14:15h
Gostei do Artigo, com a parte da descrição de vírus e até lembrando o saudoso DIR-II...
Convém, porém, destacar que os exemplos apresentados neste artigo estão mais para negação de serviço local do que para vírus.
DoS pode (e DEVE!!) ser facilmente eviitada com politicas de quotas, sejam em disco ou seja de recursos via PAM LIMITS (http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=7070 e http://gravatai.ulbra.tche.br/~elgio/tchelinux2008/ - palestra Negação de serviço).
Se me permite, vi que usaste de forma equívoca a chamada pipe. Ela precisa sempre de um vetor de int de duas posições para funcionar. Teus códigos não sofrem com isto porque na verdade tu não usas o pipe, foi apenas um artifício para matar a saída padrão. O mesmo poderia ter sido feito com:
close(1);
close(2); // saida de erro!
fopen("/dev/null", "w");
dup(1);
Vai abrir o arquivo fake /dev/null que irá ocupar o descritor 1 (que fora fechado) o dup irá duplicar o 1 no 2 (pq tb foi fechado). Saida padrão e saida padrão de erro são agora /dev/null.
[6] Comentário enviado por gjr_rj em 14/07/2008 - 18:49h
elgio, discordo quando você diz que "exemplos apresentados neste artigo estão mais para negação de serviço local do que para vírus", pois um vírus não se define por sua ação, eu procurei fazer algo que não acarretasse em problemas para a máquina, mas a funcionalidade fica por conta de quem resolver implementá-lo. Porém não aconselho a implementar os exemplos como vírus, as próximas partes do artigo evoluirá o código e esses sim ficaram mais perto do real. A idéia dessa primeira parte é só dar o "pontapé inicial".
Concordo com relação ao pipe. De início tinha usado o vetor com 2 posições, mas resolvi retirar uma, pois queria apenas não mostrar a saída, mas realmente, como queria usar esses códigos como exemplos, deveria ter feito da forma correta.
Legal a utilização do /dev/null. Não conhecia essa possibilidade.
Ainda não tive tempo de ler os link que você passou, mas vou fazer isso.
[7] Comentário enviado por Teixeira em 14/07/2008 - 19:22h
O autor procurou demonstrar as linhas de raciocínio a serem seguidas por quem desejar (por qualquer motivo) produzir um virus.
Lembro-me de algumas versões do famoso Stoned, muito pequeno, e que se multiplicavam sequencialmente pelo HD afora, como arquivo oculto, dificultando a sua localização e que, decorrido algum tempo da infecção, iam deixando o computador cada vez mais lento.
Era um virus aparentemente despretencioso, porém muito eficaz.
As primeiras versões eram detectáveis, porque eram apendidas a um arquivo executável, cujo tamanho ia crescendo de forma visível.
Com o tempo, passaram a usar o atributo -h e o usuário só iria perceber muito tempo depois, quando a coisa toda travava.
O Michelangelo tinha duas versões principais: Uma delas simplesmente apagava o HD sem maiores satisfações em uma data convencionada (se não me engano era 6 de março).
A outra versão ainda brindava o incauto usuário com uma belíssima tela daquele artista - e detonava o HD do mesmo jeito.
Fica pois demonstrado que é possível produzir virus para o ambiente Linux, apesar das dificuldades.
[11] Comentário enviado por stremer em 15/07/2008 - 15:54h
artigo muito bom!
Em relação a discussão sobre os exemplos não serem virus...realmente não são... são malware... e como foi falado no artigo todo tipo de malware hoje é dito como virus... e geralmente um virus vem com algum malware embutido... acredito que tenhamos mais sobre virus como forma de infecção e tudo mais nos próximos artigos.
Porém vale lembrar que virus (se levarmos ao pé da letra) esta em extinção... hoje os chamados virus geralmente são malware, muitas vezes trojans que tentam roubar informação da maquina do usuário ou worms....
[12] Comentário enviado por engos em 15/07/2008 - 16:34h
Gostei muito do artigo!
Devido ultimamente o VOL estar colocando muitos artigos repetidos e já abordados por outros, parei de escrever alguns que estava fazendo de tanto ver o pessoal fazendo os artigos sem nada a acrescentar, fico muito contente que você tenha feito um realmente novo e criativo ao invés das coisas já exaustivamente repetidas, conseguiu ser melhor que qualquer outro que já li por aqui!
Tirando todo o bla bla bla já comentado sobre vírus, código etc, você planeja fazer a parte 2? Se sim, seria algo alem do basico?
[13] Comentário enviado por gjr_rj em 15/07/2008 - 16:45h
No artigo não é dito que os exemplos são vírus. Os exemplos mostram "funcionalidades" que podem ser usadas no vírus. Resolvi usar exemplo que não prejudicassem a máquina e que fossem interessantes. Poderia usar um "apaga tudo", mas além de ser prejudicial, trata-se de um código pobre.
O vírus não é o exemplo, mas sim o código final usando a rotina acao dos exemplos.
[14] Comentário enviado por gjr_rj em 15/07/2008 - 16:52h
engos. sim, pretendo fazer a parte II e III desse artigo, já está definido o que será abordados e a parte II já começou a ser criada. A idéia é chegar em algo bem próximo a um vírus para windows. Ajustando a data/hora do arquivo, faze a infecção e execução sem precisar de arquivo temporário, não se auto infectar etc. O problema é a falta de tempo.
Na realidade, começou como mencionei apenas mostrando meu primeiro vírus, mas acabei gostando e resolvi evoluir até o último vírus criado por mim.
Posso adiantar que é 1000 x mais complicado criar o vírus para o Linux o que tem deixado o código muito legal.
[15] Comentário enviado por maran em 16/07/2008 - 08:50h
Grande Geraldo, cara demais em meu, fiquei viajando qui tentando entender o que fez, haja imaginação e conhecimento, mesmo sem saber nada vou ficar ancioso para ler os próximos,
um grande abraço.
[17] Comentário enviado por maran em 16/07/2008 - 11:10h
Não foi uma critica a seu artigo e sim um elogio meu velho, não sei se vc me entendeu mal, disse que viajei não pela explicação, mas sim por não entender programação, mas esta muito bom seu artigo ;)
[18] Comentário enviado por gjr_rj em 16/07/2008 - 11:36h
maran,
tinha entendido +-.
Entendi que tinha gostado do artigo. Mas não percebi que não conhece programação. Para dizer a verdade isso "nem passou pela minha cabeça". É que as vezes nos esquecemos que pessoas como você são normais.
[23] Comentário enviado por gersonraymond em 18/07/2008 - 08:59h
Parabéns pelo belo artigo, pois faz bastante tempo que não vejo algo parecido. Já pensou em publicar um livro, seguindo esta linha de aplicação você terá um grande sucesso e superará diversos livros que estão no mercado com conteúdos super vazios, um abraço.
[25] Comentário enviado por gilicraft em 18/07/2008 - 15:15h
comecei no linux mandriva hoje, eu estou tentando migrar para o linux e comecei a ler tudo que aparecia no google, achei interessante o seu artigo e queria tirar umas duvidas, se vc poder me ajudar poderia poracaso me dizer como eu desligo a permissao de escrita de uma pasta ou dos arquivos de uma pasta? grato e parabens pelo artigo
[27] Comentário enviado por removido em 07/11/2009 - 12:21h
nao acabei de ler tudo, mas ja ta nos meus favoritos, ainda estou aprendendo programação, e nao estou conseguindo entender tudo isso, depois vou reler tudo isso
[29] Comentário enviado por georgekihoma em 11/07/2010 - 11:16h
Cara, primeiro acho que qualquer gerente de redes/segurança deve conhecer esses assuntos. Dito isto, considero que a definição de vírus deve contemplar o fato de que existe:
1 - Infecção de algum tipo de arquivo ou setor de boot (MBR)
2 - Após a infecção, a execução/abertura do arquivo ou inicialização do computador significam a replicação do vírus.
3 - Propagação (via rede, pendrive, mail, etc)
As ações específicas do vírus dependem do que o programador deseja fazer. Se for um vírus destrutivo ele pode apagar dados, destruir a MBR, ou no caso do Chernobyl, apagar as informações do CMOS.
Por isso é interessante que um gerente de segurança/redes saiba fazer a distinção entre vírus, trojans, malware, spyware.
[33] Comentário enviado por NewWave em 14/04/2013 - 10:48h
Olá, amigo!
Em primeiro lugar, parabéns pelo artigo. Ainda nem terminei de ler, mas já estou vendo que é um artigo de primeira!
Eu estou me baseando nele para um seminário que eu tenho que apresentar na faculdade.
Só dando uma humilde contribuição: a função fork() precisa da biblioteca unistd.h, portanto, #include <unistd.h>.
Muito obrigado pela ajuda!