Como criar um programa auto-replicativo em assembly, para GNU/Linux

A arte da criação de programas auto-replicativos parece estar perdida no tempo. Não podemos confundir um programa auto-replicativo com malware, cavalos de tróia, worms, etc. Um programa auto-replicativo não executa nenhum tipo de código para danificar hardware ou software, pelo contrário apenas tenta replicar-se de diversas formas ou métodos e é por norma escrito numa linguagem de baixo nível, como por exemplo assembly. A parte mais interessante e importante do programa ao contrário de um malware não é um pedaço de código para causar danos, mas antes pelo contrário apenas o código que per- mite que o programa se replique.

Apesar de muitas vezes se confundirem as duas tarefas, um programa auto-replicativo é uma forma de criatividade, engenho e inovação, com o objectivo de criar um programa que se consiga manter num sistema informático evitando ser apagado e replicando-se de forma inteligente, evitando a sua detecção e consequente remoção. É quase como fazer um avião de papel, ajustar as “asas”, o “nariz”, colocar ou não um “leme de cauda”, etc e atirar para ver que distância é percorrida antes de inevitavelmente aterrar, ou melhor, cair! Em momento algum se pretende que o programa, tal como o avião, dure “ad aeternum”, sendo o interesse apenas no lapso de tempo que ele durará até ser totalmente removido.

O objectivo deste artigo é apenas apresentar a temática e um programa exemplo, para que o leitor possa experimentar e começar a entender os mecanismos envolvidos, construindo o programa e aprofundando assim conhecimentos de sistema operativo e programação na linguagem assembly.

No incrível livro de Ryan “elfmaster” O’Neill, Learning Linux Binary Analysis, ele afirma: “… é um grande desafio de engenharia que excede as convenções regulares de programação, exigindo que o programador pense fora dos paradigmas convencionais. É manipular o código, dados e ambiente para ele se comportar de uma determinada forma… (…). Enquanto conversando com os desenvolvedores do software AV, fiquei espantado que, ao lado de nenhum deles tinha qualquer ideia real de como engenheiro de um vírus, muito menos projetar qualquer heurística real para identificá-los (diferente de assinaturas). A verdade é que a escrita do vírus é difícil, e requer habilidade séria.”

A escrita deste tipo de programas em linguagem assembly ou em linguagem C é de certa forma uma arte em separado. As linguagens como assembly ou C sem o recurso a bibliotecas, são basicamente “pincéis”, simples prontos para pintar.

Antes de passarmos ao programa propriamente dito, vejamos alguns aspectos importantes relacionados com esta temática.

[...]

Leia o artigo completo na edição 57 da Revista PROGRAMAR

Publicado na edição 57 (PDF) da Revista PROGRAMAR.