-
[105] A Fórmula de um Crack
Crackear qualquer sistema é impossível sem as ferramentas certas. Abaixo iremos discutir as diferenças entre as existentes. E de posse do conhecimento destas, iremos desenvolver um exemplo suficientemente completo para se entender como crackear um executável.
-
[131] Técnicas AntiCracking – Parte I
Quando disassemblamos um binário para crackearmos, muitas vezes nos deparamos com um código que parece não fazer sentido. Isso ocorre por que o programa possivelmente foi implantado com alguma proteção contra engenharia reversa.
-
[148] Técnicas AntiCracking – Parte II – Eliminação de Informação Simbólica
Os compiladores costumam gerar informações simbólicas – para representar as lincagens – quando convertem as relações de importação e exportação de tabelas e extensões. Um programa com grande uso de DLLs, onde cada uma exporta uma grande quantidade de funções, necessitará de uma lista relacionando onde estão as funções exportadas, normalmente indicando o que elas fazem, o que é de grande serventia para os crackers. Neste artigo, apresento algumas das informações que podem ser usadas como pontos de referência para engenharia reversa.
-
[201] Técnicas AntiCracking – Parte III – Ofuscação e Encriptação de Código
Também conhecidas como Code Obfuscation and Encryption (COE), são técnicas utilizadas para prevenir a Análise Estática de Código. Diferente da Eliminação Simbólica (Eliminating Symbolic Information – ESI), a COE é aplicada após a compilação do programa, modificando o binário original antes de ser entregue ao cliente.
-
[207] Técnicas AntiCracking – Parte IV – Técnicas Ativas de AntiDebuggin
No post “A Fórmula do Crack” discutimos alguma coisa sobre debuggers. Como é o processo de debuggin em user-mode e kernel-mode, como cada um deles trabalha quando um usuário anexa um processo à eles, quando fixa um breakpoints em uma instrução etc.
O que não foi discutido é a forma como o debugger atua: quando o usuário escolhe pontos de parada para conferir o andamento da execução do programa é comum o debugger substituir a(s) instrução(ões) por uma instrução própria, que só ele entenda.
-
[214] Técnicas AntiCracking – Parte V – Burlando Disassemblers
Uma técnica sofisticada de enganar disassemblers consiste em usar um trecho do programa para alterar os bits das outras partes do programa, que desejamos proteger. A estratégia usada é deslocar os bits de um trecho do programa para que este pedaço pareça possuir outras instruções. Desta forma, o decompilador irá interpretar essas instruções e fornecer informações erradas ao atacante.
-
[219] Técnicas AntiCracking – Parte VI – Transformações no Controle de Fluxo
Control Flow Transformation (CFT) consiste em alterar a estrutura de um programa para tornar seu código difícil para a leitura humana sem prejudicar a sua funcionalidade original. Como veremos aqui, está intimamente relaciona com a ofuscação de código.
As técnicas que se aplicam à categoria das CFTs são: Inlining, Intervalar Código, Estruturas Opacas, GoTo Hell’s Code e Exceção Proposital.
-
[225] Técnicas AntiCracking – Parte VII – Conclusão
O programa ficará mais lento quão maior for o descuido na implantação dessas técnicas devido aos efeitos adversos, tais como o uso excessivo da CPU com instruções que não tem funcionalidade nenhuma para o usuário, o aumento significativo do código e a perda de desempenho no sistema. Todavia, ao implementar este tipo de proteção devemos usar as técnicas de forma que as reações colaterais sejam minimizadas. Neste artigo, discutimos quais são os custos ao se implementar uma técnica que desfavoreça a engenharia reversa, o nível de proteção máximo que se pode ser obtido e qual preço desta segurança.
-
[375] 1.1.1 Raízes de Equações — Métodos Intervalares — Método da Bissecção
Neste artigo é apresentada uma introdução aos métodos intervalares de busca de raízes. Para tais métodos, a primeira exposição é feita sobre as buscas incrementais, que consistem basicamente em testar a nulidade da imagem da função após cada incremento feito dentro do intervalo.
basicamente todos os métodos intervalares fazem uma busca incremental, modificando apenas os seus critérios de teste. Desta forma, surge naturalmente o Método da Bissecção como consequência da busca de raízes dentro de um intervalo.
-
[403] 1.1.2 Raízes de Equações — Métodos Intervalares — Regula Falsi
O método conhecido como Regula Falsi, ou "da Falsa Posição" é uma técnica que busca de raízes de funções dentro de um intervalo pré-definido, diferindo-se do Método da Bisecção por avaliar a intersecção entre o eixo abicisso e um segmento de reta produzido através de dois intervalos consecutivos, nos pontos [xi, f(xi)] e [xi+1, f(x_i+1)].
Para algumas funções, este método possui convergência mais veloz que o Método da Bisecção, servindo no refinamento de algumas outras técnicas compostas.
Este artigo faz uma apresentação do método e segue com uma discussão sobre a implementação e as possíveis melhorias computacionais que podem ser aplicadas à ele.
-
[435] 1.2.1 Raízes de Equações — Métodos Abertos — Ponto Fixo
O Método do Ponto Fixo é o primeiro e mais básico dos métodos abertos para busca de zeros em funções.
Diferente dos métodos intervalares, onde exige-se um conhecimento prévio da localização da raiz para delimitação do intervalo de busca, os métodos abertos, em geral, necessitam apenas de uma estimativa inicial para convergir à raiz.
Este artigo apresenta uma breve explanação sobre os métodos abertos -- cuja maioria dos métodos numéricos derivam -- e uma implementação do Método do Ponto Fixo.
-
[439] 1.2.2 Raízes de Equações — Métodos Abertos — Newton Raphson
O método de Newton-Raphson é um método aberto, pois a convergência que ele provê à raiz não depende da delimitação de um intervalo, possuindo as propriedades descritas para Método do Ponto Fixo.
Provavelmente é o método numérico mais aplicado computacionalmente para a aproximação de raízes, graças à sua capacidade de rápida convergência, associada à simplicidade de sua formulação.
-
[450] 1.2.3 Raízes de Equações — Métodos Abertos — Método da Secante
Este artigo demonstra matematicamente a função de iteração do Método da Secante e disponibiliza um algoritmo implementado na linguagem Python.
-
[457] 1.3.1 Raízes de Equações — Raízes de Polinômios — Newton-Raphson para polinômios
Os polinômios formam uma classe de função toda especial, contendo propriedades e relações particulares e bem conhecidas. Devido a isso, alguns métodos computacionais foram desenvolvidos de forma a permitir encontrar suas raízes.
Como funções polinomiais formam soluções de diversos problemas físicos, matemáticos e de outras áreas, aplicar o método correto que melhor resolva, certo problema pode ser a chave para uma solução computacionalmente elegante e eficiente.
Este artigo apresenta uma breve introdução aos métodos de busca de zeros de polinômios e dispõe uma adaptação do Método de Newton para suportar raízes complexas -- tipo de solução quase sempre presente para este tipo de função.
-
[463] 1.3.2 Raízes de Equações — Raízes de Polinômios — O Método de Muller
O Método de Muller é uma técnica modificada do Método da Secante, mas que ao contrário dessa, não estima a raiz de uma função prolongando uma reta através de dois pontos -- fazendo com que esta reta seja secante à curva da função --, e sim utiliza-se de uma parábola através de três pontos para aproximação da derivada.
-
[473] 1.3.3 Raízes de Equações — Raízes de Polinômios — O Método de Bairstow
O Método de Bairstow permite encontrar todas as raízes de um polinômio de grau $n$ exigindo-se apenas seus coeficientes.
Este artigo faz uma breve exposição matemática do método, seguida de duas implementações reais nas linguagens Python e Fortran 90.