Pesquisar este blog

domingo, 28 de julho de 2024

2024 07 28 - Um lugar para escrever minhas abobrinhas!

Memórias Tech: REXX, Flash e Andanças pelo Mundo

Há algum tempo atrás, sem saber ao certo o porquê, apaguei uma coletânea de textos que eram o melhor amigo da minha memória. Tenho backup, mas pra restaurar vai dar uma trabalheira danada, então deixa pra lá, vamos começar de novo.

Notas sobre REXX

Hoje achei sem querer umas notas sobre REXX, coloquei lá no meu "livro" digital:

Minha Conta no X

Abri uma conta no X, segue lá:

Andanças pelo Mundo em 2011

Achei também minhas andanças pelo mundo quando isso ainda era novidade! Fiz um vídeo na época (por volta de 2011) depois de ler que o iPhone tava gravando dados de localização. Não lembro direito o processo que arrumei, mas o resultado é bem da hora! Pra fazer a brincadeira funcionar, converti o arquivo original de Flash (.swf) para AVI. Aproveitei e postei no Reels do Instagram. Confira o vídeo abaixo:

Player de Flash

Segue um leitor exibidor player de Flash totalmente funcional:

sábado, 20 de abril de 2024

BP Tools - BPTools - excelente ferramenta criptografica para seu dia a dia

Quase que perco... NADA COMO UM BOM BACKUP!



Resumo: Relato sobre a importância do backup ao recuperar um software essencial, links para download do EFT calculator e dicas sobre licenças e versões antigas.

Quase que perco... NADA COMO UM BOM BACKUP! Os caras tao querendo cobrar 1000 doletas por ano de uso!

Screenshot do software EFT calculator recuperado de backup
Screenshot do software EFT calculator recuperado de backup

Os 2 modulos principais que é a calculadora e o enviador de comandos pro Thales tao ai, muito bom, achei lá atras no comecinho da firma dos caras, ainda chama EFT calculator e ja era bom!

Aqui o link pro drive pra baixar

https://drive.google.com/file/d/1wO1bOelY5CyJBKBcaWIbs40glBa-rBtY/view?usp=drive_link

e os links que eu tinha salvo achando que permalink é eterno!

https://www.eftlab.com/files/bp-tools-20.03-1271-master-a2e4297.exe

https://www.eftlab.com/download/win-3264/

quarta-feira, 31 de janeiro de 2024

Minha propria fonte pro computador!

Minha Fonte Digital: Projeto Concluído!

CAMPINAS, SP 31 DE JANEIRO DE 2024

Finalmente, após anos, consegui concluir a versão preliminar da minha fonte para documentos eletrônicos com a minha própria letra!

A sensação de ver esse projeto, que estava congelado há tanto tempo, tomando forma é indescritível, uma verdadeira perda de tempo!

Cada traço, cada detalhe, carrega consigo não apenas a tinta digital, mas também todo o esforço e a paixão que investi nesse trabalho. Ao longo desse processo, enfrentei inúmeros desafios e obstáculos, mas a persistência e a determinação me mantiveram focado no objetivo.

Ver a fonte funcionando, mesmo que em uma versão preliminar, é o tique que faltava na lista de pendências/tarefas, volto a dormir tranquilo.

Cada caractere impresso carrega a minha identidade, o resultado de incontáveis horas de trabalho e a vontade de criar algo único, novo, só meu!

Agora, mesmo sendo uma versão inicial, tenho em mãos um produto funcional, o que representa um marco significativo, essa conquista é apenas o começo de uma jornada de aperfeiçoamento e refinamento.

Ainda há muito a ser feito, mas a base está estabelecida e o caminho a ser percorrido se revela promissor, não que vá ter uma segunda versão ou que eu volte a mexer com isso, mas vale a intenção.

Que essa fonte seja a materialização de toda a minha dedicação e paixão por finalizar itens de minhas listas, que não são poucas nem são poucos itens em cada.

Que cada documento escrito com essa fonte carregue não apenas palavras, mas também a expressão da minha satisfação em ver esse projeto ganhar vida.

Obrigado a todos os envolvidos!



Fonte do buga pra computador
Figura 1 - A fonte em ação

Fonte do Buga Bold
Figura 2 : fonte do Buga em bold

quinta-feira, 30 de novembro de 2023

The End of an Era - Last Mainframe Shutdown at Petrobras

Resumo: Buga comenta a desativação do mainframe da Petrobras há um ano, discutindo COBOL, legado, tentativas de migração e o futuro dos mainframes no setor bancário.

Desligando o Mainframe da Petrobras: Reflexões sobre Legado e Tecnologia

Há 1 ano a Petrobras tirava de operação seu mainframe!

Contexto e Histórico

Desde que comecei a trabalhar com cartão de crédito ouço falar que o mainframe está morrendo.

Existiram algumas tentativas em meados de 90 que deram em nada, quer dizer, giraram a economia, mas não atingiram o resultado pretendido. De uns 10 anos pra cá está rolando uma conversão automática de código COBOL pra Java, a própria IBM e no momento a Kyndryl tem projetos e oferece mão de obra e serviços para essa demanda, mas, na real, não funciona satisfatoriamente. A Cielo chegou a comprar um adquirente americano que rodava fora do ambiente mainframe pra incorporar a tecnologia, mas não deu certo.

Tentativas de Migração e Limitações

O que vai acabar com o mainframe não são as novas tecnologias, longe disso, até porque a maioria das tecnologias disruptivas que vemos atualmente nada mais são que usos de ideias e conceitos que já existem nos mainframes há décadas, mas isso é discussão acalorada e pra outra ocasião.

Atualmente, no setor bancário/cartão só existe 1 pilar que ainda sustenta o mainframe vivo, o legado!

De um sistema aqui, outro ali, vão migrando, convertendo, desligando algumas siglas, criando um novo sistema em baixa plataforma pra prover a mesma solução, movimento esse que nunca entendi creio que é mais seguir a onda, não ficar para trás porque tem gente fazendo assim preciso fazer também. Igual tantas outras modas como as metodologias ágeis ou ainda tentar aplicar testes de completude ou automatizados, que sequer fazem sentido pro COBOL.

Voltando ao legado, dependendo da aplicação, não dá pra reescrever, seja automaticamente ou não, não há pessoas que embarquem na ideia, o risco é inaceitável.

O Futuro dos Mainframes

Daria pros bancos continuarem pro resto da vida trabalhando com mainframes, sério!

O mainframe se adaptou, evoluiu mas demorou muito pra levar isso aos clientes, a IBM errou e errou feio ao não mudar seu modelo de negócio, restringir o acesso a tecnologia ao invés de incentivar como todos os players da computação em nuvem sempre fizeram, enfim agora é tarde, o estrago já foi feito e é irreparável.

O IBM mainframe continua evoluindo, o hardware está no limiar da tecnologia atual, os compiladores estão mais robustos e otimizados, os gerenciadores de transações, seja ela o tupiniquim GRI do Itaú Unibanco e do Banco do Brasil CICS continua uma obra de arte o IMS idem, seu banco de dados, o DB2 nem se fala e o Z/Os, seu sistema operacional é um espetáculo à parte!

O que decretará o fim da computação centralizada em hardwares Z da IBM será a migração de saldos, mas isso vai demorar um bocado, se é que acontecerá de verdade. Ainda não vi movimentação grande de nenhum banco nesse sentido (banco aqui leia-se, Santander Brasil, CAIXA, Banco Bradesco, Itaú Unibanco e Banco do Brasil).

Longa vida ao mainframe!

Escrito e revisto meia boca, porque to na hora do almoço!

Foto com a tela de shutdown do mainframe da Petrobras
Figura 1: Desligando pra sempre o mainframe da Petrobras

domingo, 9 de julho de 2023

Tela fica amarelada escureçe as 22:00 android

Tela Fica Amarelada e Escurece às 22:00 no Android

Essa daqui acontecia no Poco, no Pixel tinha a opção de desligar o modo noturno e funcionava até que bem, mas no Xiaomi de jeito nenhum. Achei por aí na net uma solução...

Passo a Passo para Desativar o Modo Noturno

Tem que baixar o Android Platform Tools. Você pode encontrar no link oficial:

Android Platform Tools

Coloque o celular em modo desenvolvedor e rode via ADB os três comandos abaixo.

Comandos ADB para Desativar o Modo Noturno

adb shell 'settings list secure'

adb shell 'settings put secure night_display_activated 0'

adb shell 'settings put secure night_display_auto_mode 0'

Pronto, tela amarela de noite nunca mais! Pensa num negócio que irritava horrores!

Contexto sobre o Modo Noturno

O modo noturno ou escuro, presente em dispositivos Android como os da Xiaomi (Poco X7, X3, F6, etc.), pode ser ativado ou desativado nas configurações de tela e brilho, conforme tutoriais disponíveis online. No entanto, quando o sistema força a ativação automática às 22:00 ou em horários específicos, pode ser necessário usar ferramentas como ADB para desativar completamente o recurso, especialmente se a opção não estiver acessível nas configurações padrão.

sábado, 17 de junho de 2023

Prova de conceito - POC - Jogo passa fase tipo Mario - Da pra fazer jogo sem saber nada de nada, só precisa de tempo e dedicação!

Achados de Backup: Prova de Conceito de um Jogo

Sempre bom dar uma vasculhada nos backups, as vezes achamos coisas bem interessantes!

Não consegui lembrar sequer o nome do programa que me possibilitou a criação dessa maravilha da tecnologia!

Da pra fazer jogo sem saber nada de nada, só precisa de tempo e dedicação!


Video 1 : Prova de Conceito

O pacote com o 'jogo'

https://drive.google.com/file/d/1ksC0HJBei3hpJ-psqVj0xjzsLEgIVGSw/view?usp=drive_link



O programa que criou essa maravilha foi o 

MMF2 - Multimedia Fusion 2

abri o pacote com o jogo no programa demo (download ai acima) e separei o 'fonte', ficou aqui

https://drive.google.com/file/d/13DCyWp2SLZcYkc5zOSQ_svYpPn4TCLmu/view?usp=sharing

quarta-feira, 19 de abril de 2023

Pacote de manuais do Vision Plus 2.7

Manuais Vision Plus 2.7: Relíquia PaySys encontrada!

Tava fuçando nos HDs antigos e eis que encontro os manuais do famoso Vision Plus, nessa época era da PaySys.

Tela do menu dos PDFs do pacote Vision Plus 2.7
Figura 1: Tela do menu dos PDFs

Árvore de arquivos do pacote Vision Plus 2.7

  
E:.
│   1front.pdf
│   copyright.pdf
│   Index.log
│   Index.pdx
│   migration instructions.pdf
│   ReleaseLevel.pdf
│
├───ASM
│   │   Asmfront.pdf
│   ├───REFERENC
│   │       asm25rf.pdf
│   │       Updates.pdf
│   └───TECH
│           Asm25te.pdf
│           FLOW.PDF
│           Updates.pdf
│
├───CDM
│   │   cdmfront.pdf
│   ├───REPORTS
│   │       Cdm61rp.pdf
│   │       Updates.pdf
│   ├───SCREENS
│   │       Cdm61sc.pdf
│   │       Updates.pdf
│   ├───TECH
│   │       Cdm61te.pdf
│   │       FLOW.PDF
│   │       Updates.pdf
│   └───USER
│           Cdm61ur.pdf
│           Updates.pdf
│
├───CMS
│   │   cmsfront.pdf
│   ├───REPORTS
│   │       Cms25rp.pdf
│   │       Updates.pdf
│   ├───SCREENS
│   │       Cms25sc.pdf
│   │       updates.pdf
│   ├───TECH
│   │       Cms25te.pdf
│   │       Flow.pdf
│   │       Updates.pdf
│   └───USER
│           Cms25ur.pdf
│           Updates.pdf
│
├───CSF
│   │   csffront.pdf
│   ├───CMS
│   │       cmscsfpr.pdf
│   │       nous.pdf
│   └───MBS
│           mbscsfpr.pdf
│           nous.pdf
│
├───CTA
│   │   Ctafront.pdf
│   ├───REPORTS
│   │       Cta61rp.pdf
│   │       Updates.pdf
│   ├───SCREENS
│   │       cta61sc.pdf
│   │       Updates.pdf
│   └───TECH
│           Cta61te.pdf
│           Flow.PDF
│           Updates.pdf
│
├───FAS
│   │   Fasfront.pdf
│   ├───REFERENC
│   │       Fasref.pdf
│   │       Updates.pdf
│   └───Technica
│           fastech.pdf
│           Flow.pdf
│           Updates.pdf
│
├───IMP
│       Imp60sy.pdf
│       Updates.pdf
│
├───ITS
│   │   Itsfront.pdf
│   ├───REFERENC
│   │       Its71rf.pdf
│   │       updates.pdf
│   └───TECH
│           flow.PDF
│           Its71te.pdf
│           Updates.pdf
│
├───LTS
│   │   Ltsfront.pdf
│   ├───REFERENC
│   │       Lts61rf.pdf
│   │       Updates.pdf
│   └───TECH
│           FLOW.PDF
│           Lts61te.pdf
│           Updates.pdf
│
├───MBS
│   │   mbsfront.pdf
│   ├───REPORTS
│   │       mbs27rp.pdf
│   │       Updates.pdf
│   ├───SCREEN
│   │       mbs27sc.pdf
│   │       Updates.pdf
│   ├───TECH
│   │       FLOW.PDF
│   │       Mbs27te.pdf
│   │       Updates.pdf
│   └───USER
│           Mbs27ur.pdf
│           Updates.pdf
│
├───SPP
│   │   sppfront.pdf
│   ├───REFERENC
│   │       Spp25ref.pdf
│   │       UPDATES.PDF
│   └───TECH
│           Spp25te.pdf
│           updates.pdf
│
├───SS
│       SS60gu.pdf
│       ssfront.pdf
│       Update.pdf
│
├───TramsAG
│       AGfront.pdf
│       TRMAG5.pdf
│       Updates.pdf
│
├───TRAMSBC
│   │   bcfront.pdf
│   ├───REFERENC
│   │       Bcre.pdf
│   │       Updates.pdf
│   └───TECH
│           bcte.pdf
│           updates.pdf
│
├───TRAMSDE
│   │   DEfront.pdf
│   ├───REFERENC
│   │       de71re.pdf
│   │       Updates.pdf
│   └───TECH
│           De71te.pdf
│           Updates.pdf
│
├───Tramsec
│   │   Ecfront.pdf
│   ├───REFERENC
│   │       t-ec7ref.pdf
│   │       Updates.pdf
│   └───Technica
│           T-ec7tec.pdf
│           Updates.pdf
│
├───TRIAD
│   │   trifront.pdf
│   ├───4.1
│   │   ├───CMS
│   │   │       Cmstriad.pdf
│   │   │       updates.pdf
│   │   └───FAS
│   │       └───TECH
│   │               Fastectr.pdf
│   │               nous.pdf
│   └───5.0
│       ├───cms
│       │       cms5.0.pdf
│       │       updates.pdf
│       └───fas
│               fas5.0.pdf
│               updates.pdf
│
├───TRMBASE
│   │   trmfront.pdf
│   ├───REFERENC
│   │       Trm71re.pdf
│   │       Updates.pdf
│   └───TECH
│           Trm71te.pdf
│           UPDATES.PDF
│
└───VPLUS400
    │   as400front.pdf
    │
    ├───AS400 Supplement
    │   │   AS400.pdf
    │   ├───ASM
    │   │   ├───Reference
    │   │   │       asmscre.pdf
    │   │   └───Technical
    │   │           asmtech.pdf
    │   ├───CMS
    │   │   ├───reports
    │   │   │       cmsrepo.pdf
    │   │   ├───screens
    │   │   │       Cmsscre.pdf
    │   │   └───tech
    │   │           Cmstech.pdf
    │   ├───CTA
    │   │   ├───Screens
    │   │   │       ctascre.pdf
    │   │   └───Tech
    │   │           ctatech.pdf
    │   └───FAS
    │       ├───Reference
    │       │       Fasref.pdf
    │       └───Tech
    │               fastech.pdf
    │
    ├───SS
    │       ssas400.pdf
    │
    └───Sys&Oper
            flow.pdf
            sys&op.pdf
            updates.pdf
  

Download do pacote completo

Baixar pacote Vision Plus 2.7 (Google Drive)

terça-feira, 18 de abril de 2023

Ofuscamento de código fonte - Source Code Obfuscation - TCC Pós graduação em Desenvolvimento de Sistemas Mainframe - BUGA

Proteção de Código Fonte via Ofuscamento – TCC - Faculdade ULT - Desenvolvimento Sistemas Mainframe

Resumo:
No desenvolvimento de software, principalmente em aplicações da era da internet, o ofuscamento de código é importante para proteger a propriedade intelectual. A legislação brasileira ainda não oferece proteção total contra cópias, modificações e uso não autorizado de programas. Técnicas de ofuscamento servem como camada extra de defesa, dificultando engenharia reversa e cópia indevida, especialmente em sistemas legados como mainframes em COBOL. Este trabalho apresenta conceitos, exemplos e códigos, ilustrando vantagens e desvantagens de cada técnica.

Palavras-chave: ofuscamento, código fonte, mainframe, engenharia reversa, proteção, patente, direitos autorais, COBOL, código redundante.

Documento completo do TCC:
Acessar o PDF do TCC

Lâminas da apresentação:
Acessar slides da apresentação


Tava vendo aqui, faz tanto tempo que ainda era meu nome morto.


Vídeo 1: Minha apresentação do TCC
Diploma de Pós-Graduação – Walter Buga Ramos
Figura 1: Meu diploma!

Transcrição da Apresentação do TCC – Proteção de Código Fonte via Ofuscamento

Olá, eu sou aluna do curso de Desenvolvimento de Sistemas Mainframe da ULT e esta é a apresentação do meu trabalho de conclusão de curso.

Vamos começar! Vou falar um pouquinho sobre o meu trabalho, que é sobre ofuscamento de código. Então, vou abordar um pouco sobre direito autoral, engenharia reversa, mecanismos de proteção contra engenharia reversa, as técnicas de ofuscamento de código (que é o foco do trabalho) e as conclusões que podemos tirar.

Proteção de software no Brasil

O que temos hoje para proteção de software no Brasil? Existem leis para proteger o código como obra literária. Você tem o direito de autor assegurado por lei: quem fez o programa tem o direito autoral sobre aquela obra que produziu.

Você também pode proteger programas juridicamente por meio de patentes. É possível patentear um programa de computador, gerando um pedido de patente no INPI. Após todo o trâmite, se aceito, seu software se torna patenteado. Esses dois sistemas de proteção (direito autoral e patente) funcionam no Brasil e resolvem disputas sobre cópias não autorizadas e execuções de código sem autorização do desenvolvedor.

O que cada proteção abrange

O direito autoral assegura proteção para telas, interfaces, estruturas do programa, código fonte e elementos literais. Compara-se o código-fonte para identificar cópias. Já a patente pode proteger fluxogramas inéditos, arquivos de banco de dados, algoritmos novos, funcionalidades específicas e inéditas. Se você criar um algoritmo novo e o patentear, ninguém pode usar sem sua autorização.

Tanto pelo direito autoral quanto pela patente, é possível fazer contratos para cessão de direitos ou pagamento de royalties.

Outras formas de proteção

Mesmo com registro de patente e direito autoral, a proteção não é absoluta. Se alguém copiar seu programa, você pode provar a autoria, mas o processo é burocrático e caro.

Outro caminho para proteger programas é dificultar a cópia através da engenharia reversa. A engenharia reversa tenta entender como um programa funciona a partir do executável, reproduzindo o código-fonte original ou funcionalidades similares. É uma técnica controversa, pois alguém pode se apropriar do trabalho de desenvolvimento sem permissão.

Engenharia reversa: quando é usada

A engenharia reversa pode ser útil se você perdeu o código-fonte original, mas ainda tem a aplicação. Em alguns casos, é justificável, mas na maioria das vezes é usada para obter código sem permissão do proprietário.

Mecanismos de proteção via software

Além da proteção jurídica, existe a proteção via software, que é dificultar a engenharia reversa. Uma das técnicas mais utilizadas é o ofuscamento de código, muito comum na internet e em linguagens como JavaScript. O objetivo é dificultar o entendimento do programa, tornando a engenharia reversa mais trabalhosa.

Técnicas de ofuscamento de código

  • Remover comentários e informações redundantes: Deixa o código mais enxuto e difícil de entender.
  • Renomear variáveis: Trocar nomes significativos por nomes aleatórios, dificultando a leitura.
  • Reordenar o código-fonte: Fazer saltos no fluxo do programa para embaralhar a lógica.
  • Trocar comandos e estruturas por equivalentes: Substituir comandos simples por outros mais complexos ou equivalentes.
  • Inserir código redundante: Adicionar trechos que não fazem nada, confundindo quem lê o código.

Essas técnicas são especialmente úteis em programas legados, como os escritos em COBOL para mainframe.

Exemplo prático: programa de tabuada

No trabalho, foi criado um programa de tabuada em COBOL. O código original é claro, bem comentado e fácil de entender. Após aplicar as técnicas de ofuscamento, o código ficou com variáveis sem significado, comandos reordenados e trechos embaralhados, mas o resultado da execução é idêntico ao original. Para o usuário, não há diferença, mas para quem tenta entender o código, fica muito mais difícil.

Conclusão

Não existe método 100% seguro para ofuscamento de código. As técnicas dificultam o entendimento e a engenharia reversa, mas não garantem proteção total. O custo-benefício deve ser avaliado: quanto mais rebuscado o código, mais difícil de entender, mas também mais difícil de manter. O ofuscamento é uma técnica interessante, fácil de aplicar e que pode proteger bem o código-fonte contra cópias e engenharia reversa.

Transcrição adaptada e formatada a partir do vídeo de apresentação do TCC sobre ofuscamento de código.

WALTER RAMOS NETO PROTEÇÃO DE CÓDIGO FONTE VIA OFUSCAMENTO UNIÃO LATINO AMERICANA DE TECNOLOGIA JAGUARIAÍVA, 2016 WALTER RAMOS NETO PROTEÇÃO DE CÓDIGO FONTE VIA OFUSCAMENTO Monografia apresentada à Banca Examinadora do Curso de Pós-Graduação Desenvolvimento de Sistemas Mainframe da ULT como exigência para sua conclusão, sob a orientação da Professora Maristela Regina Weinfurter Teixeira. UNIÃO LATINO AMERICANA DE TECNOLOGIA JAGUARIAÍVA, 2016 BANCA EXAMINADORA Jaguariaíva, ____ de____________ de 2016 Dedicatória Ao meu filho, Vinicius e minha companheira de longa data, Juliana. Amo vocês. Agradecimentos A todos profissionais envolvidos na elaboração, manutenção, controle e logística do curso de especialização em Desenvolvimento de Sistemas Mainframe da ULT. Ao Acir Mandello Junior por sua ajuda imprescindível nos momentos de problemas e inconsistências no sistema. Ao Juscelino Niano Lindolm por todo apoio administrativo ao longo do curso. A professora Maristela Regina Weinfurter Teixeira agradeço a ajuda na elaboração desse trabalho e paciência ao longo de todo o curso. A todos que, de uma forma ou de outra, colaboraram para a realização e finalização deste trabalho. where COBOL maintenance programming is considered a pleasant alternative to growing rice or raising pigs." -Edward Yourdon Resumo No desenvolvimento de software, principalmente em aplicações da era da internet, o ofuscamento de código é algo importante devido ao resguardo da proteção intelectual, mesmo assim o assunto é pouco conhecido e estudado nas universidades pobre em referências acadêmicas. A legislação em vigor no país não fornece um nível de proteção adequado para que o desenvolvedor de um software se sinta seguro contra cópias ilegais, modificações, usos não autorizados do conteúdo de seu programa e a pirataria, como proteção adicional pode-se utilizar técnicas de ofuscamento de código. Neste trabalho foram apresentadas técnicas com o objetivo de proteger o software contra engenharia reversa, oferecendo ao desenvolvedor resguardo dos danos que não são contemplados nas leis de software em vigor, através da transformação do programa original em ofuscado. Muitos sistemas versam sobre ou se relacionarem com sistemas legados, especialmente em mainframes; tais sistemas não possuem documentação suficiente ou até mesmo inexistente. Os conceitos, exemplos e partes de código ilustram as desvantagens e as vantagens do uso de cada técnica de proteção frente a tentativas de entendimento de programas através do uso da engenharia reversa. Esse trabalho acabou sendo também uma referência para que futuras gerações não repitam os erros do passado e que possam conscientemente proteger seu código quando necessário ou mesmo auxiliar no entendimento de algum programa que acabou sendo ofuscado ao longo dos anos sem que essa tenha sido a intenção. Palavras-chave: Ofuscamento; código fonte; mainframe; engenharia reversa; prote ção; patente; direitos autorais; COBOL; código redundante. Abstract In software development, especially in the era of internet applications, code obfuscation is usual its use in Java programs a market practice, yet it is little known and studied in universities lacking academic references. In mainframe environment, the source code is accidentally obfuscated and is very well used in COBOL programs of legacy systems. The law does not provide an adequate level of protection for developer feel secure against copying, modification and unauthorized use of the content of their program, the use of obfuscation techniques provides a complementary additional protection. In this work were presented techniques to protect software against reverse engineering, providing additional layer of protection against damages that are not covered by software laws, by transforming the original program in obfuscated program. Many systems deal with or relate to legacy systems, especially in mainframes; such systems do not have sufficient documentation or are nonexistent, the source code is not commented, their complex structures, there are portions that are no longer executed, finally, some programs are almost unintelligible. In many source codes existing today on mainframes can be said that the source code is obfuscated because they present characteristic elements of protection techniques used in obfuscation. The concepts, examples and code portions illustrate the disadvantages and advantages of using each protection technique against the attempts of reverse engineering. This work can be used as a reference so that future generations do not repeat past mistakes and can consciously protect your code when necessary or even help to understand some program that was eventually obfuscated over the years without being the intention. Key Words: Obfuscating; source code; mainframe; reverse engineering; protection; patent; copyright; COBOL; redundant code. Lista de ilustrações Figura -Processo de Engenharia Progressiva x Engenharia Reversa Figura Figura -Trecho de código fonte com dead code Figura -Trecho de código fonte original Figura -Programa HelloWorld em COBOL Apêndice A Figura -Programa HelloWorld em COBOL ofuscado Apêndice B Figura -Execução do programa TABUADA Lista de tabelas Tabela 1 -Patente x Direito autoral Lista de abreviaturas AMD Advanced Micro Devices CEE Comunidade Econômica Europeia COBOL COmmon Business Oriented Language ER Engenharia Reversa IBM Internacional Business Machines INPI Instituto Nacional da Propriedade Industrial OMPI Organização Mundial da Propriedade Intelectual TRIPS Trade-Related Aspects of Intellectual Property Rights WWW World Wide Web Sumário PROTEÇÃO DE CÓDIGO FONTE VIA OFUSCAMENTO.................................................................... 1 PROTEÇÃO DE CÓDIGO FONTE VIA OFUSCAMENTO.................................................................... 2 Dedicatória ............................................................................................................................................. 4 Agradecimentos .................................................................................................................................... 5 Epigrafe .................................................................................................................................................. 6 Resumo .................................................................................................................................................. 7 Abstract .................................................................................................................................................. 8 Lista de ilustrações............................................................................................................................... 9 Lista de tabelas.................................................................................................................................... 10 Lista de abreviaturas .......................................................................................................................... 11 Introdução ............................................................................................................................................ 13 Capítulo 1 -Direito autoral e Ofuscamento em programas de computador ................................. 15 1.1. Direitos autorais e programas de computador ...................................................................... 15 1.2. A Origem do Ofuscamento de código de Programas de Computador ................................. 18 Capítulo 2 Engenharia Reversa ...................................................................................................... 20 2.1. As Origens da Engenharia Reversa..................................................................................... 20 2.2. É correto utilizar a engenharia reversa ? .............................................................................. 23 2.3. Questões Econômicas da Engenharia Reversa ................................................................... 25 Capítulo 3 Mecanismos de Proteção.............................................................................................. 27 3.1. Mecanismos de Proteção Jurídica ........................................................................................ 27 3.2. Mecanismos de Proteção via Software ................................................................................. 28 Capítulo 4 -Técnicas de ofuscamento.............................................................................................. 31 4.1. Auto documentação............................................................................................................... 33 4.2. Minificação de código ............................................................................................................ 35 4.3. Minificação e ofuscamento.................................................................................................... 37 4.4. Compilação e link edição ...................................................................................................... 39 4.5. Código redundante ................................................................................................................ 40 4.6. Geração de dumb code......................................................................................................... 43 4.7. Revisão de código e padronização ....................................................................................... 44 Conclusão ............................................................................................................................................ 46 REFERÊNCIAS..................................................................................................................................... 48 ANEXO A FOLHETO DE DIVULGAÇÃO SOFTWARE DE OFUSCAMENTO ................................ 53 APÊNDICE A -CÓDIGO FONTE PROGRAMA COBOL HELLO SEM OFUSCAMENTO................. 57 APÊNDICE B -CÓDIGO FONTE PROGRAMA COBOL HELLO OFUSCADO ................................. 58 APÊNDICE C -CÓDIGO FONTE PROGRAMA TABUADA SEM OFUSCAMENTO ......................... 59 APÊNDICE D -CÓDIGO FONTE PROGRAMA TABUADA OFUSCADO.......................................... 62 APÊNDICE E EXECUÇÃO DO PROGRAMA TABUADA ................................................................ 63 Introdução A proteção de código fonte vem sendo uma grande preocupação das corporações ao longo das últimas décadas por inúmeros fatores que serão expostos ao longo desse trabalho, uma das maneiras existentes para tal processo é o ofuscamento. Segundo AURÉLIO 2001, ofuscar tem o significado de ocultar, encobrir, impedir de ver ou de ser visto, turvar, tornar menos claro ou menos perceptível, empanar, fazer diminuir a intensidade, toldar, turvar a vista, perder o brilho. Observa-se que o objetivo principal do ofuscamento é o de dificultar a visualização de algo, assim sendo, a técnica que será apresentada nesse trabalho visa proteger os códigos fontes de programas através da implantação de elementos que turvem a leitura do código. Uma das formas de proteção existente é a proteção de software através do depósito de patente e registro de programas junto aos órgãos competentes, no caso do Brasil o INPI -Instituto Nacional da Propriedade Industrial, essa caracteriza abordagem jurídica para a proteção a outra forma é através de alterações no código fonte do programa. No capítulo I serão abordados temas relacionados ao direito autoral aplicado a códigos fonte de programas de computador suas implicações e consequências. Além do direito do autor será apresentada uma abordagem que visa proteger tais programas através de técnicas computacionais conhecidas como ofuscamento de código. O capítulo II traz uma discussão sobre a origem da engenharia reversa, realiza uma análise sobre ser correto ou não o uso de tal abordagem sob o ponto de vista jurídico, suas implicações e como ela é vista pelas leis brasileiras e pela comunidade internacional, aborda também as questões econômicas associadas ao uso da engenharia reversa. Já no capítulo III são apresentados os mecanismos de proteção de programas de computador. São discutidas as bases para a proteção de programas de compu tador através de modificações no código fonte e retoma-se a discussão sobre o direito autoral, mas agora com um viés de proteção diferente do capítulo I que apresentava a legislação vigente. No capítulo IV são abordadas diversas técnicas de ofuscamento de código segundo uma sequência de mais fácil entendimento iniciando-se pela auto documentação, seguida pela minificação de código, uma abordagem um pouco mais complexa e necessária é o processo de compilação e link edição, são apresentadas para finalizar o capítulo e as técnicas de ofuscamento conhecido o código redundante e a geração de dumb code ambas de alta complexidade e difícil entendimento e aplicação. Para finalizar o capítulo apresenta-se a revisão de código fonte. Na conclusão são considerados todos os aspectos levantados ao longo do texto e são apresentadas as conclusões sobre o ofuscamento de código que podem ser obtidas desse trabalho. Capítulo 1 -Direito autoral e Ofuscamento em programas de computador 1.1. Direitos autorais e programas de computador O software tornou-se um bem no início da década de 70 (Pereira dos Santos, 1997). Desde então iniciou-se uma série de medidas internacionais para protegê-lo. No Brasil apenas em 1987 foi promulgada a lei do software que protege o direito do autor de programas de computador. Em 1990 a União Europeia através da Diretiva 91/250/CEE definiu um padrão mínimo de proteção, complementados pelos acordos TRIPS (Acordo sobre os Aspectos dos Direitos de Propriedade Intelectual Relacionados ao Comércio) de 1994 e Tratado de direito de autor da OMPI de 1996. Em 2000 os tratados internacionais sobre o tema passaram a diferenciar a tecnologia empregada como um adicional a ser protegido, visto que a funcionalidade de um programa não é objeto de proteção através do direito autoral e sim através de patentes. (Pereira dos Santos, 1997). O código fonte em tese não circula, pois é no código fonte que contém o trabalho intelectual e a tecnologia do programa de computador. O que se tem é a patente de invenção implementada pelo programa de computador, o código não é protegido por patente e sim por direito autoral, porém é algo extremamente complicado defender que um programa não foi copiado de outro ou qual foi produzido primeiro. Em vista disso a utilização de técnicas computacionais auxilia o direito no que diz respeito à cópia indevida, pois se o código fonte for ininteligível, possuir marcas únicas e características (marca ) fica facilitado o processo de garantia de propriedade intelectual. Pode-se patentear a solução técnica que o software implementa, não suas funcionalidades, afinal a solução é uma invenção e uma forma de corrigir algum problema, entretanto o código e os melhoramentos não podem ser patenteados sendo protegidos apenas por direito de autor o qual apresenta dificuldades em sua defesa isto porque as leis vigentes segregaram o direito do autor e a propriedade intelectual conforme ilustra a tabela 1. Direito do autor Propriedade Intelectual (patente) Interfaces/Telas Fluxograma Estrutura Formato de arquivos e banco de dados Código Fonte Algoritmo Elementos Literais Funcionalidade Tabela 1 -Patente x Direito autoral Com a proteção pelo sistema de patente, protege-se o objeto com a funcionalidade que o programa introduziu. Para tanto, o software deve preencher as condições necessárias para solicitação do patenteamento, que são: resolução de um problema técnico encontrado no estado da técnica, resultar em aplicação prática e ter efeito técnico novo. (Lei nº10.196, 2001) No Brasil temos uma sistemática bem específica sobre a proteção autoral. Em 1987 a lei 7646 apresentava duas partes distintas, o regime de proteção e a comercialização, ela reservava mercado para produtos e empresas nacionais desde que existisse a tecnologia e empresas no Brasil que suprissem as necessidades. O mainframe podia ser vendido pela IBM pois não existia nem a tecnologia nem empresas que o fabricassem. Já em 1998 com a promulgação da lei 9609 foram estabelecidos o tratamento igualitário para produto estrangeiro e nacional e o fim da reserva de mercado. Previu-se também o programa de computador como obra intelectual protegida. Atualmente o regime básico do programa de computador é o da lei especial, com a aplicação subsidiária da legislação do direito de autor podendo dessa forma, o autor, reivindicar a paternidade do programa de computador e o de opor-se a alterações não autorizadas quando impliquem deformação, mutilação ou outra modificação em seu programa (Pereira dos Santos, 1997). O prazo para a proteção é de 50 anos e em termos jurídicos a lógica central do programa é de domínio público. Os direitos sobre os programas de computador são regidos pela lei 7646/87 que basicamente diz que salvo disposição em contrário, o empregador ou contratante do serviço é dona dos direitos desse programa. As boas práticas do mercado reforçam essa prerrogativa nos contratos de trabalho e prestação de serviço, sendo recomendável a entrega do código fonte, que é a tecnologia propriamente dita. (Murta,1998) Como diversos programas podem realizar a mesma função e possuírem códigos fontes distintos o direito do autor que é baseado em elementos literais deixa de proteger esse software uma vez que apenas o código fonte (estrutura geral, telas e interfaces de usuários) e o código objeto (carga ou executável) são protegidos pelo direito autoral. Uma alteração um pouco rebuscada no código fonte original já faz com que um perito não consiga classificar o novo código fonte (ou objeto) como uma cópia do original. A proteção apenas pelo direito autoral contra cópia, plágio, aproximação, aproveitamento, clonagem, reutilização é insuficiente pois a confirmação dessas práticas é extremamente complexa e por vezes não pode ser afirmada com precisão, embora seja uma cópia se não for descarada não é um processo simples. É indicado o uso de patente para complementar a proteção do código protegendo assim o algoritmo utilizado, a funcionalidade, o fluxograma, parâmetros, estrutura de dados e arquivos. (Dragoni, 2014) Dois ou mais programas podem ser semelhantes em dadas situações e totalmente diferentes em outras embora possam possuir funcionalidades equivalentes a comprovação da cópia é extremamente trabalhosa. Muitas vezes a semelhança de funcionalidade gera a semelhança na forma de expressão, seja por causa da observância de conceitos normativos e técnicos ou mesmo pelas características funcionais da aplicação, por vezes a implementação de determinado algoritmo só pode ser feito de uma forma e se ambos programas o utilizarem eles serão iguais, e mesmo assim não serão cópias. Para casos de plágio, segundo as leis vigentes, não é violação de direito de autor quando ocorrer semelhança entre programas que se derem por força das ca racterísticas funcionais de sua aplicação, da observância de preceitos normativos e técnicos, ou de limitação de forma alternativa para sua expressão. (Art. 6, III, Lei 9609/98, previsão idêntica ao art. 7, III, da lei 7646/87) Em síntese, o sistema do Direito Autoral é muito bom para cópia servil, mas quando se trata de proteger tecnologia e evitar o plágio não é o melhor sistema. 1.2. A Origem do Ofuscamento de código de Programas de Computador Devido à maneira como foi concebida a tecnologia utilizada na World Wide Web, leia-se internet, não há como proibir o acesso a determinados códigos fontes, como os javascripts por exemplo. A saída encontrada pelos profissionais de TI foi fazer códigos nos quais mesmo o usuário tendo acesso a ele não consiga entender o que ele faz. Uma sacada sensacional que recebeu o nome de ofuscamento, essa técnica é uma das formas mais fáceis e baratas para proteger um software contra engenharia reversa. (Collberg et al, 2002) A técnica do ofuscamento tem como objetivo principal tornar códigos ininteligíveis, mesmo quando não esse objetivo não é atingido, a sua simples utilização produz um considerável aumento na dificuldade de leitura do código. O processo é simples em seu conceito e sua utilização é justificada pela preservação da propriedade intelectual do desenvolvedor do software. (Somekawa, 2012) Simples transformações de layout são suficientes para dificultar a compreensão de um código, tais alterações associadas com transformações no fluxo do processamento, inclusão de variáveis sem sentido e definições não usuais completam o ferramental básico para dificultar a análise e entendimento de um código fonte. (Collberg et al, 1997) De carona no ofuscamento veio uma prática que há muito já é de conhecimento do programador COBOL que não segue muito os padrões de sua firma e prefere a velocidade no desenvolvimento do código em detrimento a clareza para o entendimento das futuras gerações. Ofuscação de código tem sido utilizado majoritariamente em 3 grandes áreas, na manutenção evolutiva de sistemas na qual a nova versão do programa tenha recebido apenas alguns ajustes ou uma nova funcionalidade o código fonte é totalmente diferente, na integridade do programa visto que o código fonte sendo de difícil compreensão sua modificação é muito mais complicada e para a proteção de direitos como no caso dos algoritmos. (Cohen, 1993) As técnicas de ofuscação abordadas nesse trabalho são classificadas como estáticas, isto é, após o código ter sido ofuscado ele não mais sofrerá alterações. Existem as dinâmicas que fogem ao escopo desse trabalho nas quais alterações continuam a ocorrer no programa (geradas e mantidas por ele mesmo) em seu próprio funcionamento muito utilizado em vírus de computador (VírusBrasil, 2016). Nesse capítulo foi apresentado um estudo sobre a legislação brasileira e sobre tratados internacionais que apresentam como tema a proteção de programas de computador, desde o programa pronto até seu código fonte que é o artefato/insumo para a produção de todo e qualquer software. As diferenças básicas entre o que pode ser e é protegido por lei de autor e por patente é apresentada na tabela 1 e discutida ao longo do texto. Da análise da legislação e do programa de patentes verifica-se que os meios jurídicos não fornecem a proteção necessária para uma completa blindagem dos softwares sendo necessária a aplicação de uma camada extra de segurança nos programas que é fornecida através do ofuscamento de código. Capítulo 2 Engenharia Reversa 2.1. As Origens da Engenharia Reversa A expressão é originária do direito norte-americano de conhecida na indústria de hardware, bélica, automação e de semicondutores. Por que utilizar engenharia reversa de software? O programa é comercializado em código objeto. O registro de programas resguarda o sigilo do código fonte. O código fonte é tratado como segredo empresarial. A utilização da engenharia reversa é indicada em algumas situações: Quando se possui o código fonte do sistema, mas não existe sua documentação. Existência de código duplicado. Dificuldade de manutenção do sistema. Erros gerando outros erros. Processos que possuem comportamento desconhecido e imprevisível. Os objetivos principais da engenharia reversa são: Interoperabilidade Clonagem Suporte técnico Em relação a interoperabilidade a engenharia reversa objetiva o desenvolvimento de interfaces lógicas (compatibilidade entre programas), por sua vez a clonagem objetiva apenas cópia das funcionalidades do programa, por vezes estendendo- se até mesmo a interfaces de uso do usuário, finalizando o suporte técnico é uma vertente que visa a correção de erros, introdução de modificações e desenvolvimen to de adaptações, sendo por vezes autorizado e dessa maneira, lícito do ponto de vida jurídico. (Fetrim, 1999) A engenharia reversa pode gerar diferentes níveis de abstração, sendo que cada nível requer uma determinada quantidade de esforço por parte do investigador. Quanto maior o nível de abstração melhor a compreensão e facilidade do entendimento do funcionamento do programa. O processo de análise e compreensão de um programa já existente e funcional com o objetivo de entender o seu funcionamento é o que melhor define a engenharia reversa. (Fetrim, 1999) A obtenção dos elementos do código fonte de um programa de computador a partir do seu código objeto é um dos objetivos preconizados pela engenharia reversa. Os passos para obtenção do código fonte são: (a) Análise do funcionamento do programa (black box analysis em inglês), e (b) Descompilação ou desassemblagem que é o processo inverso ao da com- Compilar é transformar o código fonte em objeto, o processo inverso chama- se descompilação que é o ato de converter um arquivo inteligível apenas para os computadores em um código fonte que pode ser interpretada por detentores de co nhecimento de determinada linguagem de computação. A engenharia reversa e código a partir do programa compilado em seu objeto que é o entendimento do programa. (Boccardo, 2010) que é a visualização do ecuperação d 2.1. A abstração como ato transformador Atos destinados a obter, a partir de um produto acabado, o código fonte que deu origem ao programa é um processo extremamente trabalhoso que envolve quase que todas as áreas do conhecimento relacionadas ao desenvolvimento de softwares. Entretanto nenhuma disciplina versa sobre a abstração, que é a habilidade primordial para que esse tipo de processo logre êxito. A abstração apresenta diversos níveis sendo que cada passo no processo de desenvolvimento de software seria um refinamento do nível anterior contendo um maior detalhamento das funções que serão realizadas por esse nível. (Lynn, 2004) Informações numa forma mais global possuem alto grau de abstração sendo que seu extremo oposto seria a forma mais detalhada que apresenta baixo grau de abstração. Nos passos ou estágios iniciais do ciclo de vida de um software as informações possuem alto nível de abstração e nos estágios finais baixo nível de abstração Figura 1 -Processo de Engenharia Progressiva x Engenharia Reversa1 A engenharia progressiva é o processo tradicional de desenvolvimento de um software é regida pela disciplina de engenharia de software e é caracteriza-se por desenvolvimento em cascata no qual partindo de um nível de abstração alto chega- se a um nível baixo. Em contrapartida a engenharia progressiva temos a engenharia reversa que partem de um baixo nível de abstração para um alto nível e tem como objetivo a descoberta de como um programa foi feito e de como ele funciona. Extraido de: Valéria Delisandra Fetrim, Apoio à Documentação de Engenharia Reversa de Software por Meio de Hipertextos, Dissertação de Mestrado, USP-São Carlos, 1999, p. 9. 2.2. É correto utilizar a engenharia reversa? Duas correntes em 1980 surgiram para estudar a lógica de um programa. Uma delas defendia que a engenharia reversa deveria ser livre e praticada sem qualquer tipo de intervenção ou de regras. A outra corrente por sua vez afirmava que o estudo de um programa através da engenharia reversa não devia ser permitido. (Pereira dos Santos, 1997). Menos de uma década depois do início dos debates sobre a possibilidade de se estudar um programa através da engenharia reversa ser uma pratica livre ou não. A corrente de pensamento que prevaleceu e está em vigor até a atualidade foi a de proibir a engenharia reversa. O que se discute no direito é o processo da engenharia reversa e não o que se faz depois que se obtém o pseudocódigo fonte. Do ponto de vista da compatibilidade com o sistema de Direito de Autor existem: (a) Exclusão da proteção de ideias, conceitos, etc. Todos que utilizam um algoritmo de um programa já existente, mas que gerariam seu programa de uma forma essencialmente diferente não seria responsável por violação de direitos autorais. (ULMER & KOLLE, 1983)2 Basicamente entende-se que a utilização de um algoritmo não pode ser considerada uma violação de direito autoral. (b) A proibição pela Lei de Direitos Autorais equivale a criar um regime de segredo do conteúdo do programa inaplicável às obras tradicionais. direitos de autor para o software permite, pela primeira vez na história das propri (BERNARD, 1993)3 Da tradução livre observa-se que o direito do autor no âmbito do software é considerado um segredo. (c) A engenharia reversa pode implicar a realização de atos atentatórios contra a exclusividade do autor. A reprodução e transformação da forma de expressão do programa de computador obtido através da engenharia reversa do código objeto para extração do pseudocódigo transitória ou incidental está prevista e proibida pelo Art. 30, § 1o da Lei Direito Autoral. Segundo as leis vigentes (Lei 9.609/98 Lei do Software) não é necessária a autorização do titular dos direitos quando a reprodução do código e a tradução da sua forma forem indispensáveis para obter as informações necessárias à interoperabilidade de um programa de computador criado independentemente, com outros programas, uma vez preenchidas as seguintes condições: (a) esses atos serem realizados pelo licenciado ou por outra pessoa que tenha o direito de utilizar uma cópia do programa, ou em seu nome por uma pessoa devidamente autorizada para o efeito; (b) não se encontrarem já fácil e rapidamente à disposição das pessoas referidas as informações necessárias à interoperabilidade; (c) esses atos limitarem-se a certas partes do programa de origem necessárias à interoperabilidade. O Art. 6, IV da Lei 9.609/98 (Lei do Software) cita possibilidades de estudo que não constituem ofensa aos direitos do titular de programa de computador, sendo a) Integração de um programa, mantendo-se suas características essenciais, a um sistema aplicativo ou operacional, tecnicamente indispensável às necessidades do usuário, desde que para o uso exclusivo de quem a promoveu. Dessa forma, a descompilação segundo a lei vigente sobre softwares de computador brasileira seria livre, embora não seja legal, ela pode ser realizada sem punição. Segundo Oliveira Ascensão (Direito Autoral, 1997, p. 671) orquanto a integração, requerendo ato de transformação ou adaptação, pressupõe a descompilação, ou seja, a proteção não é legal, mas todas as licenças de uso de software proíbem a engenharia reversa. 2.3. Questões Econômicas da Engenharia Reversa O benefício fundamental da tecnologia de ER (Engenharia Reversa) é o aumento do entendimento de um sistema o que facilita a atividade de manutenção e consequentemente aumento da produtividade (vantagens financeiras). As partes do sistema que vão sofrendo a engenharia reversa já são funcionais e podem ser utilizadas em outras aplicações. O aumento da produtividade na etapa de desenvolvimento de software através do reuso, garantindo a qualidade já existente no aplicativo original torna o sistema mais fácil de ser mantido, suportado e evoluído. (Penteado, 2009) Baseado nas características do sistema que sofrerá o processo de Engenharia Reversa não se pode no início da análise quantificar com precisão quanto trabalho será necessário para obter o sistema funcional desassemblado, isto é, seu código fonte. Em vista disso, nas aplicações da Engenharia Reversa os custos podem ser invariavelmente difusos dependendo de como foi concebido o software, podendo ser facilmente analisado e gerado um código fonte novo com iguais funcionalidades ou extremamente complexo a ponto de inviabilizar a ER mas qualquer que seja o caso, apenas depois de iniciada a análise é que será conhecida a complexidade do desafio. (Ayres,1987) A ER pode facilitar novos desenvolvimentos pelo exame de como sistemas similares foram construídos e assim as equipes de projetistas podem obter mais informações para as decisões a serem tomadas nos novos projetos, como foi o notório caso apresentado a quem estuda essa área que é a do bombardeiro da segunda guerra mundial o Tupolev. (Gordon, 2002) Todo projeto que vá utilizar a ER, além das implicações econômicas, deve sempre levar em consideração as implicações legais. Os japoneses no pós-guerra adotaram a ER de maneira massiva, o que contribui positivamente em sua indústria até 1960 quando deixaram de simplesmente copiar produtos e tecnologias e passaram a desenvolvê-las. (Sicsu, 1989), No episódio russo do avião bombardeiro Tupolev, os russos optaram por realizar a engenharia reversa de um avião já pronto e funcional ao invés de criarem um projeto novo para seu novo bombardeiro, no caso dos russos eles conseguiram realizar uma análise que os fez optar pela engenharia reversa ao processo tradicional, mesmo que os custos dessa operação fossem bem mais elevados o prazo estimado para a execução da ER foi bem inferior ao do projeto tradicional. Nesse capítulo foi apresentado um estudo sobre a engenharia reversa seus aspectos legais analisando-se diversos estudioso do tema os quais chega-se à conclusão que a engenharia reversa embora seja algo ilegal do ponto de vista jurídico pode ser considerada uma pratica livre. Foram elencados motivos e os objetivos para a utilização da engenharia reversa. Os passos que são seguidos no processo da análise do funcionamento até sua desassemblagem e obtenção do código fonte também foram citados. Traçou-se um paralelo entre o processo comum de engenharia progressiva/tradicional e a engenharia reversa (figura 1) E para finalizar foi citado um episódio de engenharia reversa utilizada durante a segunda guerra mundial na qual os custos do projeto de ER superaram em muito o da engenharia tradicional, mas foi escolhido devido ao curto prazo para implantação do produto. Capítulo 3 Mecanismos de Proteção Existem apenas dois tipos de proteção aos programas de computador que podem ser utilizadas, a proteção jurídica através de registro de obra intelectual e de patentes ou via software com modificações nos programas evitando seu entendimento e possíveis cópias. A proteção do software como um problema de âmbito global tratado pelo direito surgiu há mais de três décadas e sempre foi tratado com duas vertentes, o direito do autor e a patente, sendo que ambos sistemas de proteção coexistem em harmonia e são complementados pela proteção via software. 3.1. Mecanismos de Proteção Jurídica Existe uma natureza dualista, ou híbrida, do software como sendo uma criação utilitária como um processo ou como uma forma de expressão. Sob a ótica estritamente funcional uma criação técnica que vise a solução de problemas específicos (caráter utilitário) deve ser enquadrada como um processo, já sob a ótica da geração de saber, o software seria uma forma de expressão pois envolve a implementação de um processo lógico, isso é, o software é um conjunto organizado de instruções para a realização de funções determinadas. (Pereira dos Santos, 1997). O software possui aspecto simbólico e textual da mesma forma que uma criação intelectual que se exterioriza pelo modo expressivo (obra intelectual), dessa forma o programa de computador é implementado utilizando uma linguagem natural e codificada. (Lei nº10.196 sobre Propriedade Industrial de 2001) Justamente por apresentar essa natureza hibrida, de obra intelectual e de inovação, o software pode ser protegido tanto pelo direito do autor como através de patentes. Sob a tutela do direito autoral a criação, como natureza jurídica de obra intelectual, protege apenas e unicamente o código fonte e seus elementos literais e não literais, a tutela legal fica então sujeita ao critério de originalidade, caso o código so fra algumas modificações que descaracterizem sua origem, o direito do autor não consegue proteger esses casos. Por sua vez no caso da patente, como a natureza jurídica é de invenção -sendo que a tutela legal incide basicamente sobre a solução técnica (especificações), critérios de novidade, atividade inventiva e aplicação industrial -a inovação é protegida. Então, proteção de software é um problema universal que todos os países têm de lidar. Proteção de Software é também um velho problema... Eu digo velho novo problema, porque a questão agora data de cerca de trinta anos, pelo menos nos países onde a computação conheceu seus primeiros desenvolvimentos. No entanto, é uma questão tópica. E esse é o caso, porque, mesmo que o acordo TRIPS diz em seu artigo 7º: "Os programas de computador, quer seja o código fonte ou objeto, serão protegidos como obras literárias conforme a Convenção de Berna (1971)", a pergunta que perdurou por dez ou quinze anos, de acordo com os países, da patente na abordagem da "protegibilidade". Na verdade, a história da proteção de software é uma história caótica. E a questão da proteção de software aparece hoje como uma questão de "oscilação" entre os dois polos que, por um lado é copyright (direito autoral) e, por outro lado, é patente, com o que implica em termos de complexidade. É necessário saber sobre ao direito do autor do software e sobre a sua patenteabilidade, mas também sobre a coexistência de dois sistemas de proteção. (VIVANT, 2009)4 Pode-se inferir que devido as características intrínsecas dos programas de computador, mais especificamente pela sua inovação e por sua maneira de ser expresso como uma obra intelectual; os softwares podem ser protegidos juridicamente tanto pelo sistema de patentes como por direito autoral. 3.2. Mecanismos de Proteção via Software As técnicas de proteção de um software visam dificultar a engenharia reversa, assegurando que o software executa como esperado e protegendo o software de pirataria. (Collberg et al, 1998) Existem algumas técnicas para esconder informações em programas de computador, o presente trabalho focará em 3 tipos que além de esconder, protegem o código e lhe fornecem uma grande capacidade de incompreensão. Técnicas de ofuscação de código dificultam engenharia reversa através de um aumento no grau de ininteligibilidade do código. Este aumento se caracteriza por modificações sintáticas que dificultam a compreensão do software mantendo, porém, as funcionalidades originais do programa (sua semântica). (Boccardo, 2010) Avanços incrementam o poder dos software para engenharia reversa com o objetivo de descobrir vulnerabilidades, realizar alterações indevidas, ou furtar propriedade intelectual... Atualmente, existe pouco conhecimento, entre os desenvolvedores de software, sobre a importância do uso destas (BOCCARDO, 2010) A engenharia reversa em programas de computador envolve geralmente duas fases: análise e modificação. Na análise, é objetivado compreender como funciona o programa, a modificação por sua vez se dá quando já se possui o conhecimento adequado do software e então pode-se criar um novo a partir do que foi compreendido. A utilização de técnicas de ofuscamento de código tenta dificultar o entendimento do software através da modificação de alguma parte do programa, da extração de algoritmos e sua substituição por outros, alteração nas rotinas de cálculos, mudanças no fluxo seguido pelo programa. Para implementar essas técnicas o programador vai adicionando, alterando e modificando diversos elementos em um programa fazendo com que ele se torne o mais rebuscado possível sem alterar seu funcionamento. Zaytsev (2005) Ofuscar um programa refere-se entre outros aspectos a geração de um novo programa funcionalmente equivalente no qual a coleta de dados de funcionamento por engenharia reversa é extremamente mais complexa que no programa não ofuscado. É recomendável que o programa que será ofuscado já esteja pronto, testado e funcionando conforme as especificações que lhe foram propostas, pois as altera ções implementadas para ofuscar o código não devem de maneira alguma alterar o funcionamento original do software. Do ponto de vista da propriedade intelectual, essas técnicas utilizadas pelos analistas, desenvolvedores, programadores visam esconder informações sobre tópicos que não podem possuir propriedade, como é o caso dos algoritmos -seja esse algoritmo uma novidade ou uma versão aprimorada de algum já existente que depois de muito investimento para implementá-lo percebe-se que não é muito lucrativo distribui-lo livremente. A ofuscação de código fonte tem se mostrado uma técnica bastante útil para esconder informações valiosas dentro de um programa. (Collberg et al, 1997) O ofuscamento do código fonte eleva a dificuldade de compreensão do código levando o programador espião a desistir da análise visto a alta complexidade do programa. Essa análise de um código a fim de determinar suas funcionalidades, características visando o entendimento do programa como um todo recebe o nome de engenharia reversa. A dificuldade no entendimento do código ofuscado se baseia na quantidade de dinheiro e tempo que serão gastos na análise do programa (Collberg et al, 1997) Um efeito secundário e positivo que o ofuscamento acaba produzindo é o aumento da segurança do programa contra tentativas de ataque, popularmente conhecido como hackea-lo, isto é, contra tentativas de descobrimento de vulnerabilidades, uma vez que estando o programa praticamente ilegível, a dificuldade para encontrar erros e falhas é altamente elevada, afinal, o adversário ou invasor sequer entende o que o programa está fazendo. Os mecanismos de proteção via software são técnicas utilizadas para ofuscar um sistema de computador as quais versam, em sua grande maioria, sobre alterações na estrutura do código fonte do programa através da inclusão de artifícios que possuem a finalidade pura e simples de confundir e dificultar o entendimento do que o programa é e do que o programa faz de verdade. Capítulo 4 -Técnicas de ofuscamento Conforme explicitado nos capítulos anteriores, como mecanismos para proteger um programa de computador existem a via jurídica e a via do software, dando continuidade e aprofundando os conhecimentos relativos à proteção via softwares temos as técnicas de ofuscamento de código. Dentre as técnicas estáticas existem alguns grupamentos de acordo com as transformações a serem realizadas no código, como: -Alterações apenas na estrutura do código que não geram diferença no código objeto / programa final e que versam sobre a remoção de informações redundantes ou desnecessários, em inglês minyfi e a renomeação de identificadores e variáveis. 4 Figura 2 - Alterações no fluxo de processamento do programa que geram diferença no código objeto / programa final causando um maior consumo de CPU que o programa gerado pelo código original tais como dificultar a análise do fluxo de controle pela inserção de saltos condicionais ou não durante o processamento do programa além da eliminação de sessões do programa e reordenação do código fonte. - -code ou códigos espúrios na qual o programador insere trechos de código que podem ou não ser executados de acordo com determinadas situações fazendo com que o estudante que estiver analisando o programa sequer saberá se determinado trecho será executado ou não. (COLLBERG et al, 1998). Essas alterações da mesma maneira que as alterações no fluxo de processamento geram diferenças no programa final causando um maior consumo de CPU que o programa gerado pelo código original Figura 3 -Trecho de código fonte com dead code A figura 3 acima ilustra um trecho de um programa que possui um dead code, isto é, um trecho de código que jamais será executado. No exemplo temos que to - das. Nesse caso pode-se inferir que o programador realizou a manutenção do código e não se atentou para retirar as linhas que ficaram mortas no código. -Alterações estruturais para comandos equivalentes como a troca de um laço enquanto por um laço até, utilização de claúsulas unitárias de cálculos decompondo um cálculo mais rebuscado, inserção de IFs encadeados ou troca de situações de igualdade por outras possibilidades, a alteração de estruturas de controle e contadores e uma infinidade de estruturas que podem ser decompostas, alteradas ou incluídas contendo as mesmas funcionalidades, mas com um grau de compreensão muito rebuscado. (COLLBERG et al, 1997) Essas alterações podem ou não gerar diferença no código objeto / programa final depende da linguagem de programação e das opções de compilação. Deve-se sempre lembrar de inserir comandos similares e utilizar variáveis espelho ou mesmo a própria variável sendo seu valor armazenado antes de modificações e recuperado após elas mantendo seu valor original em trechos . Inserção de instruções sem função dentro do código: Geralmente são utilizadas expressões que verificam determinados valores de uma dada variável e alteram o fluxo do processamento ou processam partes do programa que não geram nada de útil apenas gastam processamento e levam o analista a loucura tentando entender determinado trecho do programa. ZAYTSEV (2005) Essas alterações causam mudanças no fluxo de processamento, utilizam CPU para realizar tarefas sem relação ao objetivo do programa e com isso acabam gerando um programa bem diferente do original. A utilização das técnicas estáticas listadas acima visa tornar o mais difícil possível a tarefa de descobrir de onde veio e para onde seguira a execução do programa e se o trecho a ser executado ou que foi executado é útil ou não. Não há sentido em incluir um trecho para dificultar o entendimento do analista adversário se o trecho destoar por completo do restante do programa, portanto os do código fonte. 4.1. Auto documentação Uma das grandes vantagens da linguagem COBOL é que ele é auto documentável, essa característica predominante do COBOL ocorre pois em sua concepção foram utilizados termos e semânticas da língua inglesa que facilitou muito o aprendizado da linguagem e também sua disseminação. (Wojciechowski, 2010) Por se assemelhar muito ao modo da escrita inglesa muitos códigos fonte de programas escritos em COBOL podem ser entendidos até mesmo por pessoas totalmente leigas com apenas algum conhecimento de lógica e um pouco de inglês. Segue baixo um comando simples da linguagem. ADD VALOR-1 TO VALOR-2 O comando acima é uma adição, ao ler o comando automaticamente o leitor consegue interpreta-lo, qualquer pessoa com um mínimo de discernimento da língua inglesa e que conheça um pouco de matemática deve ter entendido algo como Adicione o valor-1 ao valor-2 Entretanto o comando também pode aceitar uma outra sintaxe ADD VALOR-1 TO VALOR-2 GIVING VALOR-3 A qual não apresenta nenhum segredo, seria adicione o valor-1 ao valor-2 e de o resultado (GIVING) no valor-3. Uma outra maneira de fazer a mesma operação e que talvez até mais fácil de ser compreendida pois se assemelha a uma formula matemática e não a um texto é COMPUTE VALOR-3 = VALOR-1 + VALOR-2 Ambos comandos ADD ou COMPUTE podem gerar erros e o COBOL os trata de maneira bem parecida utilizando-se um ou SIZE ERROR ADD VALOR-1 TO VALOR-2 GO TO ENCERRA-EXECUCAO END-ADD O leitor mesmo que desavisado entenderá que se acontecer algum erro será exibida uma mensagem de erro e o processamento seguira para o encerramento (GO TO ENCERRA-EXECUCAO) Esse tipo de situação gerou muito conforto para os analistas e programadores que por vezes acabaram se acostumando a não documentar o código. Como nos exemplos acima pode-se ver que mesmo sem qualquer comentário sobre o que o comando realiza é possível o seu entendimento sem grandes esforços. Uma vez que os códigos fontes são bem guardados, os programas são compilados e o usuário não tem acesso a nenhum desses componentes nunca houve preocupação com a facilidade do entendimento do código. Em linguagens de programação mais atuais principalmente em aplicações WEB esse tipo de situação é completamente desaconselhável e indesejado, nesses sistemas o usuário, um concorrente, um adversário, vulgo, hacker ou qualquer pessoa tem acesso ao código fonte que está em execução, isso gera um novo cenário e uma vasta gama de problemas que os programadores de COBOL sequer um dia ousaram pensar. (Somekawa, 2012) Os problemas advindos da proliferação dos códigos fontes em claro, especificamente no COBOL é muito bem-vindo ainda mais que os sistemas costumavam ter pouca ou nenhuma documentação, porém na era da internet, os analistas de sistemas WEB precisam que o código seja inteligível somente para eles próprios, o usuário final não precisa e não é recomendável que tenha acesso e entenda o funcionamento do código. (Venkatesan, 2002) 4.2. Minificação de código Em português criou-se um estrangeirismo ou neologismo vindo do inglês minify, que nada mais é que reduzir. A palavra equivalente existe em português, mas no meio das pessoas que trabalham com informática, mais especificamente com programação, optou-se pelo uso de minificação de código. A minificação é processo de retirar os comentários, elementos acessórios, unir os comandos e tornar o código o mais enxuto ou reduzido possível. (WU et al., 2010) Além do código fonte do programa não possuir comentários muitos elementos excluídos do código, identidade visual, espaços, tabulações e outros elementos são suprimidos do código, por exemplo Esse trecho de código fonte acima encontra-se minificado, se comentado e utilizando-se a sintaxe completa dos comandos de acordo com as boas práticas, esse mesmo código se torna: Figura 4 -Trecho de código fonte original 5 A minificação não deve ser entendida como uma técnica de proteção quando utilizada sozinha, pois a lógica do programa ainda continua exposta e de fácil compreensão, o estudante apenas encontrara um pouco de dificuldade em remontar ou expandir o código minificado. Ao reduzir um código fonte suas funcionalidades permanecem inalteradas. Para o computador que executará o programa pronto não existe qualquer diferença entre o programa original sem sofrer o processo de redução e o programa reduzido, isto é, não existe diferença nenhuma no programa executável, apenas em seu código fonte. 4.3. Minificação e ofuscamento Do ponto de vista analítico o ofuscamento é algo mais elaborado que a minificação, pois requer um pouco de esforço do programador e do analista para que seu código se torne mais difícil de entendimento. Vamos ao exemplo clássico do primeiro programa de computador que todos deveriam aprendem quando começam a programar em uma nova linguagem, que é o HelloWorld, no COBOL ele seria algo como o exemplo abaixo: Figura 5 -Programa HelloWorld em COBOL Apêndice A Entre as partes da figura acima numeradas entre 1 e 2 o leitor não precisa se deter muito a tentar compreender o significado de cada linha existente no código fonte. Nesse primeiro momento digamos apenas que todas as instruções, comandos, identificadores existentes fazem parte do que é considerado um cabeçalho padrão sendo utilizado em todos os programas COBOL com pouca ou nenhuma variação. Atualmente nas versões do mainframe e de seu sistema operacional quase nada agregam, ainda existem por razões históricas e de compatibilidade, algo que a IBM jamais abriu mão. Existem muitas razões pelas quais programas e aplicativos existentes não podem ser alterados. Talvez a aplicação foi comprada em um pacote, de modo que você não tem acesso ao código fonte. Talvez alguém possui o aplica-tivo; talvez ele roda em sistema de outra pessoa. Talvez a fonte foi perdido, e não há ninguém que conhece o programa muito bem. Talvez a lógica do programa é tão complexa que as alterações são consideradas muito perigosas (IBM,2014)6 O que interessa no processo de ofuscamento é o próprio código gerado após a utilização de alguma das técnicas. Um simples comando, DISPLAY com a frase como o da figura 5 pode ser ofuscado fazendo com que o entendimento do que o programa fique bem complicado. Figura 6 -Programa HelloWorld em COBOL ofuscado Apêndice B Uma das poucas informações que podem ser extraídas do código acima é que será emitida uma mensagem (comando DISPLAY), mas para descobrir o conteúdo que ser exibido será necessário dispender um pouco mais de tempo e analisar o que existe dentro das variáveis utilizadas no comando. Nesse exemplo foi utilizado ao invés da frase em claro 'Hello World!' foram utilizadas três variáveis sendo seus nomes não contém qualquer significado e seus conteúdos encontram-se inicializados em hexadecimal. Antes do comando para exibição da mensagem foi executada uma movimentação com subscritor MOVE 1C TO 1D (6:7) para despistar o adversário. Ao código podem ser implementadas outras movimentações, cálculos diversos, outras variáveis, enfim, uma infinidade de artifícios para que o código fique o mais ininteligível possível. O ofuscamento de código (Code Obfuscation em inglês) é um método muito seguro e de fácil aplicação. Atualmente existem no mercado inúmeros software para realizar a tarefa, uma simples pesquisa na internet em sites de busca obtém diversos resultados, tanto pagos como gratuitos, mas para a linguagem COBOL não existem muitas opções, mais especificamente, foram encontrados apenas um software para a linguagem que é o Redvers Cloaking Device (ANEXO 1). 4.4. Compilação e link edição No processo para fazer com que um programa funcione, isto é, execute, algumas etapas devem ser seguidas para que seu código fonte se transforme em um executável. Basicamente e de maneira simplista seriam compilação e link edição. Na etapa de compilação o seu código fonte, por exemplo em COBOL, é convertido para uma montagem assembler, que recebe o nome de código de máquina, essa listagem contém seu programa convertido para a linguagem mais básica dos computadores, necessitando apenas sua link edição ou bind. (AHO; SETHI; ULLMAN, 2007) Caso um adversário resolva atacar o código depois do programa já finalizado e pronto para uso (depois de link editado) e, portanto, executável. O trabalho dispendido para tentar entender como é o funcionamento do programa é de extrema dificuldade e só se justifica em casos excepcionais, embora possível esse tipo de abordagem para a engenharia reversa é muito dispendioso e geralmente impraticável. Pode-se adicionar uma camada extra de proteção ao se utilizar o ofuscamento também no código de máquina gerado pelos compiladores ou montadores antes da link edição para geração do programa executável (módulo carga no caso do mainframe), nesses casos o acesso ao código fonte do programa não é possível e se quer faria sentido pois o programa que estava no código fonte original teve seu funcionamento alterado (embora mantido o processo de entrada e saída) pelo ofuscamento de seu código de máquina, sendo a engenharia reversa de desmontar o programa ofuscado segundo Wroblewski uma tarefa inútil embora 100% de proteção jamais será alcançada. (Barack et al, 2001) 4.5. Código redundante Outra técnica empregada para dificultar o entendimento é a utilização de código redundante, que nada mais é do que uma parte de código sem qualquer utilidade prática ou funcional, serve única e exclusivamente para dificultar o entendimento e atrapalhar a análise do código. A situação de código redundante ocorre por vezes de maneira totalmente despretensiosa e sem qualquer cuidado por parte do programador, muitas vezes partes de código sem qualquer função continuam a existir pois em algum momento da história de vida daquele programa foi utilizado uma outra linha de execução e esqueceu- se de retirar essa parte do código do módulo ou mesmo de simplesmente comentar sua inutilização. (BODÍK; GUPTA, 1997) Um código redundante em inglês, é inserido em um programa por alterações no código, qualquer um pode escrever um programa que acabe possuindo dead code, uma função antiga que deixa de ser utilizada e se torna obsoleta, as variáveis que eram utilizadas por essa função também se tornam redundantes, pois assim como a parte do código que deixou de ser referenciado essas variáveis também o serão. Esse tipo de alteração ou mudança ocorre devido a evoluções no código nas quais o analista não prestou muita atenção que em sua mudança partes do código deixariam de ser referenciadas e simplesmente as deixou no programa. (AIVOSTO, 2016) Uma outra causa muito comum e talvez a mais proeminente para a existência de código redundante seja a reutilização de programas, em outras palavras, o conhecido copie e cola, vulgo Control + C, Control+ V. Ao copiar um programa esqueleto, modelo, similar, padrão ou qualquer outra nomenclatura que possa existir muitas partes do código fonte desse módulo não servirão para o novo programa; variáveis, sessões, comentários do programa original continuarão a existir no código novo sendo que só servirão para confundir e dificultar o entendimento, sempre que for reutilizar um módulo para servir de modelo para um novo programa é recomendável uma análise do código fonte depois de finalizada a codificação a fim de detectar a existência de dead-code no programa. (Wojciechowski, 2010) Os compiladores COBOL mais atuais possuem análise desses elementos, indicando no relatório de compilação a ocorrência de pedaços do código fonte que nunca serão executados. (AIVOSTO, 2016) No mercado existem produtos específicos para análise desse tipo de situação, muitos deles detectam e otimizam o código automaticamente, sendo a parte desnecessária simplesmente suprimida no momento da compilação e o analista tendo que não se preocupar muito com o que aquele código fazia, afinal ele foi ignorado, porém algumas situações nem o melhor dos produtos pode detectar ou prever e nesses casos o programador fica horas analisando um trecho do programa até descobrir que ele não serve para absolutamente nada. Por exemplo: Caso o programador simplesmente se esqueça de comentar a sessão 2000TRATA- REJEICAO inteira ou de excluir suas linhas de código ela se tornou automa ticamente e sem o menor propósito um código redundante, isto é, ela consta no código fonte, porém jamais será referenciada ou executada. Embora nos compiladores atuais uma mensagem seja gerada informando que determinada parte do código não será executada e consequentemente não será considerada, o programador mais desavisado ou mesmo pela correria da rotina simplesmente ignora esse aviso e o código sem utilidade continuará a existir. A existência de linhas de código sem utilidade é um desserviço para o sistema como um todo, ao se deparar com essa situação o programador ou analista deve prontamente retirar essa parte do programa. O código limpo contendo comentários e possuindo apenas elementos válidos e executáveis no fluxo normal de processamento torna o trabalho de análise muito mais fácil, o analista, programador ou quem quer que esteja lendo o código realizará uma leitura muito mais fácil, conseguirá um entendimento mais linear do código e suas funcionalidades e nos casos de manutenções, sejam elas evolutivas, corretivas ou emergenciais -principalmente nas emergenciais) a tarefa fica muito mais simples. (MANTOAN, 2011) Os fabricantes de software de análise de código, entre eles Aivosto, Semantic Designs, Asetechs, Modern Systems, CA, MicroFocus, são categóricos em afirmar que cerca de 30% a 40% das linhas de códigos de programas do legado do mainframe em COBOL são código redundantes. (Microfocus, 2012) A simplicidade do código deve ser sempre levada em consideração ainda mais em se tratando de linguagem de programação estruturadas como no caso do COBOL. Ao encontrar um código muito rebuscado, utilizando algoritmos complexos, sem comentários ou com comentários que vieram de outros programas e não significam nada para a análise do programa em estudo ou mesmo programas muito extensos (mais de 3000 linhas de código) o analista tende a perder muito tempo para tentar entender para que serve cada variável utilizada e qual o seu domínio (valores que podem ser aceitos), o que cada parte do programa realmente faz, se determinada parte do programa realmente é executada ou se é simplesmente um código redundante. 4.6. Geração de dumb code Existem alguns momentos que são cruciais para a geração ou não de código redundante, são eles: Antes de reutilizar um código fonte já existente: -Ao comprar um código pronto ou customizável pois o vendedor por não ter tomado os cuidados necessários para lhe entregar um código limpo, uma análise minuciosa do código deve ser realizada antes do fechamento da compra ou do contrato. -Ao solicitar a construção do código para uma fábrica de software pois os padrões podem não ter sido seguidos à risca, o modelo utilizado possuir inconsistência ou ainda o módulo entregue não ter sido revisto com os critérios necessários. A revisão de programas oriundos de terceiros DEVE ser sempre realizada antes da aceitação do serviço. Quando um novo membro começa a trabalhar com uma nova sigla ou novo sistema deve-se atentar para que o novato entenda e aprenda como funciona o sistema antes de iniciar suas codificações, para isso a análise dos códigos fontes, fluxos, estudo de manuais é essencial, no momento da análise dos programas o novato pode detectar pedaços de código sem uso e deve realizar sua eliminação. (BODÍK; GUPTA, 1997) Novas versões de programas, em muitas situações a simples evolução de versão do programa já não é mais possível devido a sua complexidade ter alcançado o grau mais elevado possível o não entendimento. Nesses casos o programa precisa ser reescrito e nesse processo para que todas as funcionalidades ainda em uso do programa antigo continuem a existir e funcionar novos módulos são criados. A detecção manual e remoção de código redundante é muito trabalhosa e só é recomendada nos casos de um novo membro integrou-se à equipe e precisa adquirir os conhecimentos daquele sistema ou mesmo na reescrita de programas, nos demais casos o uso de ferramentas automatizadas é mais aconselhável. (Modern Systems, 2016) Existem no mercado inúmeras ferramentas para remoção de dead code, todas elas funcionam basicamente da mesma forma analisando e inspecionando o código fonte a fim de encontrar partes não utilizadas, para isso cada fabricante utiliza seu próprio algoritmo, mas todos geram um relatório da análise e disponibilizam opções para que o usuário decida o que fazer com as partes que não são utilizadas, desde uma simples marcação nas colunas de numeração indicando um dead code, passando pelo comentário dessas linhas ou mesmo simplesmente apagando essas partes do código. (Ca Tecnologies, 2011) Um dos maiores problemas, se não um dos únicos que a automatização da remoção de código redundante pode gerar é a deleção de código bom, por esse motivo as ferramentas informam no relatório que embora tenham detectado determinado pedaço de código como redundante, algumas dessas porções não são certeza, são potencias e recomendam a análise manual do trecho do programa para evitar a exclusão de código utilizável e, portanto, bom. Essa situação caso ocorra pode acarretar no não funcionamento do programa ou nos casos mais graves em comportamento anômalo gerando resultados totalmente imprevisíveis e geralmente catastróficos. 4.7. Revisão de código e padronização Um tópico merece atenção especial que é a revisão do código, a revisão além de servir para garantir que o que foi solicitado realmente foi entregue, fornece uma documentação adicional para o sistema e auxiliam a minimizar os riscos envolvidos no projeto, a detecção de erros no programa, funcionalidade ou mesmo do sistema como um todo antes do envio para a produção, gera uma economia significativa de tempo e dinheiro sem deixar de mencionar em todos os contratempos que um código com problemas gera ao ser baixado em produção. Ao se rever um código, o nível de conhecimento do sistema é aumentado, novos membros podem aproveitar a oportunidade e se inteirar das novas funcionalidades e de como estão interligados e se inter-relacionam os novos componentes do sistema, a preferência à revisão deve ser dada aos membros que não foram os codificadores dos programas, encontrar uma anomalia em um código que a própria pessoa gerou é uma tarefa de titãs, as boas práticas de mercado e padronizações de desenvolvimento de software preconizam que esse tipo de situação seja evitada sempre que possível. (Asetechs, 2016) A padronização e os bons costumes de um dado sistema devem ser levados em consideração quando da revisão do código, porém caso o programa tenha sido desenvolvido baseado no padrão mais atual da organização e precisa ser integrado aos códigos já existentes (mais antigos e com outros modelos) não é recomendável que o código seja aderente ao padrão antigo do sistema. Os novos módulos que forem desenvolvidos e as manutenções corretivas ou evolutivas no sistema devem sempre seguir os manuais e padrões mais atuais da instalação. (Semantic Designs, 2016) Conclusão Ao longo do texto nos capítulos 1 e 3 foram discutidos os aspectos jurídicos da proteção de software, suas origens, leis e tratos internacionais além de ilustrado os dois tipos de proteção existentes por patente ou por direito autoral. Como complementação às leis e para garantir uma proteção efetiva de suas criações os profissionais que trabalham com desenvolvimento de softwares inventaram o ofuscamento de código. O ofuscamento de código protege os programas de computador contra os ataques da engenharia reversa, técnica elaborada que visa a obtenção de segredos do cerne dos softwares, seja o próprio código fonte ou apenas um algoritmo novo. Alguns questionamentos sobre a utilização ou não da engenharia reversa, questões econômicas e exemplos de seu uso foram levantados no capítulo 2. As ferramentas utilizadas para ofuscar um código fonte foram trabalhadas ao longo de todo o capítulo 4. Foram apresentados exemplos de minificação, emprego de código redundante, dumb code e discutidos os aspectos da revisão e da padronização dos programas. As técnicas apresentadas como meios de proteção de código são passíveis de ataques e não garantem a proteção total do código, isso não tem como acontecer, não existe (Boccardo, 2010) uma proteção 100% segura. É impossível proteger sua criação contra a engenharia reversa, pode-se sim, dificultar bastante o trabalho de um eventual adversário. O mercado de espionagem industrial é um fomentador da engenharia reversa, mesmo empresas e industrias renomadas como a AMD (Info World, 1992) já se utilizaram ou ainda utilizam dessa técnica para observar o desenvolvimento dos produtos de seus dos concorrentes e porque não criar novos produtos e serviços que utilizem alguma ideia que acabou de ser descoberta por engenharia reversa. As técnicas de transformação dos programas sejam por ofuscamento, redução, código espúrio adicionam camadas de proteção extra ao código proporcionando uma maior tenacidade, resiliência e robustez contra uma possível tentativa de análise do código (engenharia-reversa). No apêndice C encontra-se um programa de cálculo de tabuada completo e funcional, com comentários, estruturado e de fácil entendimento, por sua vez, no apêndice D o mesmo programa sofreu alterações utilizando-se as técnicas de ofuscamento e seu entendimento é bem complexo. A execução de ambos os programas tem o mesmo resultado e o usuário não consegue perceber qual versão estaria em execução. (Apêndice E) O ofuscamento de código fonte degrada o desempenho e possui custo relativamente baixo e fácil implementação, mesmo que as técnicas a serem seguidas não façam parte de um cadastro prévio elas são facilmente codificadas e podem ser reutilizadas sem muito trabalho, porém toda e qualquer modificação no código fonte original implicará em um maior consumo de processamento. A técnica implementada no programa não deve jamais prejudicar o usuário final do sistema, a preocupação em demasia com o não entendimento do código fonte pode levar a um problema grandioso para o usuário caso algum procedimento que o usuário tome leve a um ponto do programa que não foi previsto, portanto testes são essenciais em programas ofuscados para detectar e corrigir eventuais falhas que foram geradas pelo próprio processo. A relação custo x benefício deve ser analisada com bastante critério pelo analista desenvolvedor juntamente com o time de performance para que os custos adicionais incluídos por ventura do ofuscamento não sejam proibitivos do ponto de vista computacional. Se no código do programa existam segredos, tecnologias inovadoras, algoritmos inéditos ou aperfeiçoados a utilização das técnicas aqui apresentadas é uma boa sugestão para proteção desse software. Referências 1. Acordo sobre Aspectos dos Direitos de Propriedade Intelectual Relacionados ao Comercio Trade-Related Aspects of Intelectual Property Rights. Tratado internacional, integrante do conjunto de acordos assinados em 1994 que culminou na criação a Organização Mundial do Comércio (WTO). 2. AHO, Alfred V.; SETHI, Ravi; ULLMAN, Jeffrey D.. Compilers: principles, techniques, and tools. 2. ed. Boston: Addison-wesley Longman Publishing, 2007. 1038 p. 3. AIVOSTO. Dead code detection and removal. 2016. Disponível em: . Acesso em: 06 out. 2016. 4. AKEMI, Nim Bus., -Virus. VírusBrasil, ed, 1. Disponível em:< http://virusbrasil.8m.com/>.Acesso em: 15 ago. 2016. 5. ASCENSÃO, José de Oliveira, Direito autoral. 2 ed. ref. e ampl. Rio de Janeiro: Renovar, 1997. p. 671 6. ASETECHS Consulting, KRIS applications and services Disponível em:< http://asetechs.com/NewSite2016/Products/KRIS_Solutions.htm>.Acesso em: 20 ago. 2016. 7. AYRES, Robert U. º 57,jul.set 1987. 8. , Paris, Dalloz, 1993, p. 290. 9. BOAZ Barak, Oded Goldreich, Russell Impagliazzo, Steven Rudich, Amit Sahai, Salil Vadhan, Ke Yang, On the (Im)possibility of Obfuscating Programs, Advances in Cryptology Computer Science vol. 2139, pp. 1-18, Santa Barbara, CA, November 2001 10.BOCCARDO, Davidson Rodrigo ; MACHADO, Raphael Carlos Santos ; CARMO, Luiz Fernando Rust da Costa. Transformações de código para proteção de software. In: SIMPÓSIO BRASILEIRO EM SEGURANÇA DA INFROMAÇÃO E DE SISTEMAS COMPUTACIONAIS, 10., 2010, Fortaleza. Anais... Fortaleza: Universidade Estadual do Ceará, Universidade Federal do Ceará,2010. Disponível em: http://www.insert.uece.br/sbseg2010/anais/04_minicursos/minicurso_03.pdf 11.BODÍK, Rastislav; GUPTA, Rajiv. Partial dead code elimination using slicing transformations. In: ACM SIGPLAN 1997 CONFERENCE ON PROGRAMMING LANGUAGE DESIGN AND IMPLEMENTATION, 97., 1997, New York. Conference. New York: Acm, 1997. v. 32, p. 159 -170. 12.BRASIL. Lei nº 10.196, de 14 de fevereiro de 2001 -Altera e acresce dispositivos à Lei n° 9.279, de 14 de maio de 1996, que regula direitos e obrigações relativos à propriedade industrial, e dá outras providências.. Diário Oficial da União. Brasília, DF, 16 fev. 2001. Seção 1, p. 4. 13.BRASIL. Lei nº 9.609, de 19 de fevereiro de 1998 -Dispõe sobre a proteção da propriedade intelectual de programa de computador, sua comercialização no País, e dá outras providências.. Diário Oficial da União. Brasília, DF, 20 jan. 1998. Seção 1, p. 1. 14.BRASIL. Lei nº 7646, de 18 de janeiro de 1987. Dispõe quanto à proteção da propriedade intelectual sobre programas de computador e sua comercialização no País e dá outras providências.. Diário Oficial da União. Brasília, DF, 22 jan. 1987. Seção 1, p. 22221. 15.Ca Tecnologies, Product Sheet: CA Optimizer®/II r8.5 Disponível em: . Acesso em: 25 ago. 2016. 16.COHEN F. . theory and experiments". In: IFIP-TC11, Computers and Security, pages 22 35, 1987. 17. Current trends in computer viruses". In: International Symposium on Information Security, 1991. 18. C Operating system protection through program evolution". Computer Security, 12(6):565 584, 1993. 19. A short course on computer viruses"(2nd ed.). John Wiley & Sons, Inc.,New York, 1994. 20.COLLBERG, C.; THOMBORSON, C.; Low, D. . ing transformations". Technical Report 148, Department of Computer Science, The University of Auckland, New Zealand, July 1997. 21.COLLBERG, C.; THOMBORSON, C; Low, D. . In: ACM SIGPLAN-SIGACT Sym posium on Principles of Progra uary 1998. 22.COLLBERG, C.; THOMBORSON, C; Low, D.. In: Proc. 1998 IEEE International Conference on Computer Languages, pages 28 38. 23.COLLBERG, C.,THOMBORSON, C. and dynamic embeddings", In: Principles of Programming Languages 1999, 24.COLLBERG C.; THOMBORSON C. -proofing, and obfuscation tools for software protection hnical Report TR00-03, The Department of Computer Science, University of Arizona, February 2000. 25.COLLBERG Christian S., THOMBORSON Clark. Watermarking, tamperproofing, and obfuscation -tools for software protection. In IEEE Transactions on Software Engineering, volume 28, pages 735 746, August 2002. 26.COMUNIDADE ECONÓMICA EUROPEIA. Diretiva nº 250, de 14 de janeiro de 1991. Relativa à protecção jurídica dos programas de computador. Conselho das Comunidades Europeias. Bruxelas, 14 jan. 1991. 27.DRAGONI, Matteo, al Dilemma . Tese de obtenção de título de pós doutorado, Universidade de Macerata, Departamento de Jurisprudência, 2014. 28.FERREIRA, Aurélio Buarque de Holanda. Novo Dicionário Eletrônico Aurélio. Curitiba: Positivo, 2010. CD-ROM. 29.FETRIM, Valéria Delisandra. Apoio à Documentação de Engenharia Reversa de Software por Meio de Hipertextos, Dissertação de Mestrado, USP-São Carlos, 1999. 30.GORDON, Yefin.; Rigmant Vladimir. Tupolev Tu-4: Soviet Superfortress, Midland Publishing Limited, 2002. 31.IBM. CICS Transaction Server. Disponível em: . Acesso em: 03 set. 2016. 32.INFO WORLD. São Francisco: Idg -International Data Group, v. 14, n. 49, 7 dez. 1992. 33.LYNN, B., M. Prabhakaran and A. Sahai, Positive results and techniques for obfuscation, Computer Science (2004), pp. 20 39. 34.MANTOAN, Fernando. Simplicidade de Código. 2011. Disponível em: . Acesso em: 25 jun. 2016. 35.MICROFOCUS. Transforming the Elephant in the Room: a Mainframe Story. Disponível em: . Acesso em: 05 jun. 2016. 36.MODERN SYSTEMS. What They Seem. Disponível em < http://modernsystems.com/cobol-codeassessment- things-arent-always-what-they-seem/ Acesso em 05 out. 2016. 37.MURTA FILHO, Antonio. Aspectos Penais Inovadores da Recente Lei 9.609, de 19.2.98. In Revista da ABPI, No. 29, Jul-Ago 1997. p. 29-33 38.ORGANIZAÇÃO MUNDIAL DA PROPRIEDADE INTELECTUAL. Acordo de Direitos Autorais, 20 dezembro 1996. Disponível em: . Acesso em: 27 jun. 2016. 39.PENTEADO, Rosângela. Engenharia reversa e reengenharia. 01 mar. 2009, 01 jul. 2009. 18 p. USFCar, Notas de Aula. 40.PEREIRA DOS SANTOS, Manoel. A Nova Lei de Software -aspectos controvertidos da protecão autoral, In Revista da ABPI, No. 29, Jul-Ago 1997. p. 29-33 41.PEREIRA DOS SANTOS, Manoel. Licença de Software. In Revista da ABPI, No. 25, Nov-Dez 1996, p. 39-46 42.Semantic Designs, COBOL CloneDR. Disponível em: http://www.semanticdesigns.com/Products/CloneDR/COBOLCloneDR.html? Home=COBOLTools>. Acesso em: 15 jul. 2016. 43.SICSÚ, Abraham Benzaquen. Em: Abraham Benzaquen SICSÚ , Orgs., Política Científica e Tecnológica: no Japão, Coréia do Sul e Israel. 1989, CETEM / CNPq, Rio de Janeiro. 44.SOMEKAWA, Daniel Marques. Ofuscamento de Código para Proteção de Programas Java contra Engenharia Reversa, Monografia de especialização, Universidade Tecnológia Federal do Paraná, 2012. 45.ULMER E, KOLLE G, "Copyright Protection of Computer Software", Syracuse Journal of International Law and Commerce, Vol. 14, No 2, 1983. 46.VIVANT Michel, "Software Protection", International Forum for the Union of the Mediterranean and the Challenges of Information Technology (IFUMCIT), Egito, 19.11.2009 47.VENKATESAN, Ashwini, "Code Obfuscation and Virus Detection", Tese de obtenção de título de mestre, Department of Computer Science, San Jose State University, 2008 48. Linguagem de Programação COBOL para , 2ª ed., Rio de Janeiro, Ciência Moderna., 2010. 49.WROBLEWSKI, Gregory, neral Method of Program Code Obfusca- Tese de obtenção de título de pós doutorado, Wroclaw University of technology, Institute of Engineering Cybernetics, 2002. 50.WU, Zhenyu; GIANVECCHIO, Steven; XIE, Mengjun. Mimimorphism: a new approach to binary code obfuscation. In: CCS '10 PROCEEDINGS OF THE 17TH ACM CONFERENCE ON COMPUTER AND COMMUNICATIONS SECURITY, 17., 2010, Nova Iorque. Nova Iorque: ACM, 2010. p. 536 -546. 51.ZAYTSEV, Vadim V.. A Different Perspective on Code Obfuscation. In: WORKSHOP ON LANGUAGE DESCRIPTIONS, TOOLS, AND APPLICATIONS ( ) 2005, Edinburgh, Scotland, Uk. Artigo para apreciação. Universidade de Amsterdam, 2005. p. 1 -12. Anexo A Folheto de divulgação software de ofuscamento Apêndice A -Código fonte programa COBOL HELLO sem ofuscamento Programa de Hello World em COBOL da figura 5: Apêndice B -Código fonte programa COBOL HELLO ofuscado Programa Hello Ofuscado da figura 6: Apêndice C - Código fonte programa TABUADA sem ofuscamento Apêndice D - Código fonte programa TABUADA ofuscado Apêndice E Execução do programa TABUADA Figura 7 -Execução do programa TABUADA