ESTE SERVIÇO PODE CONTER TRADUÇÕES FEITAS PELO GOOGLE. O GOOGLE SE ISENTA DE TODAS AS GARANTIAS RELACIONADAS ÀS TRADUÇÕES, EXPRESSAS OU IMPLÍCITAS, INCLUINDO QUALQUER RESPONSABILIDADE EM RELAÇÃO À PRECISÃO, CONFIABILIDADE E QUALQUER DEVER IMPLÍCITO SOBRE SUA COMERCIALIZAÇÃO, ADEQUAÇÃO PARA UM FIM ESPECÍFICO E NÃO-VIOLAÇÃO.

Para sua conveniência, o site da Kaspersky Lab foi traduzido com a utilização do software de tradução Google Tradutor. Foram realizados esforços razoáveis para o oferecimento de uma tradução precisa; entretanto, as traduções automatizadas não são perfeitas e tampouco pretendem substituir a tradução qualificada de especialistas. Essas traduções são fornecidas como um serviço para os usuários do site da Kaspersky Lab e são exibidas "como estão". Não há nenhuma garantia de qualquer tipo, seja expressa ou implícita, sobre a precisão, confiabilidade, ou exatidão de quaisquer traduções feitas do inglês para qualquer outro idioma. Alguns conteúdos (como imagens, vídeos, Flash, etc.) podem não estar corretamente traduzidos devido às limitações do programa de tradução.

Virus.DOS.Zhengxi

Classe Virus
Plataforma DOS
Descrição

Detalhes técnicos

Esta é uma família de vírus parasitas muito perigosos, polimórficos e furtivos. Esses vírus têm mais de 7K de comprimento, são muito complexos e talvez sejam os vírus DOS mais complexos. Esses vírus infectam arquivos EXE, OBJ e LIB e anexam os arquivos COM a arquivos ZIP, ARJ e RAR. Os vírus contêm as cadeias de texto internas:


Terminação anormal do programa
O vírus / DOS 0.54 Copyright (c) 1995 Zhengxi Ltd
Atenção! Este programa apenas para uso interno!

Instalação

O código do vírus recebe o controle de pontos diferentes dependendo do modo de infecção, mas em todos os casos o destino é a rotina de decriptação polimórfica. Nos arquivos EXE (anexando) a rotina de descriptografia recebe o controle imediatamente quando um arquivo EXE é carregado na memória para execução, em arquivos EXE (inseridos) – do código do carregador (veja infecção EXE), nos arquivos vinculados ao OBJ / infectado Arquivos LIB – da instrução CALL (consulte infecção OBJ / LIB), os droppers COM têm instrução JMP em seus inícios, que o JMP traz o controle para a rotina de descriptografia.

Sendo descriptografado, a rotina de instalação do vírus recebe o controle. O vírus prende INT 1 (One Step Tracing) e rastreia INT 21h. Durante o rastreamento, o vírus procura por algum código específico no manipulador INT 21h (esse código está presente no DOS 5.xe no DOS 6.x). Se esse código for encontrado, o vírus verificará várias condições e terminará a instalação em alguns casos.

O vírus termina a instalação se:

  • MS Windows está instalado
  • unidade de inicialização é A: ou B:
  • INT 8, 13h, 28h aponta para o mesmo segmento (para sair da instalação se o monitor antivírus estiver instalado?)
  • dia do arquivo de host (data e hora) é o mesmo ou perto do dia atual (dois bits mais altos do dia atual número XORed com dia do arquivo é igual a zero)
Então o vírus aloca o bloco da memória do sistema para a cópia TSR do vírus, armazena em seu corpo 11 bytes do endereço do manipulador INT 21h, e patches código INT 21h com instrução FAR CALL (2F FF 1E ??) que traz o controle para o manipulador INT 25h (Absolute Disk Read). Em seguida, o vírus armazena os primeiros cinco bytes do manipulador INT 25h e grava cinco bytes de FAR JMP no código do vírus. O resultado é semelhante ao seguinte:

Manipulador INT 21h:
… …
+ ——- 2E FF 1F ???? CALL FAR CS: Int25
� C7 06 ???? ; mundo magico?
� Int25: ???? ???? ???? ???? ; longe addr de INT 25h
� … …

+> Manipulador INT 25h:
+ ——– EA ???? ???? JMP FAR VirusHandler
� … …

+> Manipulador de vírus:
2E 8F 06 … POP CS: Caller_IP
… …
Como resultado, o vírus tem o mesmo manipulador para interceptar as chamadas INT 21h e INT 25h. Para separar essas chamadas, o vírus verifica o endereço do chamador (Caller_IP). Se a chamada for do manipulador INT 21h, o vírus passará o controle para a rotina do manipulador Vírus INH 21h, em outro caso, o manipulador Vírus INT 25h receberá o controle.

A rotina de instalação está completa, mas o vírus pode mover seu código para outros blocos de memória (veja a análise do manipulador INT 21h). Assim, a cópia TSR do vírus não ocupa os mesmos blocos da memória do sistema, mas pode mover-se para outros endereços, incluindo os do UMB.

Em seguida, o vírus retorna o controle para o programa host. Existem três variantes diferentes de tal retorno, elas dependem do método de infecção. No caso de conta-gotas COM, o vírus exibe apenas a mensagem:


Terminação anormal do programa
e retorna ao DOS com a função Terminate (INT 21h, AH = 4Ch). No caso do método de infecção de anexação EXE, o vírus restaura o cabeçalho do arquivo original usando o mecanismo polimórfico (gera uma rotina de descriptografia polimórfica e executa-a para restaurar o cabeçalho original, ver infecção por EXE abaixo). No caso da maneira de inserir EXE, o vírus simplesmente retorna ao programa hospedeiro porque o carregador de vírus inserido no arquivo restaura o código original sozinho. No caso do arquivo OBJ / LIB, o vírus também retorna ao programa host (veja infecção por OBJ / LIB abaixo).

Manipulador INT 21h

O vírus intercepta 18 das funções INT 21h:

3Dh, 6Ch – Abrir / Criar Arquivo
3Eh – Fechar Arquivo
3Fh – arquivo lido
42h – Lseek
4Bh – executar arquivo
41h – Excluir arquivo
11h, 12h – FindFist / Próximo FCB
4Eh, 4Fh – FindFist / Next ASCII
00h, 4Ch – Terminar
31h – Fique TSR
67h – Definir contagem de identificadores
48h, 49h, 4Ah – funções de gerenciamento de memória (alocar, liberar, redimensionar)
As funções Set Handle Count, Execute File e Memory Management são usadas pelo vírus para esconder seu código na memória do sistema – o vírus manipula com blocos MCB para não ficar visível no mapa da memória enquanto estiver usando utilitários de navegação de memória.

Ao interceptar as funções Terminate, Stay TSR e FreeMemory, o vírus move seu código para um novo endereço na memória do sistema. O vírus aloca novo bloco da memória (que pode ser convencional ou bloco de memória UMB) e copia a si mesmo para lá. Portanto, embora a instalação do vírus não afete os blocos UMB para colocar sua cópia TSR, ela pode se mover para o UMB e se ocultar lá.

Enquanto arquivo abrindo o vírus executa várias chamadas diferentes. Primeiro, o vírus verifica o modo de abertura e, se o arquivo estiver aberto para gravação, o vírus desinfecta o arquivo.

Antes da desinfecção, o vírus verifica se o arquivo é acessado e o programa que acessa esse arquivo (chamador). O vírus compara o nome do programa de acesso (chamador) com a lista de nomes (veja abaixo), e não desinfecta o arquivo acessado se o nome do programa de acesso for daquela lista. Os nomes dos arquivos são:


UUENCODE.EXE, PKLITE.EXE, LZEXE.EXE, NDD.EXE, DIET.EXE, AFD.EXE, SD.EXE,
SPEEDDSK.EXE, DEFRAG.EXE, TLINK.EXE, LINK.EXE
No caso da função AH = 3D00h (Open ReadOnly), o vírus executa algumas ações estranhas. Ele verifica o código do chamador e corrige o código. Parece patch de algum scanner anti-vírus. Felizmente, o vírus tem o bug e esse ramo nunca é executado.

Ao abrir o arquivo, o vírus também traz o controle para a rotina do stealth – o vírus substitui o comprimento do arquivo pelo original.

Ao ler o arquivo, o vírus chama a rotina stealth. Em caso de leitura do cabeçalho do arquivo infectado, o vírus lê, descriptografa e copia o cabeçalho original no buffer de leitura.

No caso da função Lseek, o vírus traz o controle para outra rotina furtiva do vírus – o vírus não permite buscar o tamanho original do arquivo.

Ao excluir o arquivo infectado, o vírus o desinfecta.

Ao procurar os arquivos com chamadas FindFirst / Next, o vírus substitui o comprimento do arquivo pelo original, caso o arquivo esteja infectado.

As chamadas ASCII FindFist / Next também são usadas pelo vírus para capturar os arquivos para infecção. O vírus salva o nome de qualquer arquivo que é acessado com a função FindFirst e aproximadamente cada quinto arquivo (com probabilidade 3/16) acessado com a função FindNext. O vírus tem apenas um buffer para o nome do arquivo, então cada nome seguinte sobrescreve o anterior.

Durante o fechamento de qualquer arquivo, o vírus verifica e infecta o arquivo com o nome que está armazenado no buffer. O vírus também infecta o arquivo que está fechado, mas o faz com probabilidade 1/4 (pelo resultado do gerador aleatório do vírus)

Infecção

Antes de infectar o arquivo, o vírus verifica várias condições:
  • o arquivo não é "apenas cria", comparando o número do dia atual com o carimbo de data e hora do arquivo (o mesmo da instalação)
  • o arquivo é local e não em A: ou B: drive
  • o nome do arquivo não é *.? V? (* .OVL?)
  • há espaço livre em disco suficiente (verifica com INT 21h, AH = 36h)
No caso de todas essas condições, o vírus lê o cabeçalho do arquivo e o verifica quanto a selos EXE, OBJ, LIB e arquivos.

Infecting Arquivos EXE

O vírus infecta o EXE por três métodos diferentes – anexando, inserindo e infectando arquivos em arquivos auto-extraíveis.

Primeiro, o vírus verifica a estrutura do arquivo e, se for um arquivo EXE de extração automática (criado pelo ZIP2EXE, por exemplo), o vírus infecta o arquivo anexado (ZIP, ARJ, RAR) pelo método descrito abaixo – cria o conta-gotas COM e adiciona-o ao conteúdo do arquivo.

Em seguida, o vírus verifica o comprimento do arquivo e não infecta os arquivos com o comprimento menor que 400h (1024) bytes. Se o comprimento do módulo carregável (nota: não o tamanho do arquivo) for maior que 32K, o vírus inserirá o carregador no meio do arquivo. Em outro caso, o vírus infecta o arquivo adicionando o método.

Ao infectar os arquivos, anexando o método, o vírus lê o cabeçalho do arquivo, criptografa e salva-o no final do arquivo. Em seguida, o vírus executa seu gerador polimórfico e salva o corpo do vírus criptografado e os loops polimórficos no final do arquivo. Para terminar a infecção, o vírus aumenta o comprimento do arquivo para o valor que está sendo dividido por 9Dh, o resto 25h (para detectar arquivos já infectados, é o selo "ID" do vírus) e modifica os campos de cabeçalho EXE (registros e tamanho do módulo).

Observação: o vírus criptografa o cabeçalho original do arquivo host com o loop de criptografia polimórfico e esse loop é diferente da rotina usada durante a criptografia do corpo do vírus. Ou seja, o vírus chama o mecanismo polimórfico duas vezes – enquanto criptografa o cabeçalho EXE original e ao mesmo tempo criptografa o corpo principal.

Durante a execução do arquivo EXE infectado, os loops de descriptografia restauram o corpo do vírus principal, mas não o cabeçalho do arquivo original. Para retornar ao programa host, o vírus precisa descriptografar os dados do host, mas o mecanismo gera loops aleatórios com funções de criptografia selecionadas aleatoriamente. Para resolver esse problema, o vírus armazena os valores iniciais do gerador aleatório enquanto criptografa os dados do host e executa o gerador polimórfico com os mesmos valores ao descriptografar esses dados. Como resultado, o gerador traz o mesmo código que foi usado durante a criptografia dos dados do host e, sendo executado, essa rotina o descriptografa.

Infecting Arquivos EXE (Inserção)

Se o tamanho do arquivo for maior que 32K, o vírus procurará o início do módulo principal EXE (logo após o cabeçalho EXE), lerá 6K do código e procurará as rotinas C / Pascal lá. Normalmente, as rotinas C / Pascal começam no mesmo "cabeçalho" que salva o registrador BP, e move o ponteiro da pilha SP para BP.

O vírus varre o código para esses "cabeçalhos" e se tal código for encontrado, o vírus varre os próximos 54h de código para instruções RET ou CALL FAR para evitar a sobreposição da próxima sub-rotina ou o endereço realocado. Se tal código (RET ou CALL FAR) for encontrado, o vírus sairá da rotina de infecção.

Em seguida, o vírus lê 54h bytes dessa rotina, substitui-o pelo código do carregador de vírus, depois criptografa o corpo principal do vírus com o mecanismo polimórfico e o salva no final do arquivo. Em seguida, o vírus criptografa com a função SUB simples o código original da sub-rotina e a segunda parte do carregador, e salva-o no final do arquivo. Em seguida, o vírus grava no final do arquivo os dados aleatórios da mesma maneira que o método de infecção "anexado".


Não infectado infectado
———— ——–
+ ————– + + ————– +
HeadExe Header � �Exe Header �
+ ————– � + ————– �
�Meu código EXE � �Meu código EXE �
� ————– � � ————– �
SuC / Pascal subr � – Carregador de vírus � Parte 1, 52h bytes, não criptografados
� ————– � � � ————– �
� � � �Meu código EXE �
� � � � (continuação) �
+ ————– + � + ————– �
� �Virus � criptografado com loops polimórficos
� � ————– �
� �Virus loader � Parte 2, criptografada com o comando SUB
� � ————– � 70 bytes
+ -> �Código salvo � Código original da sub-rotina patched,
� ————– � 52h bytes, criptografados com SUB
� Dados aleatórios � tamanho do arquivo / 9Dh, o resto é de 25h
+ ————– +
Sendo executado, o carregador procura o nome do arquivo host usando campos PSP, abre os arquivos, procura o final do arquivo, lê, descriptografa e executa a segunda parte do conta-gotas. Essa parte restaura a sub-rotina corrigida, aloca a memória do sistema (convencional ou UMB), lê o corpo do vírus principal e passa o controle para o loop polimórfico de decriptografia. Esse loop descriptografa o corpo do vírus e passa o controle para a rotina de instalação.

Essa é uma maneira muito insidiosa de infecção. O código do vírus está oculto no arquivo e não há entrada direta no código do vírus no cabeçalho do arquivo. A sub-rotina substituída pelo carregador de vírus pode ser "raramente executada". Por exemplo, a sub-rotina que exibe a mensagem de erro. Assim, o vírus pode "dormir" nesses arquivos por um longo tempo, e então pular e infectar o sistema sob algumas condições limitadas.

Infecting Archives

Em caso de arquivo, o vírus cria na memória a imagem do conta-gotas infectado e anexa-o ao arquivo. Que os droppers de COM sempre começam com instruções JMP seguidas por dados aleatórios, código de vírus criptografado e loop polimórfico de decriptografia. A instrução JMP traz o controle para o loop de descriptografia.

O nome do conta-gotas é selecionado aleatoriamente e finalizado com extensão .COM, por exemplo:


HAIF.COM, UCM.COM, DOO.COM, VLG.COM e assim por diante.
Ao processar os campos de arquivamento, o vírus não usa nenhum utilitário externo, mas preenche todos os campos necessários. O vírus não empacota o conta-gotas, mas usa o método "armazenado" – o vírus é armazenado no arquivo "como está". Ao infectar o vírus, verifica o conteúdo dos arquivos e não os infecta duas vezes.

Infecção de arquivos OBJ e LIB

Ao infectar os módulos OBJ / LIB, o vírus verifica os campos do arquivo, cria e insere lá novos registros de objetos contendo o código de vírus que é criptografado com loops polimórficos.

Durante a verificação do arquivo objeto, o vírus verifica o código desse arquivo para a sub-rotina C / Pascal "cabeçalho", bem como durante a inserção em arquivos EXE, e infecta os arquivos somente se esse código for encontrado. Mas no caso do módulo OBJ ou LIB o vírus não coloca o código do carregador nele, mas sobrescreve o cabeçalho C / Pascal com a instrução CALL (E8xxxx).

Sendo ligado ao arquivo executável que CALL traz o controle para o loop de descriptografia polimórfica do vírus. Esse loop descriptografa o código de vírus e passa o controle para a rotina de instalação de vírus.

Assim como nos arquivos EXE (inserções), o CALL talvez nunca receba o controle, e o vírus pode dormir por um longo tempo. Mas sob algumas condições, o vírus pode pular e infectar o sistema.

Manipulador INT 25h

Este manipulador realiza a rotina stealth no nível INT 25h. Ao acessar as entradas de diretório, o vírus substitui o tamanho do arquivo por arquivos originais, enquanto lê o cabeçalho do arquivo infectado que o vírus restaura e traz a forma original.

O vírus não percebe 100% stealth no nível INT 25h, é claro. Existem maneiras de contornar a rotina do stealth. Mas, se algum programa antivírus ler o conteúdo do arquivo pelas funções INT 21h do DOS, ler a estrutura do diretório e, em seguida, o conteúdo do arquivo por chamadas INT 25h absolutas, o vírus não ficará visível.

Rotina de Trigger

Se, ao processar arquivos ZIP, o vírus encontrar algum registro que esteja compactado com o método "armazenado", ele verificará o registro de data e hora do arquivo ZIP. Se o ano da última modificação desse arquivo for 1996 ou mais, o vírus procura todos os arquivos de todos os diretórios de todos os discos de C: till Z: e, em seguida, exclui os arquivos e a árvore de subdiretórios inteiros.


Link para o original