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.
Este é um dos assuntos já largamente discutido no blog. Pode ser consultado através do link a seguir: https://seguranca-informatica.pt/vulnerabilidades-no-software-e-ataques-na-internet/ .
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
- Dim i As Integer
- For i = 0 To generaldee.Length – 1
- Select Case Strings.LCase(generaldee(i).ProcessName)
- Case “ollydbg”
- generaldee(i).Kill()
- Case Else
- End Select
- Next
- End Sub
- End Sub
Anti SandBoxie
- Sub CheckForSandboxie()
- If Process.GetProcessesByName(“SbieCtrl”).Length >= 1 Then
- Application.Exit()
- End If
- End Sub
Anti Wireshark
- Sub WireShark()
- Dim generaldee As Process() = Process.GetProcesses
- Dim i As Integer
- For i = 0 To generaldee.Length – 1
- Select Case Strings.LCase(generaldee(i).ProcessName)
- Case “wireshark”
- generaldee(i).Kill()
- Case Else
- End Select
- Next
- End Sub
Anti Fiddler
- Sub fiddler()
- Dim generaldee As Process() = Process.GetProcesses
- Dim i As Integer
- For i = 0 To generaldee.Length – 1
- Select Case Strings.LCase(generaldee(i).ProcessName)
- Case “fiddler”
- generaldee(i).Kill()
- Case Else
- End Select
- Next
- End Sub
Com mais ou menos detalhe, são este o tipo de funções implementadas, com o objetivo de proteger o binário em tempo de execução.
De forma a completar o código disponibilizado anteriormente, é demostrado a seguir, como estas funções podem ser invocadas.
- AntiOllydbg() ‘Debugger
- CheckForSandboxie() ‘Allows running programs virtually
- WireShark() ‘Traffic analyzer
- fiddler() ‘Traffic analyzer
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.