Caríssimos leitores, este é mais um artigo dos demais já publicados no blog, respetivamente sobre a temática de Engenharia Reversa.
Atualmente uma das plataformas com crescimento mais acentuado na indústria de desenvolvimento de software, é o .NET Framework. Muitas pessoas no seu dia-a-dia questionam-se sobre: “O que é o .NET Framework?”.
O .NET Framework é indispensável para executar vários programas que foram desenvolvidos com o uso desta tecnologia da Microsoft. Estes binários nativos (programas .exe), no momento da sua execução detêm algumas dependências, estas decretadas aquando o seu desenvolvimento. Uma maneira de solucionar este problema, foi a implementação da plataforma .NET Framework, que oferece todo o suporte aos binários nativos provenientes das ferramentas Microsoft.
É natural, que atualmente as técnicas e procedimentos com o intuito de alterar o código nativo dos executáveis sejam cada vez mais sofisticados. Naturalmente existem também diferentes técnicas e procedimentos para dificultar (diferente de impedir) a modificação do binário. De entre elas, está por exemplo, a ofuscação, algo que será abordado mais adiante num artigo deste blog.
Proteger um binário (uma aplicação) contra engenharia reversa é uma obrigação para todos os programadores, ou então concordamos que o binário possuí uma falha na sua construção. Atualmente este tipo de falha é apelidada de vulnerabilidade, que poderá trazer prejuízos incalculáveis. Mais, esta vulnerabilidade pode ser classificada como uma vulnerabilidade de codificação, melhor dito, um erro cometido aquando a concretização do código do binário.
Nas linguagens provenientes da Microsoft, como é o caso do Visual Basic .NET, não há muito a ser dito, pois um binário poderá ser revertido (crackado) ou corrigido em menos de 10 minutos. Como mencionado anteriormente, é natural que existam procedimentos e técnicas que podem ser implementadas, por forma a diminuir os estragos, isto é, dificultar a vida ao engenheiro reverso.
Uma maneira de o fazer é “criptografar” o código-fonte. Este processo é atualmente apelidado e batizado como ofuscação. Será um assunto a debater noutro artigo.
Sendo este um artigo introdutório ao tema de anti-reversing, é necessário deixar claro que, os métodos mencionados abaixo podem ser facilmente trespassados usando um debugger, como o conhecido OllyDbg ou IDA Pro. Mas ressalvo que isso é conseguido por alguém com conhecimento suficiente e afincado na área.
Em seguida são apresentados alguns métodos de como programadores protegem os seus binários.
1- Sistema de Licenciamento Online (HWID)
Muitas vezes um programa após a sua execução, efetua um request (pedido) de dados, ou faz alguma comparação com uma base de dados online. Por exemplo, supondo que eu disponibilizo um software licenciado via Internet. O processo usado para garantir que só os utilizadores com uma licença válida o executam é o seguinte:
a) Após a execução do programa, efetivar um request para o servidor de dados da empresa, no qual este verifica se o MAC Address do pedido consta na base de dados de licenças. (O Mac Address do computador que efetuou o pedido.)
b) Se o ponto “a” for verdade, então é enviado de volta o valor “1”.
c) Caso contrário, é enviado o valor “0”, e o programa não executa, isto é, é terminado forçosamente.
A imagem seguinte apresenta um desses requests.
É feito um pedido à página “site.com” através do URL “/check_hwid.php?id=123234453543&uid=allan”. Atualmente posso garantir que toneladas de software ainda utiliza este método.
Naturalmente o pedido (resquest) foi solicitado via protocolo HTTP. Soa de forma natural eu dizer isto, mas para os demais entendidos da área, este é o isco perfeito para reverter software, pois os parâmetros (id e uid) do pedido são transportados em texto limpo na rede. Estes dados são normalmente analisados e recolhidos através do conhecido sniffer “Wireshark”.
Uma solução para combater este tipo de métodos é o uso de Transport Layer Security (TLS). Simplesmente o canal de comunicação deixa de ser inseguro e passa a ser seguro. A notação dada a este protocolo é a de HTTPS. Naturalmente toda esta implementação poderá gerar alguma controvérsia na entidade que disponibiliza o serviço, visto envolver questões monetárias, relativamente à certificação da ligação (certificado digital).
2- Ofuscadores de Código-fonte
Ofuscadores de código-fonte são programas com métodos que tentam “complicar” o código do binário. Tudo isto é feito apenas para dificultar a análise de um engenheiro reverso. Normalmente estes programas são premium, mas ainda existem alguns gratuitos. Será um assunto a abordar com maior detalhe e afinco num outro artigo.
3- Antis (anti-reversing)
Dando um passo à frente, alguns programadores com uma outra mentalidade, implementam simples funções, de forma a evitar a reversão do binário. A ideia é muitos simples, e traduz-se no seguinte:
Parece um método demasiado simples, mas é adotado atualmente por imensos softwares, como o tão conhecido “Spotify”.
Basicamente é implementada uma rotina associada a um temporizador. Esta rotina é chamada (remotamente ou não) no software, e verifica no caso mais simples, o nome dos programas em execução no terminal (computador).
Após obter os nomes de todos os processos, é verificado se determinado processo consta na lista de nomes, em caso afirmativo, a execução do binário é terminada.
Em seguida são apresentados alguns excertos de código relativamente a este método.
Anti OllyDbg
Sub AntiOllydbg()
Dim generaldee As Process() = Process.GetProcesses
Lembre-se, nunca facilite na implementação daquilo que seja, tome as medidas certas, tente informar-se sempre dos processos que deve implementar e mantenha-se informado. É importante para si programador, para o prestígio e bom funcionamento do software, da empresa prestadora de serviços, e dos utilizadores que visam usufruir do serviço.
Espero que tenha ficado esclarecido relativamente a este assunto. Adiante, serão discutidas outras implementações e métodos de maneira a complicar o processo de reversão.
Pedro Tavares is a professional in the field of information security working as an Ethical Hacker/Pentester, Malware Researcher and also a Security Evangelist. He is also a founding member at CSIRT.UBI and Editor-in-Chief of the security computer blog seguranca-informatica.pt.
In recent years he has invested in the field of information security, exploring and analyzing a wide range of topics, such as pentesting (Kali Linux), malware, exploitation, hacking, IoT and security in Active Directory networks. He is also Freelance Writer (Infosec. Resources Institute and Cyber Defense Magazine) and developer of the 0xSI_f33d – a feed that compiles phishing and malware campaigns targeting Portuguese citizens.
By continuing to use the site, you agree to the use of cookies. more information
The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.