Provavelmente você já ouviu falar sobre Obfuscated Code , isso nada mais é do que ofuscar o código original do programa para dificultar sua compreensão , ela é usada para dificultar engenharia reversa , para melhor camuflar um vírus entre outras coisas .Hoje eu irei exemplificar como pode ser usada para dificultar um pouco a ER.
Eu irei fazer um simples exemplo em C para ofuscar uma string , com essa simples ofuscação diminuimos cerca de 10% de chance de um Reverser iniciante conseguir quebrar nosso programa , muitas vezes as strings dentro dos programas são usadas pelos reversers como referencias para chegar a certos pontos de comparação do software , como comparações de serial number ou até mesmo outras informações vitais.
Esse simples tipo de ofuscação eu consegui retirar quando estava programando em Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... eu percebi que para escrevermos uma string devemos primeiramente alocar os valores de cada letra (ASCII) em células da memória e depois voltar e imprimi-las uma a uma , mas séria muito trabalhoso alocar valor por valor em cada célula(vamos chamar de variavél agora) então podemos fazer loops para alocar determinados valores e depois ir trabalhando somente com as variaveis usadas.
Eu irei usar meu nome como exemplo mostrarei como ela é apresentada pelo Debugger antes e depois da ofuscação, primeiramente vou observar qual a maior letra lembrando sempre de procurar a maior letra em alguma tabela ASCII , por exemplo no meu nome a letra com maior valor é "v" e a de menor valor é "G" tendo respectivamente 118 e 71 , bem se já sabemos que o maior valor é 118 podemos declara-lo em uma variavel ,mas resolvi usar um loop com usando o comando while para ficar mais interessante , vou começar da primeira letra , postarei o source em C comentando linha por linha depois:
Bem o que eu fiz foi colocar um contador valendo 10 e a variavel nome valendo 61 , o primeiro while trata de imprimir a primeira letra que é G , o que vou fazer é um while que adicione 1 a cada loop isso sera feito 10 vezes assim chegando a letra G , depois adiciono o valor de 46 a variavel atual 71+46=117 que é u depois subtraio 2 que resulta em um s , em seguida uso o comando nome++ que seria é incrementa essa variavel em 1 resultando em t , depois subtraio 9 resultando em k mais não a imprimo , novamente temos um loop usando while que faz com que a variavel nome seja decrementada 10 vezes ou seja k=107 - 10=97 que é a letra a e imprimimos , depois adicionamos a ela a soma de 7*3 e resulta em v e por ultimo subtraimos 7 que resulta em o.
Como pode notar é meio trabalhoso ,mais muito eficiênte , as limitações de Obfuscated vem somente da sua limitação mental , existe muitos outros jeitos e maneiras basta você ver qual é a melhor para você usar , vamos ver nosso exemplo com obfuscated e sem usa-la , primeiro vamos comparar o tempo de execução de cada um usando o comando time do linux:
Como podemos ver o tamanho dos sources é diferente o comob.c que está com o Obfuscated tem 565 bytes enquanto o outro tem apenas 83 bytes , depois da compilação o tamanho é igual para os dois 8,9 K e o tempo de execução dos dois é quase que identico variando no máximo de 1 milisegundo de um para outro.
Sem Obfuscated:
Com Obfuscated:
Como pode ver a string não aparece no OllyDbg , bem é isso missão cumprida , até a próxima
Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...
Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...
Eu irei fazer um simples exemplo em C para ofuscar uma string , com essa simples ofuscação diminuimos cerca de 10% de chance de um Reverser iniciante conseguir quebrar nosso programa , muitas vezes as strings dentro dos programas são usadas pelos reversers como referencias para chegar a certos pontos de comparação do software , como comparações de serial number ou até mesmo outras informações vitais.
Esse simples tipo de ofuscação eu consegui retirar quando estava programando em Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... eu percebi que para escrevermos uma string devemos primeiramente alocar os valores de cada letra (ASCII) em células da memória e depois voltar e imprimi-las uma a uma , mas séria muito trabalhoso alocar valor por valor em cada célula(vamos chamar de variavél agora) então podemos fazer loops para alocar determinados valores e depois ir trabalhando somente com as variaveis usadas.
Eu irei usar meu nome como exemplo mostrarei como ela é apresentada pelo Debugger antes e depois da ofuscação, primeiramente vou observar qual a maior letra lembrando sempre de procurar a maior letra em alguma tabela ASCII , por exemplo no meu nome a letra com maior valor é "v" e a de menor valor é "G" tendo respectivamente 118 e 71 , bem se já sabemos que o maior valor é 118 podemos declara-lo em uma variavel ,mas resolvi usar um loop com usando o comando while para ficar mais interessante , vou começar da primeira letra , postarei o source em C comentando linha por linha depois:
Bem o que eu fiz foi colocar um contador valendo 10 e a variavel nome valendo 61 , o primeiro while trata de imprimir a primeira letra que é G , o que vou fazer é um while que adicione 1 a cada loop isso sera feito 10 vezes assim chegando a letra G , depois adiciono o valor de 46 a variavel atual 71+46=117 que é u depois subtraio 2 que resulta em um s , em seguida uso o comando nome++ que seria é incrementa essa variavel em 1 resultando em t , depois subtraio 9 resultando em k mais não a imprimo , novamente temos um loop usando while que faz com que a variavel nome seja decrementada 10 vezes ou seja k=107 - 10=97 que é a letra a e imprimimos , depois adicionamos a ela a soma de 7*3 e resulta em v e por ultimo subtraimos 7 que resulta em o.
Como pode notar é meio trabalhoso ,mais muito eficiênte , as limitações de Obfuscated vem somente da sua limitação mental , existe muitos outros jeitos e maneiras basta você ver qual é a melhor para você usar , vamos ver nosso exemplo com obfuscated e sem usa-la , primeiro vamos comparar o tempo de execução de cada um usando o comando time do linux:
Como podemos ver o tamanho dos sources é diferente o comob.c que está com o Obfuscated tem 565 bytes enquanto o outro tem apenas 83 bytes , depois da compilação o tamanho é igual para os dois 8,9 K e o tempo de execução dos dois é quase que identico variando no máximo de 1 milisegundo de um para outro.
Sem Obfuscated:
Com Obfuscated:
Como pode ver a string não aparece no OllyDbg , bem é isso missão cumprida , até a próxima
Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...
Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...
Comment