As vantagens de saber assembly

Iniciado por Kratos, 16 de Março , 2006, 10:02:04 AM

tópico anterior - próximo tópico

0 Membros e 1 Visitante estão vendo este tópico.

Kratos

As vantagens de saber assembly



 
Antes de mais nada, qualquer computador do mundo (atualmente ou antigamente, tanto faz) é programado usando uma série de instruções. Ou seja, só existe uma linguagem de programação realmente, que é o Assembly. As linguagens de alto nível (C/C++, Pascal, Delphi etc.) não são compreendidas pelo processador. Nesse ponto entra o compilador que transforma o programa em linguagem de máquina. "E daí?" pergunta você... bem, é aí que entra a grande importância do conhecimento do Assembly.

Em primeiro lugar, esse conhecimento do funcionamento da máquina e de sua linguagem nativa permitem ao programador fazer um código mais rápido, mais seguro e mais "compacto". Mas essa não é a principal vantagem, digamos assim. Quanto mais você souber Assembly, mais você estará apto a escrever um programa (não importa em qual linguagem) protegido contra a "engenharia reversa". Neste artigo, vou tratar apenas da forma mais temida forma de engenharia reversa: cracking.

Para os que não sabem, os crackers fazem, entre outras coisas, um programa que não é registrado agir como se fosse; podem modificar o código de forma que o programa faça coisas que não deveria; podem tirar proteções contra cópia etc.

Bem, digamos que você tenha se formado e seja contratado para trabalhar numa empresa na área de desenvolvimento. Você passa alguns meses trabalhando num projeto de um programa muito bom. Vocês lançam esse programa numa versão shareware, esperando ter boa aceitação do mercado. Uma semana depois, você percebe que já existe uma versão pirata do seu programa, crackeada, circulando por toda Internet. Aí, a sua empresa compra um pacote de proteção por uns U$200,00, algo do tipo "Super Hiper Wonderful Seven Lock Anti-Pirate-Cracker-Hacker Perfect Protection" ou algum outro nome ridículo do gênero, para proteger o seu mais novo lançamento. Três dias depois já está disponível a versão pirata, quebrada do programa. E aí a empresa continua nessa até chegar à falência e você acaba sem emprego. "Esses caras são magos!" você pensa. Será? Vamos ver...

PROBLEMA: Comparação de tempo. Se você fez um programa que deve parar de funcionar depois de 30 dias de uso, provavelmente deve ter uma linha (ou mais) em seu programa mais ou menos assim:

if (ContaDias > 30)

Tsc... tsc... se você souber um pouquinho de Assembly, deve advinhar que em alguma parte do seu programa compilado, vai haver uma instrução do tipo:

cmp ax,001E

Que em linguagem de máquina vai ser algo do tipo "3C 1E", ou "3D 1E 00", ou ainda
"3D 1E 00 00 00" (depende do compilador e do sistema operacional). De qualquer forma, se um cracker quer quebrar essa proteção de 30 dias, o que ele vai procurar? Pois é... o seu código não vai ter muitas outras comparações com 1E, vai ficar fácil pra ele achar essa instrução. Se você souber Assembly, vai logo concluir "onde tem um compare tem um jump condicional!" Pois é... na linha seguinte vai ter algo como:

jg [posicao]

Ou seja "jump if greater"... é, a proteção já era. Basta "nopar" esse jump (substitui-lo pela instrução nop, ou "no operation").

SOLUÇÃO: Comparação maluca. Bem, você deve, a todo custo, evitar uma comparação com o limite de dias de uso de seu programa. Uma opção é substituir aquela comparação pelo seguinte:

ContaDias = ContaDias + 1432;
(...)
if (ContaDias > 1462)

Sacaram? Eu continuo vendo se os 30 dias se passaram, mas de outra maneira. "Por que 1432?" Sei lá, porque é um número esquisito! :))) Agora nós teremos o seguinte, codificado pelo computador:

cmp ax,05B6

Um pouco mais difícil de advinhar, não? Pra completar ainda mais a proteção, e podendo até irritar os potenciais crackers que tentarão "nopar" sua proteção, faça o seguinte:

int variavel = 40;
(...)
if (variavel > 30)
{
   Continua_o_Programa;
}
else Fecha_o_Programa;

O que eu fiz aqui foi criar uma variável (poderia ser constante também) qualquer, atribuir um valor de quarenta (qualquer um maior que trinta). Em algum ponto do programa (de prefrência no início) eu comparo essa variável e se for maior que trinta (sempre vai ser) eu continuo com o programa, senão eu paro. Bem, caso alguém "nope" esse jump, o programa vai simplesmente fechar! :))) - e setar um breakpoint na função do Windows que pega a data (GetLocalDate se não me engano). Pronto! Já era a sua proteção de novo!

SOLUÇÃO: Espalhe pistas falsas! Você tem de usar um pouco a imaginação. Nunca será possível tornar um programa "inquebrável", mas, pelo menos, você pode tornar o trabalho dos crackers mais árduo e impedir que qualquer um consiga quebrar. Neste caso, coloque, em vários pontos do programa, o comando que pega a data do sistema. O debugger do cracker vai apitar e parar a toda hora e ele vai ficar maluco sem saber qual é a verdadeira parte do programa que deve ser quebrada. Para tornar ainda mais difícil, além de pegar a data, faça uma comparação como a vista anteriormente para finalizar o programa, caso o cracker queira "nopar" a parte falsa! :(((

SOLUÇÃO: Estude a API do Windows! Isso mesmo... você não precisa escrever tudo na mão, mas, pelo menos nos pontos mais críticos do programa, faça! Isso vai dificultar em 1000% o trabalho de qualquer cracker!

PROBLEMA: Sua senha é ABCD! Se você fez um programa que precisa de um número de registro (que depende do nome do usuário, seguindo alguma fórmula) para funcionar (ou continuar funcionando), você corre um sério risco. Provavelmente vai haver uma janela para o usuário entrar o nome e o número. Mais ainda, vai haver um botão "Ok" para validar o número. Pronto... mais um breakpoint vai derrubar seu código. O cracker vai parar direto na rotina que codifica o nome. Ele pode pegar da memória o número de registro que seria válido para o nome entrado (tem que estar na memória para fazer a comparação). Ou pior: ele vai criar um programa que gera números de registro!

SOLUÇÃO: Assembly e canja de galinha não fazem mal a ninguém! Se o seu "amigo" cracker tiver de parar o programa na hora da validação e o número de registro estiver na memória, adeus! Corrija isso evitando que a comparação se dê no momento em que o usuário pressiona o botão. Faça algo como colocar uma mensagem do tipo "O número só poderá ser validado quando programa executar de novo" ou algo do gênero. Guarde o número e o nome entrados no Registry do Windows e, entre as muitas funções de inicialização de seu programa, verifique se o número é válido. É muito mais difícil conseguir descobrir a parte do código em Assembly que faz a validação se estiver "longe" da parte que faz a entrada dos dados.

PROBLEMA: Tudo deu errado, não sei mais o que fazer! Às vezes, mesmo tomando todos esses (e mais outros) cuidados, o seu programa continua sendo quebrado. Isso é até previsível, uma vez que muitos crackers sabem muito mais que a maioria dos programadores. De qualquer forma, se você tomar esses cuidados, tornará a vida deles mais difícil e, certamente, somente os mais eficientes e experientes conseguirão vencê-lo.

SOLUÇÃO: Se não há nada para ser quebrado, não há cracking! NUNCA use esses pacotes prontos para proteção de programas. Acredite, os caras que fazem isso sabem programar quase tão bem quanto você, mas acham que sabem mais. Essas proteções comerciais NA MAIORIA ABSOLUTA DAS VEZES são muito fáceis de quebrar. Honestamente. Se você souber um pouco de Assembly e tiver acesso a um programa protegido com um desses sistemas, dê uma olhada... você vai se surpreender! A melhor forma de evitar que seu programa seja quebrado é fazer uma versão freeware do programa (limitada) e outra comercial (completa). Dessa forma não há o que ser quebrado, logo, não há cracking. Claro que ainda sobra o problema da pirataria, mas esse já é um outro assunto...

 
Autor: Pedro Demasi [www.portaldaprogramacao.com]
::: "A vida é bela pra quem sabe curtir" :::





Anonymous

Isso Mermo Assembly é Otimo quem sabe num desaponta eu estudo assembly desde q começei com C/C++ Já fiz mta coisa com assembly alguns membros ja viram :) Como Cloudy, Pyro Etc...

Mais é isso Ai . com assembly voce consegue Mta Coisa mesmo que nao seria possivel usando as ling-alto nivel


T+

Cloudy

É verdade, fico até animado só de ver os codes do Ricardo. Cada um mais fodástico que o outro.

...by Cloudy
"You have to be trusted by the people tou lied to, so when they turn their back on you, you have the chance to the put the knife in." (Roger Waters)

...by Cloudy

Shady



Mundus Vult Decipi

Anonymous

assembly é lindo!! hehehe... o único "problema" , é que a linguagem assembly é muito específica

depende muito da máquina na qual vocÊ está codando, de maneira que o programador deve conhecer a fundo

o microprocessador da máquina... (e daí?)

hmm... é aí que está o X da questão!!

sendo dependente da máquina o programa desenvolvido na máquina tende a não ser "portável"...

infelizmente o prog só roda numa máquina

Anonymous

Citação de: "Kratos"qualquer computador do mundo (atualmente ou antigamente, tanto faz) é programado usando uma série de instruções. Ou seja, só existe uma linguagem de programação realmente, que é o Assembly. As linguagens de alto nível (C/C++, Pascal, Delphi etc.) não são compreendidas pelo processador. Nesse ponto entra o compilador que transforma o programa em linguagem de máquina.

Só tem um pequeno detalhe, o Assembly tbm não é compreendido pela máquina... por isso existe compilar... Sò elmbrar isso memso... Assembly não é linguagem de máquina, apenas chega bem perto disso!!!

Abraços

Anonymous


nibbles

pela primeira vez eu fiquei com vontade de aprender assembly, bom talvez não a primeira... anyway, bom post :)



"A diversão do inteligente é se fingir de burro para aquele que se finge de inteligente."
"ENGENHARIA SOCIAL. Porque não existe patch para a ignorância humana."

Anonymous

Citação de: "Mago__"
Citação de: "Kratos"qualquer computador do mundo (atualmente ou antigamente, tanto faz) é programado usando uma série de instruções. Ou seja, só existe uma linguagem de programação realmente, que é o Assembly. As linguagens de alto nível (C/C++, Pascal, Delphi etc.) não são compreendidas pelo processador. Nesse ponto entra o compilador que transforma o programa em linguagem de máquina.

Só tem um pequeno detalhe, o Assembly tbm não é compreendido pela máquina... por isso existe compilar... Sò elmbrar isso memso... Assembly não é linguagem de máquina, apenas chega bem perto disso!!!

Abraços

Realmente, seu omentário disse tudo, parabens!

Só para lembrar, não existe linguagem de máquina, isso é uma alusão que se dá a a movimentação de elétrons em sequencia binária(aberto-fechado). No computador não existe 0 e 1 existe aberto e fechado, quem fez eletrônica sabe muito bem disso lembrando das portas lógicas, que na programação chamamos de condicionais...