Saudações a todos os usuários deste fórum. E hoje iniciarei uma série de artigos sobre reversão (pesquisa) de vários programas. E se você também gostou do artigo, verá os próximos muito em breve.

Nosso paciente de hoje é o Src Protector . Este é um programa para ofuscação (proteção) do código PHP . A principal funcionalidade do programa - torna o
código ilegível ( funções, variáveis, classes ) bem e mais alguns gadgets do desenvolvedor. Estaria tudo bem se o software fosse gratuito, porque cada um de nós adora uma bola, um brinde em termos populares. ;)

Antes de começar, direi algumas palavras sobre limitações. Nesse caso, o próprio desenvolvedor nos conta sobre as limitações do programa.
Que é um shareware e se você acessar o site do desenvolvedor http://phpobfuscator.net/download.html e tentar fazer o download, será imediatamente confrontado com o fato de que o programa não é gratuito e tem limitações.

https://forumupload.ru/uploads/001b/c9/09/2/t686550.jpg

No modo de demonstração, o programa só pode ofuscar o código de 5 arquivos php por vez. Se você não tem um projeto grande, fica claro que a
versão demo é suficiente e você não precisa comprar nada. E se você tem um grande projeto, então compre :), o slogan do desenvolvedor. :sorriso50:

Neste caso, conhecemos as limitações do programa, o que já simplifica o próprio processo, a princípio. Além disso, precisamos apenas de atenção e um pouco de conhecimento da estrutura de código na qual o programa está escrito.

Para continuar precisamos:
Determine em que nosso programa está escrito (Ambiente de Programação) e descubra se o programa está protegido por algum tipo de protetor, empacotador, obfuscator. O que acabaria por escolher - um depurador adequado para o trabalho.
Descubra o número de bits do programa, aplicativo (32 bits) ou (64 bits) . E dependendo disso, use o depurador para a profundidade de bits que precisamos.

Essas informações podem ser encontradas usando o utilitário ExeInfo PE . Em poucas palavras, é isso que possibilita a visualização de informações sobre um arquivo. Como usar este programa é muito simples. É necessário arrastar o arquivo investigado (paciente) para o formulário do programa e após isso, na janela do ExeInfo PE você receberá todas as informações .
No exemplo do nosso programa Src Protector . Instale o programa, vá até a pasta com o programa instalado e arraste o arquivo srcProtector.exe para o formulário ExeInfoPE . Depois disso, você verá informações

https://forumupload.ru/uploads/001b/c9/09/2/t611938.jpg

Nome do arquivo analisado: srcProtector.exe
Profundidade de bits: aplicativo do Windows de 32 bits (32 bits)
O arquivo está compactado e no que está escrito: No nosso caso, MS Visual C#
E o último ponto, fica como recomendação: use o Net Reflector 11 como depurador

Acho que aqui está tudo muito claro, o principal é ler tudo com atenção e não haverá problemas. Depois de coletar as informações necessárias, podemos começar a domar nosso paciente.

E como depurador, escolhi o programa DnSpy , pois para mim é uma coisa muito conveniente para montagens de rede de engenharia reversa. Você pode usar outras ferramentas para analisar e editar código. Mas, neste caso, mostro no exemplo do DnSpy.

Mas primeiro, simplesmente executaremos nosso paciente (o programa que está sendo analisado) e tentaremos carregar mais de 5 arquivos nele para ver como o programa se comporta ao vivo, por assim dizer ;). E agora recebemos essa mensagem e, como resultado, não importa quantos arquivos você carregue no programa, mais de 5 não funcionarão.

https://forumupload.ru/uploads/001b/c9/09/2/t149211.jpg

Vá em frente, veja o formulário de ativação do programa. Acesse a aba licença e veja que para ativar o programa você precisa inserir os dados de ativação - Caixa Postal e Chave (E-mail + Serial). Normalmente, isso pode indicar que o programa verifica os dados cadastrais em seu servidor . Mas você não deve se desesperar nessas situações e pensar que o software não está mais quebrado se o cheque vier do servidor. A maioria dos desenvolvedores ainda comete erros típicos de segurança, então vamos seguir em frente.

https://forumupload.ru/uploads/001b/c9/09/2/t223945.jpg

Vamos executar o DnSpy x32, pois descobrimos acima que nosso aplicativo é de 32 bits . Quando o depurador iniciar, a princípio será incomum para quem não trabalhou com ele, cheio de todos os tipos de abas e o que não está claro onde. Mas há uma primeira vez para tudo, então vamos continuar. É claro que para pessoas experientes minhas palavras soam muito simples. Mas para quem vê tudo primeiro, será muito útil e informativo ler o artigo. Agora vou mostrar tudo como se estivesse em meus dedos e contar com as palavras mais simples possíveis, para que não seja difícil descobrir.

https://forumupload.ru/uploads/001b/c9/09/2/t512342.jpg

Depois disso, arraste o arquivo de programa srcProtector.exe para o formulário DnSpy.

https://forumupload.ru/uploads/001b/c9/09/2/t611807.jpg

Normalmente, para analisar em que princípio funciona a ativação do programa, precisamos encontrar, ir para o ponto de entrada . O ponto de entrada é o endereço onde começa a execução do programa . Ou seja, o lançamento, inicialização de funções, procedimentos (em palavras simples) . Para fazer isso, clique com o botão direito do mouse em nosso arquivo no DnSpy e clique em ir para o ponto de entrada. A seguir, temos uma árvore com diferentes funções (vamos chamá-la ;)assim, para que fique claro o significado do que foi feito, mesmo para iniciantes ).

https://forumupload.ru/uploads/001b/c9/09/2/t440261.jpg

E agora vou mostrar um dos exemplos de encontrar as funções necessárias e vinculá-las. E também considere o princípio da pesquisa - verificação da licença. Na lista que se abre, notamos uma classe de licença interessante.

https://forumupload.ru/uploads/001b/c9/09/2/t481884.jpg

Ao clicar nele, vemos que os campos Email e Serial são utilizados na classe da licença, essa é a primeira pista, pois já sabemos que esses campos são utilizados para ativar o programa. E as strings public string email, public string serial e public stringcheck são apenas valores (relativamente falando).

https://forumupload.ru/uploads/001b/c9/09/2/t271370.jpg

E o que fazer a seguir em tal situação? Tudo é muito simples, vamos tentar registrar uma licença através da busca do DnSpy e ver quais funções utilizam esta linha.
Após a conclusão da pesquisa, teremos uma lista de funções .

https://forumupload.ru/uploads/001b/c9/09/2/t606712.jpg

Vejamos o primeiro LoadLicense e, depois disso, o restante das funções ( não estou apenas dizendo isso, olhando um pouco adiante ).

Bem, vou comentar um pouco sobre o que está acontecendo aqui, nesta função. E coisas muito simples acontecem aqui , eu diria, um exemplo de como não proteger seu programa . Bem, agora vou descrever o algoritmo de ações com mais detalhes e em ordem.

Desde o início, o arquivo de licença é verificado se (File.Exists("license")) existe.
Se não houver licença se (this.lic.verification == null) então, por padrão, o modo Demo é ativado .
Há também uma validação dos dados inseridos HTTPRequest httprequest = new HTTPRequest - através do site do desenvolvedor, como sugeri acima . O princípio de funcionamento é o seguinte - Os dados inseridos E-mail e Número de série são enviados para o servidor e se os dados estiverem corretos, está no site do desenvolvedor MOT e aqui PRESTE ATENÇÃO:

é-nos mostrado de forma aberta que o programa está ativado, se os seus dados estiverem corretos, a licença torna-se completa, sem restrições.

this.mode = "full";
this.liclbl.Text = "License activated";

https://forumupload.ru/uploads/001b/c9/09/2/t163249.jpg

Função completa para sua referência:

private void LoadLicense()
        {
            if (File.Exists("license"))
            {
                Stream stream = File.Open("license", FileMode.Open);
                BinaryFormatter binaryFormatter = new BinaryFormatter();
                this.lic = (license)binaryFormatter.Deserialize(stream);
                stream.Close();
                this.email.Text = this.lic.email;
                this.serial.Text = this.lic.serial;
            }
            if (this.lic.verification == null)
            {
                this.mode = "demo";
                this.liclbl.Text = "Demo mode";
            }
            else
            {
                try
                {
                    HTTPRequest httprequest = new HTTPRequest("http://p-encoder.com/licensing.php", "POST", "email=" + this.email.Text + "&serial=" + this.serial.Text);
                    if (httprequest.GetResponse() == this.genLicenseVerification(this.email.Text, this.serial.Text))
                    {
                        this.lic.verification = this.genLicenseVerification(this.email.Text, this.serial.Text);
                        this.mode = "full";
                        this.liclbl.Text = "License activated";
                    }
                    else
                    {
                        System.Windows.Forms.MessageBox.Show("License verification failed! You have entered incorrect license information or your license has expired.");
                        this.lic.verification = null;
                    }
                }
                catch
                {
                    System.Windows.Forms.MessageBox.Show("Your license cannot be verified, check your internet connection or firewall settings.");
                }
            }
        }


E agora você pode torcer o código da função como quiser. E agora vou mostrar uma maneira de sair dessa situação. A maneira mais simples, pode-se chamar, intervenção mínima no código . ;)Ou seja, o que você acha que acontecerá se a verificação if (this.lic.verification == null) for editada para
que o programa pareça um peixe na água , mesmo que não passe na verificação online . E para isso editamos o parâmetro demo para completo e o modo de demonstração para Licença ativada . Para fazer isso, clique com o botão direito do mouse na função. E selecione Editar instruções IL.

https://forumupload.ru/uploads/001b/c9/09/2/t986748.jpg

https://forumupload.ru/uploads/001b/c9/09/2/t975037.jpg

E agora que nossa função mudou assim. Ou seja, na inicialização, mesmo que não haja chave de ativação , o programa já está ativado e já está roxo escuro para verificações do lado do servidor .

private void LoadLicense()
        {
            if (File.Exists("license"))
            {
                Stream stream = File.Open("license", FileMode.Open);
                BinaryFormatter binaryFormatter = new BinaryFormatter();
                this.lic = (license)binaryFormatter.Deserialize(stream);
                stream.Close();
                this.email.Text = this.lic.email;
                this.serial.Text = this.lic.serial;
            }
            if (this.lic.verification == null)
            {
                this.mode = "full";
                this.liclbl.Text = "License activated";
            }
            else
            {
                try
                {
                    HTTPRequest httprequest = new HTTPRequest("http://p-encoder.com/licensing.php", "POST", "email=" + this.email.Text + "&serial=" + this.serial.Text);
                    if (httprequest.GetResponse() == this.genLicenseVerification(this.email.Text, this.serial.Text))
                    {
                        this.lic.verification = this.genLicenseVerification(this.email.Text, this.serial.Text);
                        this.mode = "full";
                        this.liclbl.Text = "License activated";
                    }
                    else
                    {
                        System.Windows.Forms.MessageBox.Show("License verification failed! You have entered incorrect license information or your license has expired.");
                        this.lic.verification = null;
                    }
                }
                catch
                {
                    System.Windows.Forms.MessageBox.Show("Your license cannot be verified, check your internet connection or firewall settings.");
                }
            }
        }


https://forumupload.ru/uploads/001b/c9/09/2/t812915.jpg


Agora vamos salvar o arquivo com nossas edições e ver o que conseguimos. Clique no item de menu Arquivo e salve tudo.

https://forumupload.ru/uploads/001b/c9/09/2/t721024.jpg

O que aconteceu conosco é que o programa já iniciou em um formulário ativado e não há mensagens ao carregar mais de 5 arquivos . E agora você pode até carregar 100 arquivos .

https://forumupload.ru/uploads/001b/c9/09/2/t971231.jpg

Está tudo bem, ótimo e pode ser deixado como está ;). Mas vamos trazer beleza, digamos assim . O que quero dizer é que, quando você executa o programa, após as alterações acima , não há dados nas informações da licença. O que não é muito bonito

https://forumupload.ru/uploads/001b/c9/09/2/t415758.jpg

Como sou o autor do artigo, deixe-me inserir os seguintes dados cadastrais: Por exemplo, onde a caixa de correio está Rachada por -EXE- XSS.IS e a chave é xss.is-xss.is-xss.is e aqui está a função de verificação (licença) via Internet você pode removê-la com segurança, cortá-la do código, porque não faz mais sentido . E no final com a enorme função de ativação que dei acima, temos tudo reduzido para 4 linhas ;) . As duas primeiras linhas ativam a licença completa e as duas segundas linhas são os campos E-mail e Chave de ativação que são exibidos nas informações da licença, por beleza , digamos.

https://forumupload.ru/uploads/001b/c9/09/2/t85259.jpg

Salvamos as alterações novamente e obtemos o resultado, na inicialização o programa também é ativado. E as informações de licença exibem dados de ativação , no nosso caso, meus. Parece lindo, não há restrições ;).

https://forumupload.ru/uploads/001b/c9/09/2/t728739.jpg



E no próprio código do programa ( Se você pegá -lo), existem esses pedaços de código e ocorrem exatamente em dois lugares :

https://forumupload.ru/uploads/001b/c9/09/2/t42986.jpg

if (this.mode == "demo" && this.files.Items.Count + list.Count > 5)

    {

        this.files.Items.Clear();

        int num = list.Count - 5;

        if (num > 0)

        {

            list.RemoveRange(5, list.Count - 5);

        }

        else

        {

            list.Clear();

        }

        System.Windows.MessageBox.Show("Demo mode is limited to analyze and encode only maximum number of 5 files. Buy a license to process more files.");

Você entende o que diz? Tudo é muito simples aqui, se você alterar o número 5 para 50 ou 50.000, o programa poderá processar o máximo de arquivos.
Ou apenas remova essas verificações . O principal aqui é ligar a fantasia , e o exemplo que mostrei acima só te ensina a pensar logicamente.

Bem, agora deixe-me resumir. ;)

Em geral, esses métodos de proteção de software não são chamados de proteção, mas simplesmente uma bela decoração de janela. Além disso, o desenvolvedor do software nem se preocupou em ofuscar o código. Mas isso não mudaria nada, pois tendo conhecimento, o tempo também não o salvará. Se você gostou do artigo, com certeza publicarei mais, compartilharei minha experiência. Bom humor para todos vocês!:frio:

Os arquivos estão anexados ao artigo (embora todas essas ferramentas estejam em fontes oficiais)
Temos uma captura de tela no arquivo:

https://forumupload.ru/uploads/001b/c9/09/2/t84679.jpg

https://mega.nz/file/QC0AQaTa#Hd_NUAn5o … gQxs5Fcb_E