nsrlsvr-bd

Transcrição

nsrlsvr-bd
� � � � � ��� � � � � � � � ��� � ��� � � � � � � � � � ��� ��� � � � � � �
NSRLSVR-BD
RELATÓRIO DE PROJETO FINAL DA LICENCIATURA EM ENGENHARIA INFORMÁTICA
�����
Fábio André Soares de Freitas
� � � � � � � � � � � � � � António Alberto dos Santos Pinto
���
2014/06
����������������
Índice de conteúdo
Resumo.......................................................................................................................................... IV
1 - Introdução................................................................................................................................... 1
2 - Ficheiros conhecidos................................................................................................................... 2
2.1 – Identificação de ficheiros conhecidos......................................................................................2
2.2 Técnicas de identificação de ficheiros........................................................................................3
2.2.1 Assinaturas de ficheiros........................................................................................................... 3
2.2.2 Técnicas anti vírus...................................................................................................................5
2.2.3 Técnicas anti vírus avançadas................................................................................................7
2.2.4 Funções Criptográficas de Resumo.......................................................................................12
2.3 – NSRL..................................................................................................................................... 20
2.3.1 – NSRLLOOKUP................................................................................................................... 22
3 – Desenvolvimento do NSRLSVR-BD.........................................................................................24
3.1 – Requisitos.............................................................................................................................. 24
3.2 – Modelo Conceptual e Relacional...........................................................................................25
3.3 – Protótipo da aplicação........................................................................................................... 26
4 – Avaliação da aplicação............................................................................................................. 34
4.1 – Carregar dados para base de dados.....................................................................................34
4.2 – Testes do protótipo................................................................................................................ 37
4.2.1 – Requisitos a testar.............................................................................................................. 38
4.2.2 – Estratégia de testes............................................................................................................ 39
4.3 – Resultados............................................................................................................................ 42
5 – Conclusão................................................................................................................................ 45
I
Índice de tabelas
Exemplo de assinaturas de ficheiros [26].........................................................................................4
Exemplo do ficheiro conf................................................................................................................ 28
Exemplo da estrutura da base de dados........................................................................................28
Exemplo de inserção na base de dados.........................................................................................28
Exemplo de Código de inserção de dados.....................................................................................29
comando de ajuda.......................................................................................................................... 30
funcionalidades existentes na aplicação........................................................................................30
comando para iniciar o servidor......................................................................................................30
protocolo de comunicação com cliente...........................................................................................33
Exemplo de um ficheiro para carregar dados base de dados.........................................................35
Exemplo de um script para auxilio a carregar dados na base de dados.........................................36
Exemplo de registo log script......................................................................................................... 36
Registos da inserção de dados na base de dados.........................................................................37
Exemplo do script de registar ficheiros não conhecidos.................................................................38
Teste de integridade de dados e da base de dados.......................................................................40
Teste de Funções........................................................................................................................... 40
Testes da interface do utilizador.....................................................................................................41
Teste de Performance.................................................................................................................... 41
Teste de instalação......................................................................................................................... 42
Tempos de pesquisas..................................................................................................................... 43
II
Índice de ilustrações
Exemplo editor hexadecimal PDF....................................................................................................5
Sistema digital imune [16]................................................................................................................9
Duas funções de hash simples [16]................................................................................................15
Uma carta com 2^37 variações[2]..................................................................................................18
Modelo Conceptual........................................................................................................................ 25
Modelo Relacional.......................................................................................................................... 26
Comunicação Cliente-Servidor.......................................................................................................27
III
Resumo
A análise forense a equipamentos informáticos recorre frequentemente a técnicas de identificação
de ficheiros. Esta técnica permite que o analista forense ignore milhares de ficheiros (sistema
operativo, aplicações, etc) previamente identificados e considerados conhecidos, reduzindo-se a
quantidade de informação a analisar pelo analista. Uma aplicação que o permite fazer é o
NSRLSVR que, por carregar a totalidade da base de dados de identificação de ficheiros (resumos
criptográficos) para memória RAM é simultaneamente muito rápida e muito exigente em termos de
recursos de hardware.
O objetivo deste projeto consiste é fazer uma nova versão da aplicação NSRLSVR, de forma a
manter o seu funcionamento mas que guarde os dados numa base de dados em vez de carregar
para a memória RAM. Tal permitirá a sua execução em PCs com especificações de hardware
menores. Adicionalmente, pretende-se que a nova aplicação seja multi-plataforma.
O desenvolvimento deste projeto implicou a criação de uma base de dados, o estudar do
funcionamento da aplicação original, bem como do respetivo protocolo de comunicação. A
aplicação NSRLSVR é utilizada em conjunto com uma aplicação cliente. Funcionalidade esta que
também foi assegurada pelo atual projeto, podendo ser utilizada com a aplicação cliente do
NSRLSVR original.
Os resultados obtidos da comparação entre as duas versões da aplicação (NSRLSVR e
NSRLSVR-BD) resumem-se a uma execução 7,14 vezes mais lenta na pesquisa de resumos
(hashes) da aplicação NSRLSVR-BD, quando comparada com a aplicação original (NSRLSVR).
Não obstantes, o NSRLSVR-BD torna-se mais usável já que é multi-plataforma e não têm os
mesmos requisitos de RAM que a original.
IV
1 - Introdução
O projeto consiste no desenvolvimento de uma nova versão da aplicação NSRLSVR. O NSRLSVR
é uma aplicação que armazena resumos criptográficos de ficheiros conhecidos e possibilita a sua
comparação com ficheiros num qualquer suporte de armazenamento. Os ficheiros que existam
que sejam identificados como previamente conhecidos podem ser ignorados nos processos de
análise forense. Na prática, o NSRLSVR procura por um hash de um ficheiro, se esse hash for
encontrado quer dizer que o ficheiro é conhecido. O NSRLSVR, no seu arranque, carrega para
memória RAM a totalidade da base de dados da NSRL. Depois de carregada, recebe pedidos
para procurar hashes por intermédio da aplicação cliente (NSRLLOOKUP).
O contexto do atual projeto, em detrimento do uso de memória RAM, haverá recurso a uma base
de dados MySQL, porque o TXT a carregar para a memória RAM é muito extenso e ocupa
aproximadamente 30 GB. Tal torna a aplicação pouco usável num computador normal e serve de
mote para o projeto atual. A linguagem utilizada na aplicação original é o C++, tendo a mesma
sido desenvolvida unicamente para Linux. Neste projeto utilizar-se-á Java para, assim, tornar a
nova aplicação uma aplicação multi-plataforma.
A estrutura deste relatório está organizada em capítulos. O Capítulo 2 abordada a identificação de
ficheiros conhecidos, técnicas para a identificação de ficheiros conhecidos e NSRL que é um
armazém de software conhecido. O Capítulo 3 apresenta os requisitos necessários para o
funcionamento da aplicação, a criação de diagramas da base de dados e por um protótipo da
aplicação. O Capítulo 4 descreve a metodologia de trabalhado desenvolvida, os testes e seu
planeamento e, por fim, os resultados dos testes efectuados. O Capítulo 5 conclui o relatório.
1
2 - Ficheiros conhecidos
A identificação de ficheiros é um método muito utilizado pelos técnicos forenses quando
deparados com uma grande fonte de dados. Nesses casos, normalmente fazem uma cópia
fidedigna e autêntica. Quando fazem a análise a um sistema de armazenamento normalmente
fazem os seguintes processos recolha de informação, recuperação de dados perdidos,
identificação de ficheiros conhecidos estabelecimento de linhas temporais de eventos.
Quando chegarem ao processo de identificação de ficheiros conhecidos vão precisar de
técnicas que possam identificar ficheiro que sejam conhecidos, visto que este método permite
acelerar o processo quando temos que analisar um disco de armazenamento que tenha muitos
ficheiros. As técnicas de identificação de ficheiros passam pelo reconhecimento de ficheiros que,
por sua vez, permitem verificar se é um ficheiro conhecido, para isso usam-se assinaturas de
ficheiros, técnicas antivírus e funções criptográficas de resumo.
2.1 – Identificação de ficheiros conhecidos
É um procedimento muito comum, que permite acelerar o processo quando temos que analisar
um disco ou um suporte de armazenamento que contenha muitos ficheiros, reduzindo assim os
ficheiros a analisar. Nesta pesquisa pode se considerar qualquer sistema operativo existente, por
exemplo, qualquer sistema que vamos analisar é normal que seja constituído por muitos ficheiros
podendo ultrapassar as dezenas de milhar de ficheiros. Para tornar a pesquisa mais fácil podemse utilizar funções criptográficas de resumo tornando-se possível reconhecer um ficheiro e
averiguar que o seu conteúdo não foi alterado mesmo quando modificado o seu nome [24].
Quando estamos num procedimento de análise de suportes de armazenamento, cada vez
maiores, verifica-se que a informação de determinados ficheiros é comum, permitindo que o
analista forense possa se dedicar aos outros ficheiros, que podem ser potencialmente mais úteis
para a investigação. E cada vez mais usual encontrar-se base de dados de hashes de SHA-1, ou
outras, de ficheiros conhecidos disponíveis na Internet. Fazem parte desta base de dados
ficheiros tais como os ficheiros que compõem os sistemas operativos mais comuns (Microsoft,
Apple, Linux) permitindo passar rapidamente dezenas de milhares de ficheiros de um disco ou
suporte de armazenamento [24].
2
Na Internet existem várias base de dados que podem ser usadas por ferramentas forenses, no
entanto surge como ponto crítico o processamento de ficheiros porque este implica que se faça o
resumo (Ex: MD5) de todos os ficheiros, como também a sua comparação com resumos
previamente guardados numa base de dados. Ou seja, para se fazer esta tarefa, necessita-se de
duas componentes críticas: 1) a base de dados com hashes (resumos); 2) aplicações que
permitem a comparação com a informação guardada na base de dados [24].
2.2 Técnicas de identificação de ficheiros
2.2.1 Assinaturas de ficheiros
Uma assinatura de ficheiro é um número de identificação único, localizado no início de um ficheiro.
Esse número identifica o tipo de ficheiro, dando informações sobre os dados contidos no ficheiro
real. Esta informação pode ser usada para determinar que tipo de ficheiro está a ser lido ou
quando o utilizador tenha identificado erradamente a extensão do ficheiro como um tipo incorrecto.
A assinatura do ficheiro também pode conter informações que garantem que os dados originais
foram armazenados no ficheiro estão intactos e não foram modificados. A combinação destes
elementos permite uma assinatura de ficheiro que serve como uma importante forma de
verificação, especialmente contra vírus de computador [25].
O conceito de uma assinatura de ficheiro surgiu devido à necessidade de um cabeçalho de
ficheiro - um bloco de dados - define os parâmetros da forma como a informação é armazenada.
Parte da informação do cabeçalho é uma sequência de bytes que define o tipo de ficheiro que foi
originalmente criado. Isso pode ser um ficheiro de imagem, um documento de um programa
específico, ou até mesmo um tipo de protocolo quando um fluxo do ficheiro está a ser usado
como um método de comunicação entre um cliente e servidor. O cabeçalho do ficheiro não usa
um padrão definido, que, ao contrário, é propriedade de cada formato diferente, ou seja, um
programa ou sistema operativo precisa de uma base de dados de assinaturas de ficheiros para
determinar o tipo de um ficheiro desconhecido [25].
A assinatura de ficheiro real é, por vezes, referida como um número mágico. Ao olhar para um
cabeçalho do ficheiro para determinar o tipo desse ficheiro, isso significa que não há duas
assinaturas de ficheiro iguais, permitindo que, para cada tipo de formato possa ter uma sequência
3
de identificação distinta de bytes. Isto pode ser de uso particular quando se lida com a
transferência e interpretação de ficheiros on-line, onde a extensão de identificação de um ficheiro
pode ser arbitrária e incapaz de ser invocado como um identificador para um tipo de ficheiro [25].
Além do tipo de ficheiro, uma assinatura de ficheiro também pode conter informações que
permitam a verificação de erros quando é executada num ficheiro verifique que os dados que ele
está a guardar possam ser confirmados como sendo intactos. Isto é muitas vezes realizado
utilizando uma função conhecida como uma soma de verificação (checksum). A soma de
verificação é uma função que utiliza os valores inteiros dos dados do ficheiro para criar valores
matemáticos que podem ser replicados depois que um ficheiro é transferido ou carregado. Na
forma mais básica, o processo envolve a adição dos valores de uma série de bytes no ficheiro e,
em seguida, a gravação da soma, permitindo que o programa de descodificação do ficheiro
execute a mesma função. Se os resultados são diferentes durante a descodificação, o ficheiro
pode ter sido danificado e os dados tanto podem ser inválidos ou podem ter sido modificados para
fins maliciosos [25].
Alguns exemplos de assinatura de ficheiros:
Hex assinatura
ISO 8859-1
Deslocação
Extensão ficheiro
Descrição
00 00 00 nn 66 74 79 70
33 67 70 35
....ftyp
3gp5
0
MP4
File de vídeo MPEG-4
25 50 44 46
%PDF
0
pdf
Documento PDF
43 44 30 30 31
CD001
0x8001, 0x8801
or 0x9001
iso
ISO9660 CD/DVD ficheiro de
imagem
FF D8 FF
ÿØÿà
0
jpg, jpeg
JPEG
doc
Doc. Microsoft Office
78 01 73 0D 62 62 60
x.s.bb`
0
dmg
Apple Disk imagem file
52 61 72 21 1A 07 01 00
Rar!....
0
rar
RAR ficheiro v. 5.0
D0 CF 11 E0
Tabela 1: Exemplo de assinaturas de ficheiros [26]
Na Tabela 1 mostra alguns exemplos de ficheiros comuns, mostrando a sua assinatura
hexadecimal, a sua representação em ISO 8829-1 (caracteres que são legíveis), a posição que se
encontra em relação ao inicio do ficheiro, a sua extensão normal e uma descrição que o seu
conteúdo tem. Como exemplo, 5º linha apresenta o caso dos ficheiros JPEG que tem os seus
valores hexadecimais FF D8 FF no inicio do ficheiro devido há deslocação ser 0 e que tem como
extensão jpg e jpeg.
Será utilizado um editor hexadecimal, que é uma ferramenta muito recorrente em análise forense
4
a imagens de suportes de armazenamento para demonstrar alguns exemplos constantes da
Tabela 1. O editor hexadecimal adotado foi o Bless Hex Editor, um editor de ficheiros hexadecimal
em modo gráfico.
Figura 1: Exemplo editor hexadecimal PDF
Na Figura 1, mostra o hexadecimal de um ficheiro PDF, se analisar a primeira linha desse ficheiro
pode-se observar que os primeiros 8 dígitos a seguir à barra são os mesmos 8 dígitos que
aparecem na 3º linha da Tabela 1, o que significa que mesmo que a extensão seja alterada estes
números não se alteram podendo identificar a verdadeira extensão do ficheiro.
2.2.2 Técnicas anti vírus
Uma possível técnica ideal para a ameaça de vírus é a prevenção. Não podemos permitir que um
vírus entre no sistema, em primeiro lugar. De um modo geral, esse objetivo é impossível de se
conseguir, embora a precaução pode diminuir o número de ataques virais bem-sucedidos. Outra
técnica bastante eficaz atua através das seguintes componentes:
- Detecção: Depois de ter ocorrido uma infecção, localize o vírus.
- Identificação: Depois da detecção do vírus estar completa, verifique o vírus específico que
infeccionou o programa.
- Remoção: Uma vez que o vírus específico tenha sido identificado, apague todos os traços
do vírus do programa infetado e recupere a sua condição natural. Apague o vírus de todos o
sistemas afetados, para que não se propague mais[16].
5
Se conseguir detetar com sucesso ameaça, no entanto, caso o reconhecimento ou a remoção
não forem possíveis, então outra alternativa será apagar o programa infetado e recarregar uma
versão de backup limpa[16].
À medida que se dão avanços na tecnologia de vírus também há na tecnologia de antivírus, pois
seguem lado a lado. Os primeiros registos de vírus eram pedaços de códigos muito simples, e
podiam também ser reconhecidos e apagados com software antivírus muito simples também. Há
medida que os vírus evoluíram, tanto os vírus como os softwares antivírus, tornaram-se mais
complexos e sofisticados[16].
[14] Identifica na sua obra quatro gerações de software antivírus:
- Primeira geração: scanner simples
- Segunda geração: scanner heurístico
- Terceira geração: intercetações de atividades
- Quarta geração: proteção completa
Um scanner de primeira geração requer que um vírus seja identificado por uma assinatura. O
vírus pode ter algumas alterações, mas tem o mesmo esqueleto e padrão de bits em todos os
seus duplicados. Esses scanners exclusivos de rubricas estão limitados a encontrar vírus já
conhecidos. Outra característica dos scanners de primeira geração é manter um registo do
tamanho dos softwares e investigar se há modificações no tamanho[16].
Um scanner de segunda geração não está sobre dependência de uma rubrica exclusiva. Em vez
disso, o scanner utiliza regras heurísticas para investigar uma possível contaminação de vírus.
Uma classe que está nesses scanners investiga se existem pedaços de código que, normalmente,
estão associados a vírus. Como por exemplo, ele é capaz de pesquisar no início de um ciclo de
criptográfica utilizado num vírus polimórfico e decifrar a chave de criptográfica. No tempo em que
a chave é conhecida, o scanner pode descodificar o vírus para conhecê-lo, depois disso apaga a
contaminação e volta a executar o programa normalmente[16].
Outra técnica de segunda geração é a averiguação de integridade. Uma adição de averiguação
(checksum) pode ser agregada a cada programa. Se um vírus contaminar o programa sem alterar
6
a adição de averiguação, então a averiguação de integridade perceberá a alteração. Para
incapacitar um vírus refinado o suficiente para modificar a adição de averiguação que contamina
um programa, será utilizada uma função de hash codificada. A chave de criptografia é guardada
separadamente do programa, para que o vírus não produza um novo código de hash e o
codifique. Ao utilizar-se uma função de hash em vez de uma adição de averiguação mais vulgar, o
vírus é impossibilitado de regular o programa para criar o mesmo código de hash que tinha
anteriormente[16].
Programas de terceira geração são programas que habitam na memória, que reconhecem um
vírus por suas atividades, em vez do seu esqueleto num programa contaminado. Esses
programas têm a vantagem de que não precisam de evoluir rubricas e heurísticas para uma
diversidade de vírus. Em vez disso, é essencial somente reconhecer um baixo grupo de atividades
que apontam que uma contaminação está em curso e, então, interferir[16].
Produtos de quarta geração são pacotes formado por uma sequência de técnicas antivírus
utilizadas em conjunto. Estas abrangem elementos de procura e de interrupção de atividades.
Além disso, esse tipo de pacote abrange meios de fiscalização de entrada, que restringe a
competência dos vírus de introduzir-se num sistema e, por isso, inibe um vírus de modificar
ficheiros a fim de transitar a contaminação para outros ficheiros[16].
Com os pacotes de quarta geração, é aplicada uma estratégia de defesa mais abrangente, em
que se aumente o limite da defesa para medidas de proteção de computador de uso mais
pessoal[16].
2.2.3 Técnicas anti vírus avançadas
Continuam a aparecer técnicas e produtos mais avançados. Neste sub capitulo, vamos destacar
as duas técnicas mais relevantes[16].
Decifra genérica A tecnologia de decifra genérica (DG) deixa que o programa antivírus descubra
naturalmente até mesmo os vírus polimórficos mais difíceis, enquanto a rapidez na procura se
mantém [10]. Convém lembrar de que, quando um ficheiro contem um vírus polimórfico é
executado, o vírus para se ativar precisa de se descodificar. Para descobrir esse esqueleto, os
ficheiros executáveis são executados por meio de um scanner de DG, que engloba os seguintes
elementos:
7
- Emulador de CPU: “computador virtual baseado em software”. As tarefas num ficheiro
executável são interpretadas pelo emulador, em vez de ser executadas no principal processador.
O emulador contém versões de software de todos os registados e outro hardware do processador,
de modo que o processador principal não seja contaminado por programas interpretados pelo
emulador.
- Scanner de rubrica do vírus: módulo que procura rubricas de vírus já conhecidos no código
do destino.
- Módulo de controle de vírus: é um módulo para controlar a execução do código do
destino[16].
No começo de cada emulação, o emulador inicia a sua função ao interpretar processos no código
do destino, uma a uma. Consequentemente, se o código abrange um hábito de decifra que
descodifica e, desta forma, exibe o vírus, esse código é interpretado. Verdadeiramente, o vírus
executa a atividade para o programa antivírus, exibindo o vírus. Frequentemente, o módulo de
controle paralisa a interceção para percorrer o código do destino há procura de rubricas de
vírus[16].
No decurso da interceção, o código do destino pode não provocar estragos no ambiente de
trabalho do computador pessoal real, visto que está a ser interpretado em um ambiente totalmente
seguro[16].
O contratempo do plano mais árduo no scanner de DG é especificar por quanto tempo corre cada
interpretação. Normalmente, os componentes do vírus são acionados após que um programa
inicie a sua execução, mas isso não necessita de ocorrer. Quanto mais vezes o scanner emular
um programa em privado, terá mais hipóteses de descobrir vírus ocultos. Contudo, o programa
antivírus apenas vai utilizar um número escasso de tempo e recursos antes que os utilizadores
comessem a reclamar[16].
Sistema digital imune O sistema digital imune é uma abordagem envolvente para a defesa
contra vírus, que foi elaborado pela IBM [5] [6]. A justificação para esse crescimento é o aumento
do alastramento de vírus na Internet. Primeiro, iremos abordar o aumento de vírus na Internet e
em seguida iremos abordar resumidamente a técnica da IBM[16].
Normalmente, o aviso de vírus foi assinalada pela propagação lenta de novos vírus e novas
8
alterações. Usualmente, o software antivírus costumava ser remodelado todos os meses, isto
bastava para segurar o problema. A Internet também cumpriu um papel relativamente baixo na
propagação do vírus. Mas, como [1] aponta, duas direções significativas na tecnologia da Internet
que tiveram um embate progressivo na aceleração no contágio dos vírus nestes últimos anos:
- Sistemas de correio integrados: sistemas como Lotus Notes e Microsoft Outlook fazem com
que seja fácil enviar alguma coisa a qualquer pessoa e manusear os assuntos recebidos.
- Sistemas de programas móvel: Conhecimentos como o Java e ActiveX deixam que
programas se movimentem por sua conta de um sistema para outro[16].
Para responder ao aviso colocado pelas competências baseadas na Internet, a IBM concebeu um
protótipo de sistema digital imune. Este sistema alarga a utilização da emulação do programa que
foi descrita anteriormente e dá um sistema de emulação e de deteção de vírus de utilização mais
geral. O objetivo deste sistema é responder prontamente para que os vírus sejam apagados na
mesma hora que são introduzidos. Quando um novo vírus entra em funcionamento, o sistema
imune capta-o logo, analisa-o e aumenta a verificação e defesa contra ele, apaga-o e transmite os
conhecimentos desse vírus para os sistemas executando o IBM Antivírus, para que seja verificado
antes que consiga ter aprovação para ser executado noutro lugar[16].
Figura 2: Sistema digital imune [16]
A Figura 2 mostra as etapas do funcionamento do sistema digital imune:
9
1. Um programa de monitorização em cada PC utiliza uma diversidade de heurísticas
baseadas no desempenho do sistema, alterações duvidosas nos programas, ou famílias
de rubricas para concluir que um vírus pode estar presente. O programa de monitorização
envia um duplicado de qualquer programa apontado como contaminado para uma máquina
administrativa dentro da organização[16].
2. A máquina administrativa codifica a porção e a encaminha para uma máquina central de
análise de vírus[16].
3. Esta máquina concebe um ambiente em que o programa contaminado pode ser executado
com segurança para analisá-lo. As técnicas utilizadas para esse efeito incluem a
emulação, ou a elaboração de um ambiente defendido dentro do qual um programa que
seja suspeito possa ser executado e monitorizado. A máquina de verificação do vírus
executa então uma tarefa para reconhecer e apagar o vírus[16].
4. A tarefa consequente é encaminha de volta para a máquina administrativa[16].
5. A máquina administrativa remete a tarefa ao cliente contaminado[16].
6. A tarefa também é remetida a outros clientes na organização[16].
7. Os clientes que assinaram no mundo inteiro vão recebendo atualizações regularmente de
antivírus que os defendes contra novos vírus[16].
O exito do sistema digital imune vai depender das competências da máquina da análise do vírus
percebendo constituições novas e inovadoras de vírus. Estar sempre a analisar e monitorizar os
vírus que vão sendo encontrados em campo, deverá ser possível ter o software digital imune
sempre atualizado para que se mantenha preparado para as ameaças[16].
Software de bloqueio de comportamento
Ao contrário dos scanners de heurística ou baseados em impressão digital, o software de bloqueio
de comportamento junta-se ao sistema operativo de um PC e monitoriza a atuação do programa
em tempo real na procura de ações que prejudiquem. O software de bloqueio de comportamento
trava as ações maldosas antes que elas tenham a hipótese de contaminar o sistema. As ações
monitorizadas podem incluir o seguinte:
10
- tentativas de abrir, ver, apagar e/ou alterar ficheiros;
- tentativas de formatar unidades de disco e outras operações de disco que não possam ser
desfeitas;
- alterações na lógica de ficheiros executáveis ou macros;
- alteração de configurações que possam prejudicar o sistema, como configurações de
inicialização:
- scripting de e-mail e clientes de mensagens rápidas para evitar conteúdo executável; e
- inicialização de comunicações em rede[16].
Se o defensor de comportamento perceber que um programa está a iniciar atitudes que sejam
maldosas enquanto é executado, ele pode defender essas atitudes em tempo real e/ou terminar o
software nocivo. Isso dá-lhe uma vantagem crucial em relação a técnicas de localização de
antivírus estabelecidas, como impressão digital e heurística. Apesar de existirem muitas maneiras
distintas de enganar e reorganizar as ações de um vírus ou verme, muitas das quais são evitadas
pela identificação de um scanner de impressão digital ou de heurística, no fim o código maldoso
tem de fazer um pedido bem definido ao sistema operativo. Visto que o defensor de
comportamento pode capturar todos esse pedidos, ele pode descobrir e bloquear ações maldosas
independentemente de como a lógica obscura do programa pareça ser[16].
A competência de verificar o software enquanto ele é executado em tempo real nitidamente
certifica um grande proveito ao defensor de comportamento, porém, ele também possui
desvantagens. Como o código maldoso necessita ser executado na máquina de destino antes que
todos as suas ações possam ser distinguidos, ele pode provocar muitos estragos ao sistema
antes que seja descoberto e intercetado pelo sistema de bloqueio de comportamento. Por
exemplo, um novo vírus pode confundir variados ficheiros aparentemente não importantes pelo
disco rígido antes de contaminar um único ficheiro e ser impedido. Embora a contaminação real
seja impedida, o utilizador poderá ser impedido de encontrar os seus ficheiros, sendo a causa
duma perda na eficácia ou, eventualmente, algo pior[16].
11
2.2.4 Funções Criptográficas de Resumo
A função H, presente na fórmula seguinte, retorna o valor de hash h, para uma determinada
menagem M:
h=H (M )
M é uma mensagem que pode variar de tamanho, já h, que é igual a
H (M ) é um valor de
tamanho fixo. O valor de hash é acrescentado à mensagem original, no momento em que a
mensagem é classificada ou aprovada como sendo correta. O recetor valida a mensagem
voltando a calcular o valor de hash [16].
Irá começar-se por examinar os requisitos para uma função de hash que vai ser usada para
autenticar a mensagem. Como as funções de hash regularmente são complexas, é proveitoso
analisar algumas funções de hash simples. Depois, vamos ver as várias aproximações para o
projecto da função de hash[16].
Requisitos para uma função de hash
O objetivo de uma função de hash é produzir uma 'impressão digital' de um ficheiro, mensagem ou
outro bloco de dados. Para ser proveitoso para o reconhecimento de uma mensagem, uma função
de hash H tem de ter as seguintes propriedades(adaptadas da lista em [11]):
1. H pode ser aplicado a um bloco de dados seja qual for o tamanho.
2. H gera uma resposta que tem tamanho constante.
3. H(x) é simples de calcular para cada x, o que torna as execuções de hardware e software
práticas.
4. Seja qual for o valor de x dado, é computacionalmente impossível descobrir x tal que H(x)
= h. Isso às vezes é chamado na literatura como resistência à primeira inversão ou
propriedade unidireccional (one-way property).
5. Seja qual for o bloco dado x, é computacionalmente impossível descobrir x≠ y tal que
12
H ( y )=H (x ) . Isso às vezes é chamado como resistência à segunda inversão ou
resistência fraca a colisões (weak collision resistance).
6. É computacionalmente impossível descobrir seja qual for o par
(x , y )
tal que
H (x)=H ( y ) . Isso às vezes é denominado como resistência a colisões ou
resistência forte a colisões (strong collision resistence)[16].
As primeiras três propriedades são requisitos para a utilização prática de uma função de hash
para o reconhecimento da mensagem[16].
A quarta propriedade, a resistência à primeira inversão, confirma que é acessível gerar um código
dando uma mensagem, mas é praticamente improvável fazer o contrário que é gerar uma
mensagem dando uma código. Esta propriedade é útil se a técnica de reconhecimento fizer
utilização de um valor secreto. O próprio valor secreto não é encaminhado, no entanto, se a
função de hash não for unidireccional, um invasor pode sem grande dificuldade encontrar o valor
secreto: se o invasor poder analisar ou interromper uma transmissão, pode ter acesso à
mensagem M e ao código de hash
hash para ter
obter
C=H ( S AB∥M ) . O invasor, assim, inverte a função de
S AB∥M =H −1 (C) , como o invasor já tem o M e
S AB∥M , é um assunto simples
S AB [16].
A quinta propriedade assegura que dada uma mensagem, não se pode encontrar uma mensagem
alternativa que obtenha o mesmo valor de hash. Esse objeto evita a burla quando um valor de
hash codificado for utilizado. Para estes casos, o opositor pode ler a mensagem e, assim sendo,
criar seu código de hash. Mas, como o opositor não possui a chave secreta, ele não poderá ser
capaz de modificar a mensagem sem ser apanhado. Se essa propriedade não fosse verdadeira,
um invasor seria capaz de acabar a seguinte sequência: primeiro analisar ou interromper uma
mensagem mais o seu valor de hash codificado; segundo, criar um valor de hash não codificado a
partir da mensagem; terceiro criar uma mensagem alternativa com o mesmo valor de hash[16].
A sexta propriedade diz respeito à resistência da função de hash a um tipo de ataque descoberto
como o ataque de aniversário (birthday attack), que será examinado mais à frente[16].
Funções de hash simples
Todas as funções de hash actuam utilizando os seguintes princípios gerais. O input (mensagem,
13
ficheiro, etc.) é olhada como uma sequência de blocos de n bits. No input é executado um bloco
de cada vez, num padrão repetido para gerar uma função de hash de n bits[16].
Uma das funções de hash mais simples é o OU exclusivo (XOR) bit a bit de cada bloco. Pode ser
expressado da seguinte forma:
Ci =bi 1 ' +' bi 2 '+' ... ' +' b ℑ
onde
Ci =i−ésimo bit do valor de hash , 1⩽i⩽n
m=número de blocos de nbits na entrada
bij =i−ésimo bit no j−ésimo bloco
= operação XOR
Esta formula cria uma semelhança simples para cada posicionamento do bit e é conhecida como
uma verificação de redundância longitudinal. Ela é regularmente eficaz para dados incertos, como
uma pesquisa de integridade de dados. Cada valor de hash de n bits é também da mesma
maneira comprovável. Assim, a hipótese de que um erro de dados ocorra num valor de hash que
não pode ser alterado é
−n
2
. Com dados editados, a função é menos eficaz porque é mais
previsível. Por exemplo, na maioria dos ficheiros de texto normais, o bit com mais significado de
cada octeto é sempre o zero. Assim, quando um valor de hash de 128 bits for utilizado, em vez de
uma eficiência de
−112
2
−128
2
, a função de hash desse tipo de dados apresenta uma eficiência de
[16].
Uma maneira simples de aperfeiçoar as coisas é dar-se um deslocamento (shift) circular de um
bit, ou rotação, sobre o valor de hash a seguir a cada bloco ser processado. O processo pode ser
resumido da seguinte forma:
1- No início, fixe o valor de hash de n bits como zero.
2- Verifique cada bloco progressivamente de n bits de dados da seguinte forma:
a. Faça uma rotação do valor de hash actual para a esquerda num bit.
b. Execute o OU EXCLUSIVO (XOR) do bloco com o valor de hash.
Isso tem a consequência de tornar imprevisto o input de forma mais completa e desviar qualquer
regularidade que apareça no input. A Figura 3 mostra esses dois tipos de funções de hash para
valores de hash de 16 bits[16].
Embora o segundo processo oferece uma boa medida de integridade de dados, ele é
praticamente ineficaz para estabilidade dos dados quando um código de hash codificado é
utilizado com um mensagem de texto claro. Dada uma mensagem, é uma assunto fácil de gerar
14
uma nova mensagem que produza aquele código de hash: prepare a mensagem pretendida e,
depois, junte um bloco de n bits que faça com que a nova mensagem e o bloco produzam o
código de hash pretendido[16].
Embora um XOR simples ou XOR com rotação (RXOR) seja incapaz se somente o código de
hash estiver codificado, ainda dá a impressão de que essa função pode ser utilizável quando a
mensagem e o código estiverem codificados, mas é preciso ter algum cuidado. Uma técnica que
originalmente foi proposta pelo National Bureu of Standards utilizava o XOR simples, usado em
blocos de 64 bits da mensagem e depois, uma codificação da mensagem completa, que utilizava
o modo de encadeamento de cifra de bloco (CBC). Podemos definir o esqueleto da seguinte
forma: data uma mensagem baseada numa ordem de blocos de 64 bits
X 1, X 2, ... , X N , declare o
código de hash C como o XOR bloco a bloco de todos os blocos e junte o código de hash como o
bloco final[16]:
C=X N +1= X 1 '+ ' X 2 ' +' ... ' +' X N
Figura 3: Duas funções de hash simples [16]
15
Após, codifique a mensagem completa, mais o código de hash, utilizando o modo CBC para gerar
a mensagem codificada
X 1, X 2, ... , X N . Em [4] indica muitos modos através das quais o texto
codificado dessa mensagem pode ser trabalhado de maneira que não seja descoberto pelo código
hash. Por exemplo, pela descrição do CBC, temos
X 1=IV ' +' D( K , Y 1)
X i=Y i−1' +' D(K , Y i)
X N +1=Y N '+' D ( K ,Y N +1)
Mas
X N +1 é o código de hash[16]:
X N +1= X 1 ' + ' X 2 '+' ... ' +' X N
X N +1=[IV ' +' D(K , Y 1)]'+ '[Y 1 ' +' D(K , Y 2)]' +' ... '+' [Y N −1 ' +' D( K , Y N )]
Como na equação anterior podemos fazer o OU Exclusivo dos termos sem nos importarmos com
a ordem, avança-se para o código de hash que não se altera se os blocos de texto codificado
fossem trocados[16].
Ataques de aniversário
Pressupor que código de hash de 64 bits seja usado. Pode considerar-se que isso é
suficientemente seguro. Por exemplo, se um código hash codificado C for enviado com a
mensagem não codificada representante M, então um opositor necessita achar M' tal que
H ( M ' )= H ( M ) para trocar outra mensagem e burlar o receptor. Em média, o opositor tem
de estar mais ou menos
263 mensagens para achar uma que acorda-se com o código de hash
da mensagem interrompida[16].
Contudo, um ataque alterado é realizável, com base no paradoxo do aniversário. Yuval sugeriu a
16
estratégia seguinte [15][16]:
1. O início, A, é colocado para 'rubricar' uma mensagem juntando o código de hash adequado
de m bits e codificado esse código de hash com chave privada de A.
2. O opositor produz
2
(m /2 )
variedades sobre a mensagem, todas conduzindo um sentido
semelhante. O opositor arranja um número semelhante de mensagens, todas as
variedades da mensagem burlista a ser trocada pela mensagem real.
3. Os dois blocos de mensagens são confrontados para descobrir um par de mensagens que
gere o mesmo código hash. A probabilidade de êxito, pelo paradoxo do aniversário, é
maior do que 0,5. Se nenhuma acordo for descoberto, mensagens válidas e burladas
adicionais serão criadas até que seja descoberto um acordo.
4. O opositor concede a variedade a A para firma. Essa firma pode então ser junta à
variedade burlista para entregar ao destinatário. Como as duas variedades tem o mesmo
código hash, elas geram a mesma firma; o opositor tem garantias de êxito, embora a
chave de criptografia não seja publicada[16].
Assim, se um código de hash de 64 bits for utilizado, a proporção de empenho requisitado será
apenas na ordem
2
32
[16].
17
Figura 4: Uma carta com 2^37 variações[2]
A produção de muitas variedades que comunicam o mesmo sentido não é árduo. Por exemplo, o
opositor poderia introduzir uma sucessão de pares de caracteres 'espaço-espaço-backspace'
entre as palavras em todo o documento. As variedades poderiam ser produzidas permutar
'espaço-espaço-backspace' nas instâncias escolhidas. Como opção, o opositor poderia
unicamente reformular a mensagem, mas conservar o sentido. A Figura 4 [2] contém um
exemplo[16].
O desfecho a ser extraído disso é que o comprimento do código de hash deve ser
fundamental[16].
18
Técnicas de encadeamento em bloco
Diversificadas ofertas foram feitas para funções de hash baseadas na utilização de uma técnica
de encadeamento de cifra de blocos, mas sem a chave secreta. Uma das primeiras ofertas foi a
de Rabin [12]. Separe uma mensagem M em blocos de comprimento fixo
M 1, M 2,. .. , M N e utilize
um sistema de criptografia simétrica, como DES, para estimar o código de hash G da seguinte
forma[16]:
H 0=valor inicial
H i=E( M i , H i−1)
G=H N
Isso é idêntico à técnica CBC, mas, nesse caso, não existe chave secreta. Assim como em
nenhum código de hash, esse diagrama está sujeito ao ataque de aniversário, e se o algoritmo de
criptografia for DES e se somente um código de hash de 64 bits for gerado, então o sistema
estará frágil[16].
Além disso, outra variante do ataque de aniversário pode ser utilizada, mesmo que o opositor
tenha acesso somente a uma mensagem e sua rubrica válida, e não possa conseguir diversas
rubricas. Eis, o cenário, vamos considerar que o opositor interrompe uma mensagem com uma
rubrica na forma de um código de hash codificado e que o código de hash não codificado tem m
bits de tamanho:
1. Utilize um algoritmo marcado no começo desta subsecção para estimar o código de hash
não codificado G.
2. Construa a mensagem que desejar na forma
3. Estime
4. Crie
Q1, Q2, ..., Q N −2 .
H i=E(Qi , H i−1) para 1⩽i⩽(N −2) .
2(m /2 ) blocos incertos; para cada bloco X, estime
blocos incertos adicionais; para cada bloco Y, estime
E( X , H N −2) . Crie
2(m /2 )
D(Y , G) , onde D é a função de
criptografia correspondente a E.
19
5. Com base no paradoxo do aniversário, vai haver probabilidade alta de um X e Y tais que
E( X , H N −2)=D (Y ,G) .
6. Faça a mensagem
Q1, Q2, ..., Q(N−2) , X , Y . Essa mensagem tem o código de hash G e,
consequentemente, pode ser utilizada com a rubrica codificada interrompida[16].
Essa forma de ataque é chamada como ataque meet-in-the-middle. Diferentes investigadores
recomendaram melhorias com o propósito de fortificar a técnica básica de encadeamento de
blocos. Por exemplo, Davies e Price [2] relatarem a seguinte variação:
H i=E( M i , H (i−1) )' +' H (i−1)
Outra variação, proposta em [7][16].
H i=E( H (i−1) , M i )' +' M i
Entretanto, esses dois diagramas têm se revelado frágeis a uma série de ataques [9]. De um
modo geral, pode-se provar que alguma forma de ataque de aniversário terá êxito contra qualquer
diagrama de hash abrangendo a utilização do encadeamento de cifra de blocos sem uma chave
secreta, desde que o código de hash derivado seja bastante pequeno (por exemplo, 64 bits ou
menos) ou que um código de hash maior possa se partir em sub-códigos autónomos [3][16].
Igualmente, é necessário ter precaução à invenção de outras técnicas para o hash. Muitas delas
tem pontos fracos [8][16].
2.3 – NSRL
A National Software Reference Library (NSRL) providencia um armazenamento de software
conhecido, perfis de ficheiros, valores de hash de ficheiros para uso das aplicações da lei e outras
organizações com investigações forenses de computador. A NSRL é composta por 3 grandes
elementos [27]:
1- Uma biblioteca física de pacotes comerciais de software.
2- Uma base de dados de informação sobre cada ficheiro dentro de cada pacote de software.
20
3- Uma base de dados mais pequena sobre a informação que é mais amplamente utilizada e
que é actualizada e divulgada trimestralmente. A base de dados é chamada de NSRL Reference
Data Set (RDS) e é NIST Special Database #28 [17].
O projecto NSRL foi iniciado em 1999 a pedido do FBI, do DoD Cyber Crime Center e do National
Institute of Justice. Este projecto é uma parte do programa de ciências forenses no escritório da
NIST de normas de aplicação da lei. A primeira divulgação da NSRL RDS foi em 2001 [27].
Em Fevereiro de 2006, a NSRL consiste em mais de 7083 milhões de pacotes de aplicação de
software que incluem mais de 34 milhões de ficheiros. Como muitos dos ficheiros são usados
dentro de múltiplas aplicações, há muitos ficheiros duplicados dentro da NSRL. Actualmente, há
mais de 10 milhões de ficheiros únicos [27].
Durante uma investigação forense, centenas de milhares de ficheiros podem ser encontrados. O
NSRL é usado para identificar ficheiros conhecidos. Isto pode reduzir a quantidade de tempo na
análise de um computador. Correspondências para ficheiros do sistema operativo comum ou
aplicações que não precisam de ser procuradas, quer manual ou electronicamente, para
evidências. Por exemplo, se o examinador forense estivesse à procura de imagens num sistema
Microsoft Windows 2000, uma comparação contra o NSRL identificaria mais de 4000 ficheiros de
imagem que provém da normal instalação do Windows. Estes ficheiros específicos poderiam ser
excluídos de análises futuras, como o conteúdo é conhecido, e não contém evidências [27].
Adicionalmente, algumas das equivalências do NSRL são usadas para determinar quais
aplicações de software foram usadas num sistema. Isto pode fornecer informação para o
investigador determinar como e onde procurar por provas. Por exemplo, se um sistema operativo
contém aplicações para descobrir palavras passe, logins, ou pacotes de rootkit, isto pode levar a
investigações futuras para determinar se um sistema foi utilizado para piratear dentro de outros
sistemas operativos. Este tipo de correspondência pode também ser usado, para resolver uma
questão de propriedade intelectual se um sistema contivesse um sistema proprietário para o qual
o dono do sistema não tinha licença [27].
21
NSRL valores de hash de ficheiros
O NSRL usa uma técnica matemática denominada hashing para produzir valores de hash
ficheiros. Actualmente, o NSRL usa 3 métodos para criar valores de hash: 2 são algoritmos
criptográficos de hash e 1 é uma técnica de procura de erros intitulado verificação de redundância
cíclica (CRC) [18]. É importante notar que há limites conhecidos no uso de CRC para gerar
valores de hash de ficheiros e os valores de hash CRC dentro do NSRL não são únicas, dado que
o mesmo tipo de assinatura pode ser associado a mais de um ficheiro [27].
Algoritmos de hash começam por pegar num input, neste caso um ficheiro, e usar matemática
avançada para comprimi-lo para uma cadeia de comprimento fixo de zeros e uns. Os algoritmos
criptográficos específicos de hash usados para criar valores de hash de ficheiros são funções num
sentido: um input dado vai sempre produzir o mesmo output e o processo não pode ser revertido.
O output é chamado hash e, no contexto do NSRL, é referido como valores de hash de
ficheiro[27].
Uma importante propriedade exibida por estes tipos de algoritmos de hash é que os seus outputs
são distribuídos ao acaso através do alcance inteiro dos possíveis outputs. Esta propriedade
explica porque funções de hash num sentido são usadas frequentemente como blocos de
construção de geradores de números aleatórios [19][20][27].
Estes algoritmos específicos de hash usados pela NSRL para gerar valores de hash de ficheiros
são MD5 e SHA-1. O MD5 é um algoritmo de hash mais velho e é definido pela Internet
Engineering Task Force, Request for Comment 1321 [22]. O SHA-1 é um Federal Information
Processing Standard (FIPS) premulgado pelo NIST como FIPS PUB 180-4 47. A terceira técnica é
uma versão de 32 bit do CRC método de procura de erros, como definido por [21]. Tanto o MD5
como o SHA-1 são algoritmos criptográficos de hash [27].
NIST está a planear acrescentar ficheiros de assinatura adicionais gerados por outros algoritmos
de hash no futuro, incluindo aqueles identificados em FIPS PUB 180-4(SHA-256, SHA-384, SHA512) [23][27].
2.3.1 – NSRLLOOKUP
O NSRLLOOKUP é um combinado entre um cliente (NSRLLOOKUP) e um servidor (NSRLSVR)
22
que permite utilizar a base de dados NSRL RDS. O NSRLSVR permite montar um servidor que
vai procurar numa base de dados por um certo valor de resumo (hash), se encontrar esse valor
significa que o ficheiro já é conhecido. Uma das particularidades do servidor NSRLSVR é que
carrega para a memória RAM toda a base de dados de resumos do NSRL RDS. O NSRLLOOKUP
é um programa que os analistas forenses usam para interagir com o servidor (NSRLSVR), foi
desenhado para ser utilizado pela linha de comandos em combinação com aplicações que
calculem resumos criptográficos a ficheiros de forma recursiva. Para calcular resumos
criptográficos, o programador do NSRLLOOKUP recomenda a aplicação de resumos
criptográficos md5deep, que é uma aplicação que calcula resumos criptográficos md5. Uma das
particularidades do NSRLLOOKUP é mostrar apenas os resumos dos ficheiros que não formam
encontrados na base de dados [24].
Com este capítulo deve reter-se que: uma assinatura de ficheiro é um número de identificação
único, localizado no início de um ficheiro que identifica o tipo de ficheiro, dando informações sobre
os dados contidos no ficheiro real; que as pessoas devem-se prevenir contra os vírus, detectando,
identificando e removendo os vírus que é a técnica mais fácil para o utilizador usar; o NSRL
providencia um armazenamento de software conhecido, perfis de ficheiros, assinatura de ficheiros
para uso das aplicações da lei e outras organizações com investigações forenses de computador
e por fim que o NSRLLOOKUP é um combinado entre um cliente (NSRLLOOKUP) e um servidor
(NSRLSVR) que permite usar a base de dados NSRL RDS.
23
3 – Desenvolvimento do NSRLSVR-BD
No contexto da análise forense digital a discos rígidos, ou imagens bit-a-bit destes, é normal que
se encontrem milhares e milhares de ficheiros. Uma técnica possível para limitar a quantidade de
ficheiros a analisar pelo técnico forense é a de fazer resumos (ou hash) dos vários ficheiros em
MD5 ou SHA1 e de os guardar numa BD.
Já existe uma aplicação servidor que armazena os vários resumos e que permite a sua consulta.
Todavia, esta aplicação guarda a BD em memória RAM, que conta já com 30 GBS, tal restringe a
sua utilização, pois poucos são os computadores existentes com esse tamanho de memória RAM.
O projecto reside na criação duma nova versão desta aplicação open source (um fork) que utilize
um sistema de gestão de bases de dados em detrimento da memória RAM, possibilitando assim a
sua utilização em equipamentos com pouca memória RAM.
3.1 – Requisitos
Este sub-capítulo envolve o levantamentos de requisitos para a criação da base de dados, e todos
os requisitos que a aplicação original tem visto ser uma réplica da original. O NRSL tem um
software que calcula a assinatura de ficheiros ou hash para cada ficheiro e outras informações
descritivas sobre cada ficheiro que são armazenados no NRSL RDS.
Foram identificados os seguintes requisitos neste projecto:
1. Armazenamento de dados na base de dados: como O NRSL RDS tem a sua estrutura para
armazenar os dados, vai ser criada uma estrutura com base nessa para a elaboração da
base de dados para termos a maior compatibilidade de dados possível.
2. Reconhecer os mesmos ficheiros que a aplicação original: a aplicação desenvolvida tem
que conhecer os mesmos hash que a aplicação original.
3. Usar o mesmo protocolo de comunicação: como a aplicação original comunica com uma
aplicação cliente já existente e como a aplicação desenvolvida é uma replica tem de
comunicar da mesma maneira que a original.
24
4. Multi-plataforma: a aplicação desenvolvida pode ser utilizada em vários sistemas
operativos.
3.2 – Modelo Conceptual e Relacional
Modelo Conceptual
Figura 5: Modelo Conceptual
Na Figura 5 temos o modelo conceptual da base de dados, cada retângulo significa uma tabela da
base de dados e nome dentro do retângulo significa o nome da tabela na base de dados, agora
explicaremos como se lê o relacionamento entre as relações que se lê da seguinte maneira, o
número 1 junto à tabela lê-se um e o n junto à tabela lê-se muitos, o que significa que um
ProductRecord pode ter muitos FileRecord, os outros como são iguais leêm-se da mesma maneira
de 1 para n.
Modelo Relacional
Depois de ter sido feito o modelo conceptual, foi feito o mapeamento do diagrama entidaderelacional (DER) para o modelo relacional. Como o NRSL RDS já tinha uma estrutura de uma
base de dados, foi usada essa estrutura para fazer o modelo relacional, não se precisou de
normalizar as tabelas na criação do modelo relacional da base de dados porque já estavam
normalizadas.
Na Figura 6, eis o diagrama do modelo relacional da base de dados que foi construída para a
25
nova aplicação, agora vai ser explicado que o sublinhado indica a chave primária da relação e que
os pontos negros indicam que os atributos da tabela não podem ser nulos, os pontos brancos
indicam que podem ser nulos e que as chaves estrangeiras são os mesmos nomes que são chave
primária noutra tabela. A ligação entre as tabelas, a linha que liga as duas tabelas contem 1 e n
para representar que 1 linha da tabela pode estar ligada a várias linhas da outra tabela.
Figura 6: Modelo Relacional
3.3 – Protótipo da aplicação
Como foi descrito anteriormente, neste projecto só vai ser elaborado a aplicação do lado do
servidor, a aplicação do lado cliente vai se manter a mesma por isso antes de a aplicação ser
elaborada vai ser demonstrado como a aplicação anterior usava o seu protocolo de comunicação
para comunicar com a aplicação cliente visto que só a aplicação do servidor é que vai ser
replicada.
Na Figura 7, para se iniciar a comunicação com o servidor, o cliente envia a versão da aplicação
para o servidor saber as funcionalidades que tem acesso e responder consoante essa versão.
Depois de o servidor validar a versão o cliente vai lhe enviar a mensagem iniciada por “query”
mais todos os hashes que o servidor vai verificar se existe na base de dados. Quando o servidor
verificar todos os hashes vai enviar uma mensagem ao cliente começado por “OK” mais um
número binário que representa se os hashes existem ou não na base de dados, isto é, cada
26
número vai representar um hash, 0 se não existe e 1 se existe. Depois de receber a mensagem o
cliente manda a mensagem “BYE” para o servidor para cancelar a comunicação. Quando o cliente
se desconecta do servidor mostra na linha de comandos, visto que o cliente e o servidor são
comandos
executados no terminal, os hashes e os respectivos caminhos dos ficheiros que não
existem na base de dados.
Figura 7: Comunicação Cliente-Servidor
Protótipo inicial
A aplicação original foi estudada usando-se o Wireshark para se perceber como funcionava o
protocolo entre o cliente e o servidor, analisou-se as suas funcionalidades e as versões de
comunicação com o cliente (2 versões) percebendo o código fonte da aplicação cliente. Apenas foi
implementado o protocolo de comunicação mais actual, já que não foi necessário assegurar a
retro-compatibilidade.
A aplicação agora desenvolvida utiliza um ficheiro de configuração que contém o IP do
computador onde está a base de dados, o nome da base de dados, o utilizador e password para
aceder à base de dados e o caminho da estrutura da base de dados. A Tabela 2 apresenta um
exemplo de ficheiro de configuração.
27
ip=127.0.0.1
bd_name=db_Forence
user=root
pass=
caminho_estrutura=./bd_estrutura/db.sql
Tabela 2: Exemplo do ficheiro conf
Também foi criado um ficheiro SQL que contem a estrutura da base de dados que será criada
caso não exista uma base de dados com o nome contido no ficheiro de configuração. A Tabela 3
apresenta um exemplo da estrutura que o ficheiro SQL contém para a criação da base de dados.
CREATE TABLE VersionRecord (
SHA1 varchar(40) NOT NULL,
RDSVersion varchar(40) NOT NULL,
PRIMARY KEY (SHA1) );
Tabela 3: Exemplo da estrutura da base de dados
A primeira funcionalidade que foi elaborada foi uma funcionalidade que não existe na aplicação
original devido ao facto da aplicação original carregar os dados que estão num ficheiro txt para a
memória RAM e assim a aplicação usa os dados que estão na memória RAM para verificar se
existe as hashes que lhe são passadas, no caso que está a ser desenvolvido vai ser carregados
os dados existentes nesse ficheiro txt para a base de dados já criada.
Na Tabela 4 será mostrado um exemplo de um comando para carregar dados de um ficheiro txt
para a base de dados.
java -jar nsrlsvr-bd.jar -u ProductRecord /home/fabio/NetBeansProjects/nsrlsvrbd/dist/NSRLProd.txt
Tabela 4: Exemplo de inserção na base de dados
Como mostra na Tabela 4 o comando para inserir os dados na base de dados caso não existam
esses dados. Vamos passar agora a explicar o funcionamento desse comando. Este comando
recebe como parâmetros 3 elementos, o primeiro é “-u” que indica à aplicação que é para inserir
os dados, o segundo que neste caso é “ProductRecord” indica o nome da tabela da base de
dados que queremos inserir visto que existe 4 ficheiros com dados para inserir, temos que fazer
este comando mais 3 vezes para preencher as tabelas FileRecord, ManufacturerRecord e
OperatingSystemRecord da base de dados e por fim temos o terceiro parâmetro que é
“/home/fabio/NetBeansProjects/nsrlsvr-bd/dist/NSRLProd.txt”que indica o caminho do ficheiro com
28
os dados para a inserção.
Para o desenvolvimento desta funcionalidade foi preciso criar algumas classes nomeadamente a
classe new FicheiroConf que permite ler os dados do ficheiro conf descrito anteriormente, a classe
new FicheiroSQL que permite ler a estrutura da base de dados também descrita anteriormente, a
classe new Conecao que vai permitira ligação à base de dados e criar a base de dados caso esta
não exista, uma classe para cada tabela com os mesmos atributos da tabela da base de dados e
classes especificas para aceder a cada uma das tabelas da base de dados.
1 public void adicionarProduct(ProductRecord pr) throws SQLException,
2 ClassNotFoundException, 2IOException, FileException {
3
try {
4
abrirConecao();
5
boolean existe;
6
String sql = "INSERT INTO ProductRecord (ProductCode, ProductName, "
7
+ "ProductVersion, OpSystemCode, MfgCode, Language, ApplicationType)"
8
+ "VALUES(?,?,?,?,?,?,?)";
9
10
existe = verificarExiste(pr.getProductCode(), pr.getOpSystemCode(), pr.getMfgCode());
11
12
if (existe == false) {
13
PreparedStatement stmt = conecao.getConnection().prepareStatement(sql);
14
stmt.setInt(1, pr.getProductCode());
15
stmt.setString(2, pr.getProductName());
16
stmt.setString(3, pr.getProductVersion());
17
stmt.setString(4, pr.getOpSystemCode());
18
stmt.setString(5, pr.getMfgCode());
19
stmt.setString(6, pr.getLanguage());
20
stmt.setString(7, pr.getApplicationType());
21
stmt.execute();
22
stmt.close();
23
}
24
fecharConecao();
25
} catch (SQLException e) {
26
throw new SQLException("Aconteceu um erro na inserção!");
27
}
28 }
Tabela 5: Exemplo de Código de inserção de dados
Na Figura 5, tem-se um exemplo de como a aplicação insere dados na base de dados, passamos
à sua explicação, primeiro começa por fazer a ligação a base de dados, a seguir verifica se esses
dados já existem (linha 10), se já existirem apenas fecha a ligação senão vai preparar os dados
29
para serem inseridos na base de dados
Outra funcionalidade que foi elaborada foi a funcionalidade de ajuda que mostra todos os
comandos que a aplicação tem e uma pequena inserção de como se usa esses comandos. Na
Tabela 6 será mostrado a utilização do comando de ajuda e na Tabela 7 será mostrada o output
do comando de ajuda mostrando todas as funcionalidades da aplicação.
java -jar nsrlsvr-bd.jar -h
Tabela 6: comando de ajuda
-h : mostar parametros
-S : iniciar servidor
-u Nome_Tabela Caminho_Arquivo: atualização da tabela da base de dados
Tabela 7: funcionalidades existentes na aplicação
E por fim teremos a última funcionalidade implementada nesta aplicação. Nesta
funcionalidade será mostrado como esta aplicação comunicará com a aplicação do
cliente. Primeiro será mostrado o comando para utilizar esta funcionalidade de depois
será mostrado como comunica e explicado como foi desenvolvida.
Na Tabela 8 mostra a utilização do comando para iniciar o servidor e ficar a espera que a
aplicação cliente se conecte.
java -jar nsrlsvr-bd.jar -S
Tabela 8: comando para iniciar o servidor
Nesta funcionalidade tiveram de ser criadas 3 classes para o seu desenvolvimento que
são elas a classe new Protocol onde se encontra o protocolo de comunicação com a
aplicação cliente, a classe new Server que inicia o servidor para estar a espera que o
cliente se conecte e por fim a classe new ServerThread que corre o protocolo quando um
cliente se conecta.
Agora será mostrado como esta aplicação comunica, como está a ser desenvolvido uma
aplicação que já existe não será preciso explicar muito o funcionamento desta
funcionalidade porque já foi explicado no início deste sub-capítulo como funciona a esta
funcionalidade da aplicação original e como esta aplicação tem de usar a mesma
30
aplicação cliente, por isso tem de usar o mesmo protocolo de comunicação que a
aplicação original.
Depois de mostrar como a aplicação comunica com a aplicação cliente, será apresentado
um trecho de código com o protocolo que esta aplicação usa para comunicar com a
aplicação cliente. Na 9 Tabela será mostrada o trecho do protocolo de comunicação com
a aplicação cliente.
31
1 public String processInput(String theInput) throws FileNotFoundException, IOException,
2 SQLException, ClassNotFoundException, FileException {
3
4
if (state == WAITING) {
5
theOutput = "Welcome to the server online Forence system";
6
state = VERSION;
7
} else {
8
if (state == VERSION) {
9
String parts[] = theInput.split(":");
10
11
if (parts[0].equals("Version")) {
12
if (parts[1].equals(" 2.0")) {
13
theOutput = "OK";
14
state = QUERY;
15
} else {
16
theOutput = "NOT OK";
17
}
18
} else {
19
theOutput = "NOT OK";
20
}
21
} else {
22
if (state == QUERY) {
23
String parts[] = theInput.split(" ");
24
String data = null;
25
boolean encontrado;
26
27
theOutput="";
28
if (parts[0].equals("query")) {
29
if (parts.length == 1) {
30
theOutput = "NOT OK";
31
} else {
32
for (int index = 1; index < parts.length; index++) {
33
encontrado=false;
34
35
if (!ishexdigest(parts[index])) {
36
theOutput = "NOT OK";
37
}
38
encontrado=fR.procurarHashExiste(parts[index]);
39
40
if(encontrado){
41
theOutput+="1";
42
}else{
43
theOutput+="0";
44
}
45
}
46
theOutput="OK " + theOutput;
47
}
48
}
49
}
50
}
32
51
52
53
}
return theOutput;
}
Tabela 9: protocolo de comunicação com cliente
Na Tabela 9, para se iniciar a comunicação o protocolo tem de passar do estado
“WAITING” para o estado “VERSION”, só depois é que realmente começa a comunicação.
Ao receber a primeira mensagem do cliente o servidor vai verificar-se a versão do cliente
é “2.0” porque esta aplicação só clientes nessa versão. Estando nesta versão a aplicação
passa ao estado “QUERY” onde o cliente manda uma mensagem “query” seguido de
todas as hash para analisar, depois de verificar que a mensagem do cliente está bem
construída vai analisar hash a hash e adicionar “0” se não encontrou essa hash ou “1” se
encontrou essa hash há mensagem que vai responder ao cliente. Com a mensagem
completa o servidor envia a mensagem ao cliente e este envia a mensagem “BYE” para
se desconectar do servidor e por fim descarta os que estiverem a “1” da mensagem e só
mostra no terminal os que estiverem a “0”.
Com este capítulo deve reter-se como funciona a aplicação e também os comandos
necessários ao funcionamento da aplicação que são: java -jar nsrlsvr-bd.jar -h para
mostrar as funcionalidade, java -jar nsrlsvr-bd.jar -S para iniciar a aplicação e por fim java
-jar nsrlsvr-bd.jar -u Nome_Tabela Caminho_Ficheiro para carregar os dados para a base
de dados.
33
4 – Avaliação da aplicação
Neste capítulo serão tratados os resultados que se obteve com a utilização da aplicação
desenvolvida e também com a utilização da aplicação original para fazer a comparação das
aplicações e também a metodologia utilizada para a avaliação dos resultados.
Depois de concluída a aplicação será preciso carregar os dados para a base de dados porque
enquanto os dados não forem carregados para aplicação não poderá ser utilizada para a
comparação com a original.
Nesta secção vai ser descrita a metodologia utilizada durante o desenvolvimento deste projecto.
Para um melhor desenvolvimento do projecto, este foi desenvolvido em 3 fases.
Numa primeira fase foram feitas as seguintes actividades: levantamento de requisitos, elaboração
do modelo conceptual, conversão do modelo conceptual para o modelo relacional e escolha do
sistema de gestão de base de dados e implementação da base de dados. Na segunda só se
elaborou uma tarefa que foi elaboração da aplicação e na terceira e última fase foram executados
testes para serem realizados na aplicação.
4.1 – Carregar dados para base de dados
Começou-se por carregar todos os dados para a base de dados, mas logo se percebeu que ao
carregar todos os dados para a base de dados iríamos ter hashes repetidas devia ao facto de
existir o mesmo ficheiro para vários sistemas operativos, o que tornaria a consulta a esses dados
mais lenta e como não vai ser preciso ter esses dados todos visto que a aplicação do cliente só
lhe interessa os hashes e não outras características como o nome do ficheiro, a versão do sistema
operativo entre outras. Com isso foi optado em reduzir os dados para só ter na base de dados
hashes únicos, isto é, não ter hashes repetidos na base de dados.
Na Tabela 10 será mostrado uma parte de um ficheiro txt que contém dados para serem
carregados para a base de dados.
34
1 "MfgCode","MfgName"
2 "1","321 Studios"
3 "10","ADS Tech"
4 "100","Avantos"
5 "1000","Typeright Software"
6 "1001","UBI Soft Entertainment"
7 "1002","US Robotics"
8 "1003","Ubisoft"
9 "1004","Ulead Systems"
10 "1005","University"
11 "1006","Unknown"
12 "1007","Unreal Visions"
13 "1008","V Communications Inc."
14 "1009","VCR Inc."
15 "101","Avery Software"
16 ...
Tabela 10: Exemplo de um ficheiro para carregar dados base de dados
No exemplo que está na Tabela 10 podemos observar como os dados vêem para ser carregados
para a base de dados e também como vem os outros ficheiros que temos que carregar. Como foi
utilizado a estrutura da base de dados da aplicação original para guardarmos os dados, demorou
algum tempo a introduzir todos estes dados na base de dados por causa que são 4 tabelas que
tem que ser preenchidas, isto equivale a 4 ficheiros. Embora a aplicação não use todos estes
dados porque só lhe interessa o ficheiro onde está os hashes, que é o ficheiro que contem mais
dados e é o ficheiro que a aplicação original carrega para memória RAM.
Antes de os dados serem carregados foi feito um script para auxiliar no carregamento dos dados
para a base de dados, nesse script também mede o tempo que cada ficheiro demorou a ser
carregado para a base de dados, visto que o ficheiro que contém os hashes contém muitos dados.
Para isso o ficheiro, já vem partido em 4 ficheiros, mas mesmo assim torna-se muito custoso para
um computador carregar esses damos por isso cada um desses ficheiros foram partidos em
300.000 linhas dando há volta de 103 ficheiros, o que equivale a carregar só para a tabela
Filerecord 412 ficheiros, faltando as outras serem carregadas.
Na Tabela 11 será mostrado um exemplo de um script utilizado para o auxilio da introdução,
medição do tempo que demorou a ser introduzido que regista isso tudo num ficheiro de logs.
35
1 #!/bin/bash
2 for file in /home/fabio/NetBeansProjects/nsrlsvr-bd/InputBDT1/x*
3 do
4
date >> registosTempoUpdateT1.log
5
echo $file >> registosTempoUpdateT1.log
6
{ time java -jar nsrlsvr-bd.jar -u FileRecord $file ; } 2>> registosTempoUpdateT1.log
7
sleep 1
8 done
Tabela 11: Exemplo de um script para auxilio a carregar dados na base de dados
Como podemos observar no script, ele procura num determinado directório os ficheiros que tem
que carregar para ler os dados, enquanto esses ficheiros não acabarem o script vai registando a
data e hora, o caminho do ficheiro e o tempo que demorou a ser inserido para todos os ficheiros
que forem encontrados no directório.
Na Tabela 12 vai mostrar-se um exemplo do registo que o script faz quando insere os dados na
base de dados.
1 Sáb Mai 3 11:09:05 WEST 2014
2 /home/fabio/NetBeansProjects/nsrlsvr-bd/InputBDT1/xaa
3
4 real
63m28.214s
5 user
12m1.404s
6 sys
4m23.611s
7 ...
Tabela 12: Exemplo de registo log script
Como mostra na Tabela 12, o script regista a data e hora de quando foi executado o script, o
caminho do ficheiro que foi carregado e por fim o tempo que demorou a inserir os dados desse
ficheiro na base de dados. Este é um exemplo de um terminal a correr, como tínhamos 3 terminais
a correr ao mesmo tempo, são criados 3 ficheiros iguais a este, o que significa que foram
introduzidos 3 ficheiros em 63m28.214s.
Depois dos terem sido todos inseridos vai ser feito uma estimativa do tempo gasto para carregar
todos os dados para a base de dados. Na 13 Tabela vai ser mostra os tempos aproximados que
os dados demoraram a ser introduzidos na base de dados.
36
Nome das tabelas da base de
dados
Tempo de inserção na base de Dados a inserir
dados
ManufacturerRecord
0m49.922s
3527
OperatingSystemRecord
0m16.421s
1061
ProductRecord
8m42.850s
39951
FileRecord
≈ 8 dias
36.108.465
Tabela 13: Registos da inserção de dados na base de dados
Como se pode perceber ainda demorou alguns tempo a carregar os dados para base de dados,
convém descrever que estes dados foram introduzidos da seguinte maneira um computador
estava a executar a aplicação e outro computador estava a guardar os dados na base de dados,
isto é, os dois pcs estavam ligados por um cabo de rede onde que executava a aplicação
carregava os dados do ficheiro e os enviava para o outro pc guardar os dados na base de dados.
Se fosse tudo feito no mesmo computador demoraria muito mais tempo e tempo era algo que não
tínhamos devido ao facto de termos perdido tempo a fazer testes para introduzir todos os dados
existentes na base de dados da NSRL.
4.2 – Testes do protótipo
Depois de os dados estarem devidamente todos introduzidos na base de dados, vai começar-se a
fazer testes a aplicação desenvolvida.
Primeiro, será feito um script para que o cliente guarde todos os hashes e os caminhos dos
ficheiros desses hashes num ficheiro txt para mais tarde ser avaliado para verificar se a aplicação
desenvolvida e a aplicação original devolvem os mesmos ficheiros não conhecidos. Também
mediremos os tempos da análise da aplicação original e da aplicação desenvolvida para analisar
se compensa usar a aplicação desenvolvida.
Para a validação desta aplicação vamos fazer alguns testes para verificar se aplicação
desenvolvida está a comportar-se como a original.
Na Tabela 14 será mostrado o script que foi elaborado para guardar os hashes e os caminhos
desses hashes num ficheiro para facilitar na comparação que vai ser feita entre a aplicação
37
elaborada e a aplicação original.
#!/bin/bash
md5deep -r /bin/ | nsrllookup -s 127.0.0.1 >> registosFicheiros.log
Tabela 14: Exemplo do script de registar ficheiros não conhecidos
Na Tabela 14 é mostrado o script que foi desenvolvido para ajudar a ver os ficheiros que a
aplicação desenvolvida ou a aplicação original não conhecem, visto que como as aplicações são
executadas num terminal podem não mostrar todos os ficheiros não conhecidos. Por isso foi
desenvolvido este script para facilitar essa visualização dos ficheiros, agora passaremos a
explicação o funcionamento do script que funciona da seguinte maneira, o md5deep é um
comando que foi instalado para gerar os hashes md5 de todos os ficheiros existentes num
determinado directório, “-r” indica que é recursivo e que vai a sub-directórios e a seguir ao “-r” vem
o caminho do directório. O “|” indica que vai usar o resultado do comando anterior para o novo
comando que neste caso vai devolver todos os md5 calculados para o comando nsrllookup. O “-s”
do comando nsrllookup indica que a seguir a esse parâmetro deve vir o ip do servidor, onde a
aplicação servidor a correr. Por fim temos “>>” que vai indicar que escrever os resultados do
comando nsrllookup no ficheiro registosFicheiros.
4.2.1 – Requisitos a testar
Agora vai ser feito uma lista que identifica os itens – use cases, requisitos funcionais e não
funcionais – que serão identificados como alvos de teste. Essa lista vai representar o que vai ser
testado.
Testes da base de dados
- verificar se o sistema introduziu os dados correctamente;
- verificar se o sistema é capaz de ir buscar os dados;
Teste funcional
- verificar se a aplicação comunica bem com a aplicação cliente;
38
Teste da interface do utilizador
- verificar através de todos os uses cases, que os comandos são os mais simples para o
utilizador perceber a sua utilização rapidamente;
Teste de performance
- verificar o tempo de inserção dos dados na base de dados;
- verificar os tempos que a aplicação demora a pesquisar os hashes num determinado
directório;
Testes de Instalação
- verificar se a instalação da aplicação desenvolvida ocorre normalmente em todos os
sistemas operativos;
4.2.2 – Estratégia de testes
Agora, serão demonstrados os testes referentes às transacções lógicas de negócio. Essas
transacções vão ser definidas como funções específicas que o utilizador final da aplicação vai ser
suposto de executar ao usar esta aplicação.
Tipos de Testes
39
Objectivo do teste:
Garantir que os métodos e processos de acesso à base de dados
funciona correctamente e sem corrupção de dados.
Técnica:
- Invocar cada método e processo de acesso à base de dados, usando
cada um com dados válidos e inválidos.
- Inspecionar a base de dados para garantir que os dados foram
preenchidos como pretendido, que todos os eventos da base de dados
ocorreram apropriadamente.
Critério de
Finalização:
Todos os métodos e processos de acesso à base de dados funcionam
como planeado e sem nenhuma corrupção de dados.
Considerações
Especiais:
- O teste pode necessitar de um ambiente de desenvolvimento ou um
SGBD para inserir ou modificar os dados diretamente na base de dados.
- Processos devem ser invocados manualmente.
- Número de registos limitados devem ser usados para aumentar a
visibilidade de elementos não-aceitáveis.
Tabela 15: Teste de integridade de dados e da base de dados
Na Tabela 15 será mostrado um teste que foi desenvolvido para ser garantido que na aplicação
que vai ser entregue ao cliente, os métodos e processos de acesso à base de dados funcionam
corretamente, visto é uma funcionalidade muito importante porque sem isso a aplicação fica
praticamente impossível de ser usada.
Objectivo do teste:
Garantir que as funcionalidades são alvo de testes.
Técnica:
Executar cada funcionalidade, usando dados válidos e inválidos para
verificar o seguinte:
- Os resultados esperados ocorrem quando dados válidos são usados.
- As mensagens de erro ou aviso apropriadas são exibidas quando dados
inválidos são usados.
- Cada regra de negócio é aplicada corretamente.
Critério de
Finalização:
- Todos os testes planeados foram executados.
Considerações
Especiais:
Nenhum
- Todos os defeitos identificados foram tratados.
Tabela 16: Teste de Funções
Na Figura 16 será exposto um teste que foi desenvolvido para ser garantido que na aplicação que
vai ser entregue ao cliente, as funcionalidade principais nomeadamente o protocolo de
comunicação entre o servidor e cliente funcione nas melhores condições possíveis, porque
também é uma funcionalidade muito importante para a aplicação desenvolvida, visto que se a
aplicação desenvolvida não comunicar com a aplicação cliente, esta aplicação não terá muito
40
interesse.
Objectivo do teste:
Garantir que os comandos da aplicação desenvolvida estão o mais
simples possível e de fácil perceção.
Técnica:
- avaliação por uma pessoa que vá usar a aplicação desenvolvida.
Critério de
Finalização:
- Depois de os comandos estarem simples e estarem fáceis de perceber.
Considerações
Especiais:
Nenhum
Tabela 17: Testes da interface do utilizador
Na Tabela será exibido um teste que foi desenvolvido para ser garantido que na aplicação que vai
ser entregue ao cliente, a interface do utilizador seja a mais simples possível, que seja de fácil
perceber e que seja intuitivo para que cliente esteja à vontade para usar a aplicação desenvolvida.
Objectivo do teste:
Verificar a performance da pesquisa de hashes nas seguintes condições:
- directório com poucos ficheiros.
- directório com muitos ficheiros.
Verificar a performance da inserção de dados na base de dados.
Técnica:
- Usar procedimentos de teste desenvolvidos para os Teste de Funções.
- Usar procedimentos de testes desenvolvidos para os testes à base de
dados.
Critério de
Finalização:
- Finalização com sucesso de todos os testes feitos aos diretórios.
Considerações
Especiais:
Nenhum
- Finalização com sucesso de todos os testes feitos à performance de
inserção de dados
Tabela 18: Teste de Performance
Na Figura 18 será indicado um teste que foi desenvolvido para ser garantido que na aplicação que
vai ser entregue ao cliente, a aplicação desenvolvida tenha a melhor performance nas pesquisa
que faz à base de dados à procura dos hashes e também se se pode otimizar a inserção de dados
na base de dados.
41
Objectivo do teste:
Verificar que os testes são alvo de instalação apropriadamente em cada
sistema operativo nas seguintes condições:
- uma nova instalação, num novo computador, que nunca fora
anteriormente instalada a aplicação desenvolvida.
Técnica:
Começar ou executar a instalação.
Critério de
Finalização:
Quando as instalações funcionem em todos os sistemas operativos.
Considerações
Especiais:
Nenhum.
Tabela 19: Teste de instalação
Na Tabela 19 estará evidenciado um teste que foi desenvolvido para ser garantido que na
aplicação que vai ser entregue ao cliente, a aplicação desenvolvida possa ser instalada em todos
os sistemas operativos como foi previsto.
4.3 – Resultados
Neste sub-capítulo vai ser mostrado os resultados que foram obtidos na comparação entre a
aplicação desenvolvida e aplicação original. Como foi descrito em cima foi elaborado primeiro o
carregamento dos dados para a base de dados, visto que sem isto não se podia testar a aplicação
desenvolvida, já que a aplicação original carrega o ficheiro para memória RAM. À medida que os
dados foram introduzidos, o script criado para apontar os tempos, foi guardando todos os nomes
dos ficheiros introduzidos e os seus respectivos tempos, para agora poderem ser avaliados, para
que o cliente final tenha uma ideia do tempo que demorou a carregar os dados, nas condições
especificadas em cima.
Depois de os dados terem sido introduzidos, vai ser passado a fase de testes descritos no subcapítulo anterior. Começou-se pelo teste da verificação se a aplicação desenvolvida tinha
introduzido os dados correctamente na base de dados, enquanto este teste não tivesse concluído
a 100% não se podia avançar para outros testes.
Estando os dados introduzidos correctamente na base de dados, passou-se para o teste se a
aplicação desenvolvida conseguia aceder aos dados que estavam na base de dados, visto ser
importante conseguir aceder aos dados sem problemas nenhuns. Conseguindo-se aceder aos
dados já se estava pronto para passar ao teste seguinte que era o teste funcional, isto é, são os
42
testes das funcionalidades da aplicação desenvolvida, visto que só temos uma funcionalidade
principal que é o protocolo de comunicação entre o servidor e o cliente, só vai ser feito o teste a
essa funcionalidade. Antes de este teste ser elaborado foi preciso perceber como a aplicação
original comunica com o cliente porque a aplicação desenvolvida tinha de comunicar no mesmo
protocolo que a aplicação original. Percebido o seu funcionamento foi elaborados alguns testes
para verificar-se se a aplicação desenvolvida estava a funcionar como a aplicação original.
Estando a aplicação desenvolvida a usar o protocolo de comunicação correctamente, passou-se
para os testes da interface do utilizador, visto que a aplicação desenvolvida não tem parte gráfica,
só foram feitos testes para deixar os comandos da aplicação desenvolvida mais simples para o
utilizador usar e que os comandos sejam de fácil percepção.
Os testes que serão feitos a seguir a estes vão ser os testes da performance, que indicaram os
tempos de inserção de dados na base de dados e tempos das pesquisas de hashes nos
directórios, para que se possa avaliar se pode ser optimizado o tempo de inserção de dados na
base de dados ou o tempo das pesquisas de hashes na base de dados.
Como já se falou num sub-capítulo deste capítulo sobre os tempos de inserção de dados na base
de dados e que foram optimizado o mais possível dentro das condições que tínhamos para a
inserção porque podia ser mais se tivéssemos um computador computacionalmente mais potente.
Agora será abordado o tempo que foi nas pesquisas de hashes tanto na aplicação desenvolvida
como na aplicação original. Na Tabela 20 vai ser mostrado alguns exemplos de pesquisas de
hashes da aplicação desenvolvida e da aplicação original do mesmo directório para se poder
comparar os tempos que demoram a pesquisar os mesmos hashes.
Pasta
Aplicação desenvolvida
Aplicação original
/bin
20m12.075s
0m1.474s
/home/fabio/Transferências
31m53.890s
7m16.178s
Tabela 20: Tempos de pesquisas
Como pode ser visto a aplicação desenvolvida demora mais tempo que aplicação original, o que é
normal visto que a aplicação usa a memória RAM.
Por fim, serão mostrados os últimos testes, os testes de instalação que nos mostrará se a
43
aplicação desenvolvida poderá ser instalada em todos os sistemas operativos. A aplicação foi
desenvolvida numa linguagem portável.
Com este capítulo é importante reter que a aplicação desenvolvida demora algum tempo para
introduzir os dados na base de dados, outra parte importante deste capítulo são os testes que
foram desenvolvidos para garantir que a aplicação desenvolvida funciona de acordo com o
previsto e por fim os resultados com a descrição relativamente aos testes desenvolvidos.
44
5 – Conclusão
A análise forense a equipamentos informáticos requer frequentemente a técnicas de identificação
de ficheiros. Uma aplicação que o permite fazer é o NSRLSVR que, por carregar a totalidade da
base de dados de identificação de ficheiros (resumos criptográficos) para memória RAM o que
torna a aplicação muito rápida, mas muito exigente em termos de recursos de hardware.
O objetivo deste projeto consistiu no desenvolver de uma nova versão da aplicação NSRLSVR, de
nome NSRLSVR-BD, para, mantendo o seu funcionamento, guardar os dados numa base de
dados. Tal permitirá a sua execução em PCs com especificações de hardware menores.
O desenvolvimento deste projeto implicou a criação de uma base de dados, o estudar do
funcionamento da aplicação original, bem como do respetivo protocolo de comunicação. A
aplicação NSRLSVR é utilizada em conjunto com uma aplicação cliente. Funcionalidade esta que
também foi assegurada pelo atual projeto, podendo ser utilizada com a aplicação cliente do
NSRLSVR original.
Os resultados obtidos com este trabalhado demonstram que a aplicação desenvolvida é 7,14
vezes mais lenta a pesquisar hashes que a aplicação original, algo já esperado. A aplicação
desenvolvida torna-se, no entanto, mais usável pois pode ser utilizada em todos os sistemas
operativos e em PCs com menores recursos de memória RAM. A aplicação original foi
desenvolvida na linguagem C++ e apenas para execução em sistemas Linux. Neste projeto foi
utilizado a linguagem Java para tornar a aplicação desenvolvida numa aplicação multi-plataforma.
45
Referências
[1] D. Chess. “The future of viruses on the Internet,” Virus Bulletin International Conference, San
Francisco, Califórnia,USA, Outubro de 1997.
[2] D. Davies and W. Price. Security for computer networks, Wiley, 1989.
[3] R. Jueneman, “Electronic document authentication,” IEEE Network, Abril de 1987.
[4] R. Jueneman and S. Matyas and C. Meyer, “Message authentication,” IEEE Communications
Magazine, Setembro de 1988.
[5] J. Kephart and G. Sorkin and D. Chess and S. White, “Fighting computer viruses”. Scientific
American, Novembro de 1997.
[6] J. Kephart and G. Sorkin and B. Swimmer and S. White. “Blueprint for a computer immune
system,”, Virus Bulletin International Conference, San Francisco, Califórnia,USA, Outubro de 1997.
[7] C. Meyer and M. Schilling. “Secure program load with modification detection code,”
SECURICOM 88, 1988.
[8] C. Mitchell and F. Pipper and P. Wild. “Digital signatures,” Em [13].
[9] S. Miyaguchi and K. Ohta and M. Iwata. “Confirmation that Some hash functions are not
collision free”, EUROCRYPT '90, 1990; publicado por Springer-Verlag.
[10] C. Nachenberg. “Computer virus-antivirus coevolution,” Communications of the ACM, Janeiro
de 1997.
[11] J. Nachvatal. “Public key cryptography,” Em [13].
[12] M. Rabin. “Digitalized signatures”. Em Foundations of Secure Computation, R. DeMillo and D.
Dobkin and A. Jones and R. Lipton. eds. Nova York: Academic Press, 1978.
[13] G. Simmons, ed. Contemporary cryptology: the science of information integrity. Piscataway:
IEEE Press, 1992.
46
[14] P. Stephenson, “Preventive medicine”. LAN Magazine, Novembro de 1993.
[15] G. Yuval. How to swindle rabin. Cryptologia, Julho de 1979.
[16] W. Stallings. Criptografia e segurança de redes Princípios e práticas. São Paulo, Pearson
Prentice Hall, 2008.
[17] National Institute of Standards and Technology, NIST Special Database #28, National
Software Reference Library, http://www.nist.gov/srd/nistsd28.cfm, (Fevereiro 2000) [Último Acesso:
Maio 2014].
[18]
T.
Boland
and
G.
Fisher,
Selection
of
Hashing
Algorithms,
http://www.nsrl.nist.gov/Technical_papers.htm, (Junho 2000) [Último Acesso: Maio 2014].
[19] National Institute of Standards and Technology, Digital Signature Standard (DSS),
FIPS 186-4, http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf, (Julho 2013) [Último
Acesso: Maio 2014].
[20] B. Schneier. Applied Cryptography: Protocols, Algorithms, and Source Code in C,
John Wiley and Sons, New York (1996).
[21] International Standards Organization, Data Communications: High-level Data Link
Control Procedures--Frame Structure (ISO 3309), IS 3009 (3rd Edition), (10-1- 1984).
[22] R. Rivest, RFC 1321: The MD5 Message-Digest Algorithm, http://ietf.org/rfc/rfc1321.txt, (Abril,
1992) [Último Acesso: Maio 2014].
[23] National Institute of Standards and Technology, Secure Hash Standard, FIPS PUB 180-4,
http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf, (Março 2012) [Último Acesso: Maio
2014].
[24] A. Pinto, “Guião 2 – Análise Forense Digital a Sistemas de armazenamento de dados”,
Setembro de 2013.
[25] P. Eugene, What Is a File Signature?, http://www.wisegeek.com/what-is-a-file-signature.htm,
47
(Maio 2014) [Último Acesso: Maio 2014].
[26] Wikipedia, List of file signatures, http://en.wikipedia.org/wiki/List_of_file_signatures, (Maio
2014) [Último Acesso: Maio 2014].
[27]
S.Mead,
Unique
File
Identification
in
the
National
Software
Reference
Library,
http://www.nsrl.nist.gov/Documents/analysis/, (Maio 2006), [Último Acesso: Maio 2014].
48

Documentos relacionados