Reading Time: 4 minutes
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
 
  1. Sub AntiOllydbg()
  2.   Dim generaldee As Process() = Process.GetProcesses
  3.   Dim i As Integer
  4.   For i = 0 To generaldee.Length – 1
  5.      Select Case Strings.LCase(generaldee(i).ProcessName)
  6.        Case “ollydbg”
  7.          generaldee(i).Kill()
  8.        Case Else
  9.      End Select
  10.   Next
  11. End Sub
  12. End Sub
Anti SandBoxie
 
  1. Sub CheckForSandboxie()
  2.    If Process.GetProcessesByName(“SbieCtrl”).Length >= 1 Then
  3.      Application.Exit()
  4.    End If
  5. End Sub
 
Anti Wireshark
 
  1. Sub WireShark()
  2.   Dim generaldee As Process() = Process.GetProcesses
  3.   Dim i As Integer
  4.   For i = 0 To generaldee.Length – 1
  5.      Select Case Strings.LCase(generaldee(i).ProcessName)
  6.        Case “wireshark”
  7.           generaldee(i).Kill()
  8.        Case Else
  9.      End Select
  10.   Next
  11. End Sub
 
Anti Fiddler
 
  1. Sub fiddler()
  2.   Dim generaldee As Process() = Process.GetProcesses
  3.   Dim i As Integer
  4.   For i = 0 To generaldee.Length – 1
  5.     Select Case Strings.LCase(generaldee(i).ProcessName)
  6.       Case “fiddler”
  7.          generaldee(i).Kill()
  8.       Case Else
  9.     End Select
  10.   Next
  11. 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.

  1. AntiOllydbg() ‘Debugger
  2. CheckForSandboxie() ‘Allows running programs virtually
  3. WireShark() ‘Traffic analyzer
  4. 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.
Boa continuação.
Qualquer dúvida: [email protected]