Escolar Documentos
Profissional Documentos
Cultura Documentos
INSTITUTO DE MATEMTICA
DEPARTAMENTO DE CINCIA DA COMPUTAO
Apresentado por:
__________________________________
Mateus Gregrio de Souza
Aprovado por:
__________________________________
Davidson Rodrigo Boccardo, D.Sc.
__________________________________
Luci Pirmez, D.Sc.
__________________________________
Luziane Ferreira de Mendona, D.Sc.
__________________________________
Rafael de Oliveira Costa, M.Sc.
Agradecimentos
Ao meu Deus, toda a gratido, por tudo que a mim fez, faz e far. Pela f renovada a
cada dia e pelo zelo que a mim dispensa em todos os momentos. A sua graa e
misericrdia foram o meu sustento e me fizeram feliz em todo o tempo. Agradeo por
todas as portas que foram abertas, pelas amizades que me proporcionou construir, pelo
conhecimento adquirido e pela primeira etapa de um sonho que se faz realizada.
Aos meus pais, agradeo, por todo amor e carinho com os quais me criaram, e
pelo apoio incondicional que at aqui me possibilitou chegar. Ao longo de toda a minha
vida, vocs foram os maiores motivadores dos meus estudos e me ensinaram a valorizar
cada oportunidade de aprender. Por quantas vezes vocs me incentivaram a seguir em
frente, a sempre dar o melhor de mim, e vibraram junto comigo por cada vitria
alcanada ao longo dessa jornada que a faculdade. Por quantos momentos vocs foram
meu recurso, meus ajudadores. No h dvidas de que sem vocs esse momento no
seria possvel, tanto que, para mim, o diploma de Bacharel em Cincia da Computao
que irei receber tambm deveria incluir o nome de vocs!
minha futura esposa, Alessandra, com quem desejo partilhar todos os dias da
minha vida, eu agradeo por todo o seu imenso amor, carinho, amizade,
companheirismo e pacincia ao longo de todos estes anos que estamos juntos,
principalmente durante o perodo da graduao. Obrigado por compreender as minhas
ausncias durante estes anos de faculdade e por nunca ter desistido de estar ao meu lado.
Voc foi mais do que fundamental para essa conquista e a vitria aqui alcanada
tambm sua!
Agradeo, tambm, a todos os meus familiares e amigos que, certamente, muito
se alegraram pelo meu ingresso na UFRJ e agora vibram comigo por esta etapa
concluda.
ii
Aos meus orientadores, que fizeram com que este trabalho flusse de maneira
natural e no fosse um peso em momento algum. Agradeo pela disponibilidade,
ateno, pacincia e prontido em ajudar.
A todos os meus professores de graduao, agradeo pelo conhecimento
compartilhado, pelo comprometimento acadmico e por cada contribuio para a minha
formao como Cientista da Computao.
Por fim, agradeo a todos que de alguma forma contriburam para que eu
chegasse at aqui e que, sinceramente, torceram por mim e me acompanharam com
cumplicidade. Sem dvidas, este no o fim, mas apenas o incio de uma longa jornada.
iii
RESUMO
PortSP: Uma API para Tcnicas de Proteo de Software Portveis
Mateus Gregrio de Souza
Agosto/2015
iv
ABSTRACT
PortSP: An API for Portable Software Protection Techniques
Mateus Gregrio de Souza
August/2015
Software protection techniques, used to protect programs against Man-At-TheEnd attacks (MATE), can be expressed as a sequence of code transformations. The
implementation of such transformations for low-level code produces non-portable
protection solutions, requiring reimplementation for each different architecture that the
software is compiled. We propose the creation of a programming interface that allows
the manipulation of assembly code in a transparent and portable manner, ensuring the
implementation of software protection independent of the architecture.
Lista de Figuras
Figura 1. Diferena da localizao da maior complexidade entre as arquiteturas RISC e
CISC ................................................................................................................................. 7
Figura 2. Principais diferenas entre as arquiteturas RISC e CISC ................................. 8
Figura 3. Ideia geral e algumas funes da API PortSP ................................................. 11
Figura 4. Processo de uso da API PortSP at a gerao do binrio protegido ............... 12
Figura 5. Benefcio trazido pela API PortSP na implementao de um programa de
proteo de software ...................................................................................................... 13
Figura 6. Estrutura interna de funcionamento da API PortSP ....................................... 14
Figura 7. Esquema apresentando as principais possibilidades de cardinalidade no
mapeamento de instrues virtuais para instrues assembly ....................................... 23
Figura 8. Trecho do arquivo XML contendo o conjunto de registradores disponvel na
arquitetura x86 ............................................................................................................... 30
Figura 9. Trecho do arquivo XML contendo o conjunto de registradores disponvel na
arquitetura ARM ............................................................................................................ 31
Figura 10. Algumas das instrues virtuais definidas pela API PortSP ........................ 32
Figura 11. Mapeamento de algumas instrues virtuais para as instrues assembly da
arquitetura x86 ............................................................................................................... 33
Figura 12. Mapeamento de algumas instrues virtuais para as instrues assembly da
arquitetura ARM ............................................................................................................ 34
vi
vii
Lista de Tabelas
Tabela 1. Algumas das operaes definidas que compem a camada de abstrao da API
PortSP............................................................................................................................. 15
Tabela 2. Algumas operaes e a descrio do papel dos elementos que podem
acompanh-las na composio das instrues virtuais. .................................................. 17
Tabela 3. Padres de busca definidos para se referir aos principais tipos de operandos
das linguagens assembly durante a busca por instrues................................................ 26
viii
ARM
CISC
MATE
Man-At-The-End
RISC
XML
ix
Sumrio
Agradecimentos
ii
Resumo
iv
Abstract
Lista de Figuras
vi
Lista de Tabelas
viii
ix
1 Introduo
10
38
5 Concluso
44
6 Anexos
45
47
xi
Captulo 1
Introduo
1.1. Motivao
Ano aps ano, a indstria de software vem sofrendo enormes prejuzos devido a
pirataria de software. Segundo [BSA 2014], 43% do software instalado em
computadores pessoais no mundo inteiro em 2013 no era licenciado, o que representou
um prejuzo de 62,7 bilhes de dlares, correspondente ao valor comercial das
instalaes no licenciadas. O estudo mostra ainda que houve um aumento na
porcentagem de softwares no licenciados instalados em relao ao estudo global
anterior, realizado em 2011.
Alm de prejuzos financeiros para os fabricantes de software, que deixam de
receber o valor comercial das licenas de uso pirateadas, violaes de softwares podem
trazer outros prejuzos ainda mais crticos em alguns casos, no s para os fabricantes de
software como tambm para as organizaes que os utilizam. Um atacante poderia
tentar violar um software com o objetivo de furtar propriedade intelectual algoritmos
que representam vantagem competitiva em relao a empresas concorrentes, design de
implementao do software , furtar dados sensveis contidos no programa chaves
criptogrficas, nmero serial , adulterar o funcionamento do software a fim de obter
vantagens pessoais burlar a verificao de licena de uso ou identificar
vulnerabilidades no software para posteriormente explor-las.
importante observar que o problema de proteo de software difere
consideravelmente de outros problemas tradicionalmente estudados em segurana de
1
proteo de software [Falcarin et al. 2011], que buscam dificultar, adiar ou, no pior dos
casos, minimizar os efeitos de ataques MATE a softwares. Dentre as principais tcnicas
de proteo de software, destacam-se as tcnicas de ofuscao, marca dgua e
incorruptibilidade (ou tamper-proofing) [Collberg e Thomborson 2002]. Tcnicas de
ofuscao de cdigo dificultam a engenharia reversa atravs de modificaes sintticas
que aumentam o grau de ininteligibilidade do cdigo, mas mantm a sua semntica
original. Tcnicas de marca dgua agem como uma defesa contra pirataria de software,
atravs da insero de informaes no cdigo do programa que permitam rastrear sua
autoria ou propriedade. Por fim, tcnicas de incorruptibilidade asseguram que o software
executa como esperado, atravs da adio de cdigo auto verificvel capaz de detectar
tentativas de modificao ou monitorao do software e coibir a continuidade de tais
aes.
Observa-se que as tcnicas de proteo de software consistem em um conjunto
de transformaes aplicadas diretamente sobre o cdigo de um programa, visando
proteg-lo contra ataques de adversrios [Boccardo et al. 2010]. Alm disso,
observamos tambm que as tcnicas de proteo de software se utilizam de uma base
comum de transformaes de cdigo para serem construdas. Por exemplo, em muitas
tcnicas de proteo de software, sejam elas de ofuscao, marca dgua ou
incorruptibilidade, perfeitamente usual a execuo de transformaes como: inserir
novos trechos de cdigo, substituir determinados trechos de cdigo por outros
equivalentes, remover e reordenar trechos de cdigo.
Muitas tcnicas de proteo de software baseiam-se em transformaes de
cdigo aplicadas sobre cdigo de baixo nvel (assembly ou binrio). Porm, o
desenvolvimento de tais tcnicas mostra-se um desafio em relao a portabilidade da
soluo, pois cdigo de baixo nvel , por definio, um cdigo especfico para lidar
com as caractersticas da arquitetura para a qual foi projetado. Logo, as transformaes
de cdigo aplicadas sobre cdigo de baixo nvel e, consequentemente, as tcnicas de
proteo compostas por elas, tornam-se dependentes da arquitetura, obrigando analistas,
desenvolvedores e pesquisadores da rea de segurana a sempre reimplementarem suas
tcnicas de proteo de acordo com a arquitetura para a qual o software a ser protegido
3
foi compilado. Dessa forma, interessante estudar meios para facilitar a implementao
de tcnicas de proteo de software para mltiplas arquiteturas, buscando evitar o
retrabalho de profissionais da rea de segurana de software.
1.2. Objetivos
Este trabalho prope a criao de uma API (Application Programming
Interface), chamada PortSP, que possibilite a implementao de tcnicas e programas de
proteo de software, capazes de serem utilizados para proteger softwares compilados
para mltiplas arquiteturas de hardware. Para tanto, a API proposta fornece um conjunto
de funes bsicas que permitem a execuo de transformaes de cdigo assembly de
mltiplas arquiteturas, bem como facilita a implementao de tcnicas e programas de
proteo de software a partir da simples combinao do uso de tais funes.
A proposta da API PortSP visa atingir dois objetivos principais: prover
portabilidade para as transformaes de cdigo utilizadas na composio de tcnicas de
proteo de software, tornando possvel a implementao de tcnicas de proteo de
software portveis; e, prover funes bsicas que facilitem a implementao de tcnicas
de proteo de software, tanto nos cenrios em que a portabilidade das tcnicas um
requisito, quanto naqueles em que tal portabilidade opcional.
Captulo 2
Conceitos Bsicos
Neste captulo esto descritos conceitos bsicos que servem como referncia para a
compreenso deste trabalho. Tratamos aqui sobre algumas diferenas entre as
arquiteturas de processadores CISC e RISC, bem como sobre algumas caractersticas
das linguagens de programao assembly.
baseados nesta arquitetura so mais simples e muito mais baratos. Outra vantagem dos
processadores RISC, que, por terem um menor nmero de circuitos internos, podem
trabalhar a frequncias mais altas, atingindo melhor desempenho que os processadores
CISC na execuo de instrues simples. indiscutvel, porm, que em instrues
complexas os processadores CISC saem-se melhor. Por isso, ao invs da vitria de uma
das duas tecnologias, atualmente vemos processadores hbridos, que so essencialmente
processadores CISC, mas que incorporam muitos recursos encontrados nos
processadores RISC (ou vice-versa) [Morimoto 2007].
A filosofia RISC visa reduzir a complexidade das instrues executadas pelo
hardware. Como resultado, o compilador mais exigido, o que contrasta com a
arquitetura CISC, presente, por exemplo, na famlia de processadores da arquitetura
x86, utilizados nos computadores pessoais. As Figuras 1 e 2 ilustram as principais
diferenas entre as arquiteturas CISC e RISC.
A complexidade maior ou menor dos processadores ilustrada na Figura 1 refletese diretamente no conjunto de instrues dos processadores de tais arquiteturas. Sendo
assim, neste trabalho projetamos a API PortSP sob a tica de linguagens assembly
utilizadas por processadores que implementam tanto arquiteturas CISC quanto
arquiteturas RISC, de forma a abranger e se adaptar s caractersticas da maior gama
possvel de linguagens assembly.
Captulo 3
A API PortSP
Este captulo dedica-se a apresentar em detalhes as premissas e abstraes utilizadas no
projeto e implementao da API PortSP, e est organizado da seguinte forma: a seo
3.1 apresenta uma breve discusso sobre a escolha do nvel de aplicao das
transformaes de cdigo suportado pela API; a seo 3.2 apresenta as abstraes
criadas e demais especificaes da API e, finalmente, a seo 3.3 fornece uma descrio
em alto nvel da implementao de um prottipo da API.
10
o leque de transformaes de cdigo que podem ser aplicadas sobre o programa, sendo
bastante til, por exemplo, na proteo contra engenharia reversa.
Optamos ento pela aplicao de transformaes sobre cdigo de baixo nvel,
escrito em linguagem assembly, a fim de prover funes que permitam a execuo de
transformaes de cdigo granulares, a nvel de instrues de mquina. A escolha pelo
cdigo assembly foi feita para amenizar parte da dificuldade de compreenso e escrita
de cdigo, que seria ainda maior ao lidar diretamente com cdigo binrio.
3.2. Especificao
3.2.1. Viso Geral
Um dos objetivos da API PortSP o de fornecer ao usurio da API a partir de
agora denominado profissional de segurana ou programador funes que facilitem a
implementao de tcnicas de proteo de software. Para isso, a API prov uma
interface de programao com funes bsicas que facilitam a escrita de transformaes
de cdigo assembly. Funes que permitem encontrar, inserir, remover e substituir
instrues e rtulos, identificar e reordenar blocos bsicos, por exemplo, facilitam a
manipulao do cdigo assembly de tal forma que basta combinar o uso dessas funes
para implementar diversas transformaes de cdigo utilizadas nas tcnicas de
ofuscao, marca dgua e incorruptibilidade de software. O esquema da Figura 3
apresenta a ideia geral de como implementar tcnicas de proteo de software que
podem vir a compor um programa de proteo de software , a partir das funes
bsicas disponibilizadas pela interface de programao da API PortSP.
11
A entrada exigida pela API PortSP composta pelo programa alvo das tcnicas
de proteo, escrito em linguagem assembly, e pelo nome da arquitetura para a qual o
programa foi compilado. A API ento capaz de executar sobre o programa alvo da
proteo as tcnicas de proteo de software construdas pelo profissional de segurana,
a partir das funes bsicas providas pela API, aplicando transformaes de cdigo
sobre o programa que produzem instrues assembly escritas na linguagem correta, de
acordo com a informao fornecida na entrada a respeito da arquitetura para a qual o
programa foi compilado. O resultado desse processo uma verso modificada do
programa assembly original, que o profissional de segurana dever utilizar para gerar o
binrio do programa que ser disponibilizado publicamente para download ou aquisio
dos usurios, ou mesmo embarcado em um hardware especfico para comercializao. A
seguir, o esquema da Figura 4 clarifica o processo de uso da API at a gerao do
binrio protegido do programa.
13
14
Operao
Descrio
MOVE
PUSH_ONTO_STACK
15
EXCLUSIVE_OR
AND
SUBTRACT
ADD
RETURN_FROM_FUNCTION
JUMP_IF_ZERO
Alm disso, para cada uma das operaes foi definido o nmero de elementos
que podem acompanh-las na composio das instrues virtuais, bem como o papel de
cada um desses elementos na operao. As operaes podem ser acompanhadas por
nenhum, um ou dois elementos, semelhantemente ao que ocorre nas instrues assembly
de processadores das arquiteturas RISC e CISC, que so compostas por um mnemnico
de operao, acompanhado de um nmero determinado de operandos com papis e tipos
bem definidos. Ressalta-se, porm, que as instrues virtuais no restringem os tipos de
elementos (registrador, endereo de memria, valor constante ou rtulo) aceitos por
cada operao, uma vez que cada arquitetura define suas prprias limitaes em relao
aos tipos de operandos aceitos pelas instrues assembly. Dessa forma, tais limitaes
so definidas nos mapeamentos das instrues virtuais para as instrues assembly de
cada arquitetura, como ser discutido em detalhes na subseo 3.2.2.3. A Tabela 2
apresenta algumas operaes e uma descrio do papel de cada um dos elementos que
podem acompanh-las na composio das instrues virtuais.
16
Instruo Virtual
Operao
MOVE
PUSH_ONTO_STACK
Elemento 1
Operando
de
destino
Elemento 2
da Operando de origem da
operao.
operao.
Operando da esquerda e
EXCLUSIVE_OR
tambm
operando
de Operando da direita da
destino
do
resultado
da operao.
operao.
Operando da esquerda e
AND
tambm
operando
de Operando da direita da
destino
do
resultado
da operao.
operao.
Minuendo da subtrao e
SUBTRACT
tambm
operando
de Subtraendo da operao
destino
do
resultado
da de subtrao.
operao.
Operando da esquerda e
ADD
tambm
operando
de Operando da direita da
destino
do
resultado
da operao.
operao.
RETURN_FROM_FUNCTION
JUMP_IF_ZERO
Endereo
de
desvio de fluxo.
17
destino
do
instrues assembly, e elementos que devero ser obtidos dinamicamente a partir das
funes de provisionamento de elementos , para se referir aos recursos disponveis na
arquitetura que sero utilizados como operandos na instruo virtual.
3.2.2.2. Mdulos de Informaes Sobre as Arquiteturas
Para que seja possvel realizar o mapeamento das instrues virtuais para as
instrues assembly, necessrio conhecer as caractersticas de cada arquitetura
suportada API. Mais ainda, para que a API seja capaz de executar automaticamente a
traduo das instrues virtuais para as instrues assembly, necessrio prover meios
para que a API possa consultar as informaes sobre as arquiteturas suportadas, bem
como os mapeamentos das instrues virtuais para as instrues assembly.
Cada arquitetura suportada pela API possui o seu prprio mdulo de
informaes, que tem como papel fundamental concentrar todas as informaes
necessrias para a execuo das funes de provisionamento de elementos. Todas as
informaes sobre os registradores disponveis na arquitetura, bem como informaes
sobre a sintaxe desses e outros recursos na linguagem assembly da arquitetura, devero
ser especificadas neste mdulo.
Todos os registradores disponveis para uso na linguagem assembly da
arquitetura so especificados no mdulo de informaes. Os registradores so
classificados em trs grupos possveis: registradores de uso geral, registradores especiais
e outros registradores, de forma que tal classificao possibilite API lidar de forma
diferenciada com cada grupo de registradores. Por exemplo, registradores de uso geral
so os nicos registradores que devem ser providos ao profissional de segurana pela
funo de provisionamento de registradores. Alm deles, somente os registradores
classificados como especiais, que so o contador de programa (program counter) ou
apontador de instruo, e o apontador de pilha (stack pointer), podem ser provisionados
ao profissional de segurana, sendo estes fornecidos por funes de provisionamento
especficas para esses dois registradores. Tais registradores so comuns a grande maioria
das implementaes de arquiteturas RISC e CISC, sendo, por este motivo, utilizados na
implementao de algumas tcnicas de proteo de software. Esses registradores
19
(a) Cardinalidade
entre
instruo
(b) Cardinalidade
entre
instruo
assembly.
assembly.
23
Por fim, no momento do mapeamento de uma instruo virtual para uma ou mais
variantes de instruo assembly, a API PortSP deve executar a validao dos elementos
que foram utilizados na composio da instruo virtual, de acordo com os tipos de
operandos aceitos pela variante de instruo assembly mapeada. Os possveis tipos de
operandos so: registradores, rtulos, endereos de memria e constantes. Caso os
elementos utilizados como operandos da instruo virtual no atendam aos requisitos
estabelecidos no mapeamento para a instruo assembly, a API gera uma exceo e as
transformaes de cdigo no so efetivadas sobre o programa. Este processo de
validao importante para que no sejam geradas instrues assembly invlidas, que
venham a impedir a gerao do binrio protegido do programa ou mesmo quebrar o
programa durante a sua execuo.
3.2.3. Funes Bsicas para Transformaes de Cdigo
As funes bsicas para transformaes de cdigo providas pela API PortSP so
a base para a composio de tcnicas de proteo de software portveis. Ademais, alm
de prover meios para a implementao de transformaes de cdigo independentes de
arquitetura, tais funes tambm facilitam a implementao de transformaes de
cdigo para compor tcnicas de proteo de software que, no necessariamente, sero
utilizadas para proteger cdigos assembly compilados para diversas arquiteturas. Sendo
assim, a API PortSP se mostra um ferramental til tanto para os cenrios de proteo de
softwares compilados para mltiplas arquiteturas, quanto para os cenrios de proteo
de softwares compilados para uma nica arquitetura de hardware.
Todas as funes bsicas providas pela API fazem uso, obrigatoriamente, de
instrues virtuais como parmetros. Assim, o profissional de segurana capaz de
implementar as tcnicas de proteo de software sem fazer qualquer referncia a termos
especficos da linguagem assembly de uma determinada arquitetura, de forma que as
tcnicas de proteo implementadas se mantm genricas e podem ser aplicadas sobre
softwares escritos em linuagens assembly de qualquer uma das arquiteturas suportadas
pela API.
24
funo para encontar instruo podero ser compostas tanto por operaes e elementos
quanto por operaes e padres de busca (no lugar dos elementos). Ao utilizar estes
padres no lugar de elementos explcitos, que seriam obtidos atravs das funes de
provisionamento de elementos, ganhamos flexibilidade na realizao de buscas por
instrues assembly mais especficas, o que, consequentemente, aumenta a capacidade
do profissional de segurana de implementar tcnicas de proteo de software mais
especficas.
A seguir, a Tabela 3 apresenta os padres de buscas criados e uma breve
descrio sobre cada um deles. Ressaltamos mais uma vez que o profissional de
segurana ter sempre total liberdade para compor as instrues virtuais que sero
utilizadas pela funo para encontrar uma instruo, pois o objetivo da API ser sempre
o de prover flexibilidade s implementaes dos profissionais.
Tabela 3. Padres de busca definidos para se referir aos principais tipos de
operandos das linguagens assembly durante a busca por instrues.
REG*
MEM*
IMM*
LBL*
OP*
Descrio
Utilizado para se referir a operandos do tipo
registrador.
Utilizado para se referir a operandos do tipo endereo
de memria.
Utilizado para se referir a operandos do tipo valor
imediato (constante).
Utilizado para se referir a operandos do tipo rtulo
(label).
Utilizado para se referir a operandos de qualquer tipo.
26
Por fim, os possveis retornos da funo para encontrar instruo podem ser a
posio inicial da primeira ocorrncia da instruo assembly procurada no cdigo do
programa, caso a instruo assembly seja encontrada, ou, uma posio invlida no
cdigo assembly ou algum outro indicativo de que a instruo assembly no foi
encontrada no cdigo do programa.
3.2.3.2. Funo para Inserir Instrues
A funo para inserir uma instruo adiciona uma instruo assembly no cdigo
do programa numa posio especificada. Os parmetros esperados por essa funo so a
instruo virtual correspondente instruo assembly que se deseja inserir e a posio
no cdigo assembly onde a instruo ser inserida.
Programas escritos em linguagens assembly, em geral, adotam um padro de
formatao de uma nica instruo assembly por linha de cdigo. A API PortSP segue
esse padro, de forma que ao inserir uma instruo assembly no cdigo do programa,
automaticamente adicionado ao final da instruo um caracter de quebra de linha.
Esta funo retorna a primeira posio imediatamente aps a linha que contm a
instruo assembly inserida, ou seja, a primeira posio da prxima linha de cdigo. O
objetivo aqui dar ao profissional de segurana uma continuidade na aplicao das
prximas transformaes de cdigo, que podero partir da posio imediatamente aps a
ltima instruo assembly inserida no cdigo e no mais da posio obtida na busca por
uma instruo assembly. Caso no seja possvel executar a insero da instruo
assembly no cdigo do programa, por qualquer que seja o motivo, a funo retorna uma
posio invlida no cdigo assembly ou algum outro indicativo de que a instruo
assembly no pode ser inserida.
3.2.3.3. Funo para Remover Instrues
A funo para remover uma instruo visa apagar inteiramente uma instruo
assembly presente no cdigo do programa. Dificilmente esta instruo ser utilizada
sozinha, sendo mais comum o seu uso como parte da implementao de uma
transformao de cdigo que visa substituir uma instruo assembly por outras
27
instrues e/ou rtulos. O parmetro esperado por esta funo a posio inicial da
instruo assembly que se deseja remover, geralmente obtida ao executar previamente a
funo para encontrar a instruo. Assumindo que o cdigo assembly do programa
segue o padro de uma nica instruo assembly por linha de cdigo, esta funo
remove inteiramente a linha de cdigo indicada pela posio informada.
De forma a facilitar a remoo de instrues pelo profissional de segurana, foi
definida tambm uma variante desta funo que recebe como parmetro a instruo
virtual correspondente instruo assembly que se deseja remover, ao invs de receber a
posio inicial da instruo. O objetivo evitar que para remover uma instruo
assembly o profissional de segurana tenha que, obrigatoriamente, executar a funo de
busca previamente. Assim, ao receber a instruo virtual como parmetro, a prpria
funo para remover instruo efetua uma busca pela instruo assembly correspondente
e, para a primeira ocorrncia da instruo assembly encontrada, procede com a remoo
da linha de cdigo que contm a instruo. Este recurso, de definir novas funes que
facilitam a execuo de aes que antes eram realizadas de uma forma mais difcil,
chamado de acar sinttico.
Ambas as variantes da funo para remover uma instruo retornam a posio
inicial da instruo assembly removida, que, aps a remoo, passou a indicar a posio
da instruo assembly seguinte instruo que foi removida. Caso no seja possvel
executar a remoo da instruo assembly no cdigo do programa, por qualquer que seja
o motivo, a funo retorna uma posio invlida no cdigo assembly ou algum outro
indicativo de que a instruo assembly no pode ser removida.
3.2.3.4. Funo para Substituir Instrues
A funo para substituir uma instruo outra funo que pode ser vista como
um acar sinttico da interface de programao provida pela API PortSP, visanndo
facilitar a escrita de transformaes de cdigo pelo profissional de segurana. Dizemos
que ela um acar sinttico, pois essa funo nada mais do que uma combinao da
execuo das funes para encontrar uma instruo, remover a instruo encontrada e
inserir no lugar da instruo removida uma nova instruo assembly.
28
3.3. Implementao
Inicialmente, foram implementadas funes base para a execuo de
transformaes de cdigo que permitem a implementao de algumas tcnicas de
ofuscao de software. O prottipo desenvolvido capaz de lidar com cdigos assembly
gerados pelo montador GNU Assembler [Free Software 2014], para as arquiteturas x86
e ARM, utilizando a sintaxe de instrues INTEL.
Parte da camada de abstrao da API foi implementada utilizando arquivos
XML, visando prover extensibilidade s abstraes e facilitar o suporte a novas
arquiteturas. Um nico arquivo XML utilizado para definir as instrues virtuais,
enquanto dois arquivos XML so utilizados para estruturar as informaes de cada
29
30
31
Figura 10. Algumas das instrues virtuais definidas pela API PortSP.
32
33
37
Captulo 4
Experimentos e Anlise de Resultados
A fim de avaliar o prottipo criado, realizamos um experimento que consiste em
compilar um mesmo software para duas arquiteturas distintas, utilizar um programa de
proteo implementado a partir da API PortSP para aplicar tcnicas de ofuscao de
cdigo sobre ambas as verses compiladas do software, gerar os binrios
correspondentes para cada arquitetura a partir dos programas ofuscados e, por fim,
execut-los, a fim de verificar se nenhuma das instrues inseridas quebrou o programa
ou alterou a sua semntica.
O programa de proteo implementado aplica conjuntamente duas tcnicas de
ofuscao de cdigo apresentadas por [Branco 2012]. A primeira tcnica, chamada de
Substituio de Instruo, consiste em trocar uma instruo assembly (ou um conjunto
delas) por outras semanticamente equivalentes. J a segunda, denominada Insero de
Cdigo Esprio, consiste em inserir instrues que nunca sero executadas pelo
programa. As Figuras 14, 15 e 16 apresentam os cdigos de implementao do
programa de proteo utilizando a API PortSP.
Como alvo do programa de proteo, implementamos um software gerador de
matrizes e o compilamos para as arquiteturas x86 de 64 bits (x86_64) e ARM de 32 bits
(ARMv5TEJ) [ARM 2005], gerando, respectivamente, os programas matriz_x86.s e
matriz_arm.s escritos nas linguagens assembly das arquiteturas correspondentes.
Executamos o programa de proteo duas vezes, sendo cada execuo com a finalidade
de proteger um dos programas assembly gerados. A cada execuo, foram informados
dois parmetros de entrada: o programa p alvo da proteo (escrito em assembly) e a
38
if( argc != 3 ) {
return -1;
} else {
p = argv[1];
a = argv[2];
while( pos ) {
am.remove_instruction( pos );
39
am.insert_label( rotulo );
10
11 }
12 }
Figura 15. Implementao da tcnica de ofuscao substituio de instruo
utilizando a API PortSP.
while( pos ) {
10
11
12
am.insert_label( rotulo_fake );
13
14
15
am.insert_instruction( RETURN_FROM_FUNCTION );
16
am.insert_label( rotulo_destino );
17
18 }
19 }
Figura 16. Implementao da tcnica de ofuscao insero de cdigo
esprio utilizando a API PortSP.
40
mov eax, 0
mov eax, 0
call printf
call printf
mov edi, 0
mov edi, 0
call time
call time
call srand
call srand
10 jmp .L2
(b)
41
mov r0, r2
mov r0, r2
mov r1, r3
mov r1, r3
bl printf
bl printf
mov r0, #0
mov r0, #0
bl time
bl time
mov r3, r0
mov r3, r0
mov r0, r3
mov r0, r3
bl srand
bl srand
mov r3, #0
mov r3, #0
11 b
.L2
12 bne LBL2
13 b
LBL1
14 LBL2:
15 adds r1, r1, #40
16 movs r7, r1
17 movs pc, lr
18 LBL1:
19 eors r3, r3
20 beq .L2
(a)
(b)
43
Captulo 5
Concluso
Neste trabalho, apresentamos o projeto da API PortSP para facilitar a implementao de
tcnicas de proteo de software em contextos de mltiplas arquiteturas. Os resultados
obtidos por meio da utilizao de um prottipo da API foram considerados satisfatrios,
uma vez que foi possvel, com poucas linhas de cdigo, implementar tcnicas de
proteo para proteger softwares compilados para mltiplas arquiteturas e, de forma
extremamente simples, aplic-las sobre verses de um software compiladas para
arquiteturas distintas. Em trabalhos futuros, pretendemos evoluir o prottipo a fim de
oferecer suporte arquitetura AVR, alm de implementar novas funes bsicas que
possibilitem a implementao de tcnicas de marca dgua e incorruptibilidade.
44
Captulo 6
Anexos
6.1. Diagrama de Classes completo do prottipo da API PortSP
Vide imagem na prxima pgina.
45
46
Referncias
Akhunzada, A., Sookhak, M., Anuar, N., Gani, A., Ahmed, E., Shiraz, M., Furnell, S.,
Hayat, A. and Khan, M. (2015). Man-At-The-End Attacks: Analysis, Taxonomy,
Human Aspects, Motivation and Future Directions, Journal of Network and
Computer Applications, vol. 48, p. 44-57.
ARM LTD (2005). ARM Architecture Reference Manual (ARM DDI 0100I),
https://silver.arm.com/download/ARM_Architecture/AR550-DA-70002-r0p000rel0/DDI%2001001.pdf. Acesso em Julho de 2015.
Blum, Richard (2005), Professional Assembly Language, Wrox, 1st edition.
Boccardo, D. R., Machado, R. C. S., Carmo, L. F. R. C. (2010). Transformaes de
cdigo para proteo de software, X Simpsio Brasileiro em Segurana da
Informao e de Sistemas Computacionais, Minicursos, cap. 3, p. 103-148.
Branco, R. R., Barbosa, G. N., Neto, P. D. (2012). Scientific but Not Academical
Overview
of
Malware
Anti-Debugging,
Anti-Disassembly
and
Anti-VM
(2015).
Eazfuscator.NET
Version
4.9,
Systems
(2015).
ElecKey
2.0.8.30,
System
Developer's
Guide:
49