COVIL HACKER

, ! .


» COVIL HACKER » rachaduras/inversão » Artigo Engenharia Reversa para Iniciantes [Parte 3 \ -EXE-]


Artigo Engenharia Reversa para Iniciantes [Parte 3 \ -EXE-]

1 2 2

1

Na continuação da série de artigos, Engenharia reversa para iniciantes, apresento a vocês - parte 3 . Em nosso menu reverso de hoje, este é o programa Http Master 5.6.1 ( A versão atual , no momento da redação deste artigo). Você pode ver por si mesmo olhando para o histórico de versões ( Atualizações do site oficial) https://www.httpmaster.net/history: Ao trabalhar, acontece que existe um bom programa, mas não existe o idioma necessário para ele - de acordo com o padrão, que para a maioria dos usuários

comer não é muito conveniente . E então, começamos a procurar um análogo, ou concordamos com a realidade e trabalhamos com o que temos. Existem várias maneiras de traduzir (localizar programas) , hoje faremos apenas uma delas. Mas tudo tem um tempo, para não alongar o assunto, vamos começar! :frio:.

Normalmente eu faço isso, se houver uma oportunidade de ver, brevemente , qual proteção está no recurso oficial (pelo menos alguma descrição ou menção de restrições), então eu faço, procuro (para facilitar minha tarefa) . Seguimos o link, no escritório. site do programa https://www.httpmaster.net/compare . Aqui, o desenvolvedor gentilmente nos fornece uma comparação das diferenças entreVersão gratuita e profissional . Já existe algo e nós, pelo menos, entendemos
que o valor de $ 99 (para um usuário) para uma licença , para tal programa, é muito.

E já de acordo com o princípio padrão, primeiro determinamos em que o programa está escrito (arrastando-o para o utilitário ExeInfo PE (você pode ler o princípio do utilitário em meus artigos anteriores), sua profundidade de bits e se há algum empacotador (protetor) isso vai complicar a análise do programa para nós. Não importa o quanto, relativamente falando, eles não viram isso. E aqui, como de costume, de acordo com o padrão, vemos:

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

Aqui temos um arquivo executável, seu nome é HttpMaster.Windows.exe
Profundidade de bits (ATENÇÃO!) : Mas a profundidade de bits do sistema não pôde ser determinada pelo programa ExeInfo PE .
O programa é escrito nesta linguagem (ou seja, a linguagem de programação) e se há ofuscação ou empacotamento (compressão): linguagem C #, mas não há empacotador ou proteção adicional, mas isso ainda não significa nada.
Recomendações : Para depurar o arquivo, o utilitário sugere o uso do Net Reflector, versão 11. Cabe a cada um escolher como quiser.
Porém, como o utilitário ExeInfo PE não conseguiu determinar a profundidade de bits do programa instalado, durante a instalação, vemos que, de acordo com o padrão (ao instalar no sistema Windows X64), nos é oferecida a instalação em C:\ Arquivos de Programas (x86 ) \ HttpMaster \ (Todos e Apenas eu, configurando para Todos ou para um usuário (específico)). E saindo disso podemos concluir que o programa que temos é x32 e para depuração (análise) usaremos o depurador x32 - DnSpy . Partindo puramente da lógica, chegamos a tal conclusão, continuamos mais.



https://forumupload.ru/uploads/001b/c9/09/2/t439205.jpg
Mas primeiro, vamos executar o programa e observar sua aparência e observar as informações e os campos de chamada de ativação de licença , nunca se sabe, talvez as informações sejam úteis . Lançamos o programa e vemos que o programa não vai além, e em troca nos são oferecidos dois modos de inicialização , o primeiro é experimental (um modo de familiarização com o programa, com funções limitadas). E o segundo modo é ativado apenas se você comprou os dados de ativação - nome de registro e chave. E desta vez faremos com mais facilidade e basta selecionar o modo de teste e iniciar nele .

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

Executando em modo de teste e procurando no menu Help - License Data ( informações sobre a licença ). E imediatamente fica claro que não há chave, nem funções adicionais . É uma pena, irritante, mas agora vamos descobrir ;), a coisa toda é assim.

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

Agora tudo se encaixa e já entendemos que para ativar o programa precisamos de um par válido na forma de nome de registro e chave. Bem, vamos finalmente começar a análise.

E como é assim que 7 dias o DnSpy atualizou https://github.com/dnSpyEx/dnSpy/releas … v6.3.0-rc1 para a versão 6.3.0-rc1, usaremos a versão atual do depurador;) . Colocamos nosso programa no depurador arrastando o arquivo HttpMaster.Windows.exe . E vá imediatamente para o ponto de entrada do programa clicando com o botão direito do mouse em HttpMaster.Windows.exe .

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

E nosso depurador se move para a classe Program - private static void Main(string[] args) method e vamos ver o que acontece aqui.

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

Código completo para um exemplo visual para facilitar a compreensão do artigo.


private static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.ApplicationExit += Program.OnApplicationExit;
            Application.ThreadException += Program.OnThreadException;
            SettingsManager settingsManager = new SettingsManager();
            int num = 1;
            do
            {
                try
                {
                    settingsManager.CreateSettings();
                    AppData.ApplicationSettings = settingsManager.GetSettings();
                    num += 2;
                }
                catch (Exception)
                {
                    settingsManager.DeleteSettingsFile();
                    num++;
                }
            }
            while (num <= 2);
            if (AppData.ApplicationSettings == null)
            {
                MessageBox.Show(string.Format(Messages.readSettingsError, settingsManager.GetSettingsFolder()), "HttpMaster", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                Application.Exit();
                return;
            }
            if (AppData.ApplicationSettings.SupportInternationalDomainNames)
            {
                try
                {
                    OtherUtils.EnableInternationalSupport(true);
                }
                catch (Exception ex)
                {
                    if (AppData.ApplicationSettings.LogUnhandledError)
                    {
                        Program.WriteToLog(ex.GetType().ToString(), ExceptionUtils.CombineExceptionMessage(ex), ex.StackTrace);
                    }
                }
            }
            if (AppData.ApplicationSettings.DefaultViewer == GlobalValues.PrettyViewEnum.Browser)
            {
                AppData.ApplicationSettings.DefaultViewer = GlobalValues.PrettyViewEnum.Auto;
            }
            AppProcedures.SetScalingValues();
            RegistrationManager registrationManager = new RegistrationManager();
            bool flag = false;
            if (registrationManager.NewLicenseKeyExists())
            {
                flag = true;
                registrationManager.DeleteOldLicense();
            }
            else if (registrationManager.OldLicenseKeyExists() && registrationManager.ConvertLicense())
            {
                flag = true;
                registrationManager.DeleteOldLicense();
            }
            if (!flag)
            {
                using (RegistrationForm registrationForm = new RegistrationForm())
                {
                    registrationForm.HeaderTitle = TextManager.GetFormHeaderTitle(registrationForm.Name);
                    registrationForm.ShowDialog();
                    if (!registrationForm.AllowToContinue)
                    {
                        Application.Exit();
                        return;
                    }
                    AppData.Licensed = registrationForm.LicenseSuccessful;
                    goto IL_175;
                }
            }
            AppData.Licensed = true;
            IL_175:
            string text = string.Empty;
            string text2 = string.Empty;
            bool flag2 = true;
            foreach (string text3 in args)
            {
                if (File.Exists(text3))
                {
                    string extension = Path.GetExtension(text3);
                    string text4 = ".hmpr";
                    string text5 = ".hmex";
                    if (string.Compare(extension, text4, StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        text = text3;
                        flag2 = true;
                        break;
                    }
                    if (string.Compare(extension, text5, StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        text2 = text3;
                        flag2 = true;
                        break;
                    }
                }
                flag2 = false;
            }
            if (!flag2)
            {
                MessageBox.Show(Messages.invalidStartArgument, "HttpMaster", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                Application.Exit();
                return;
            }
            MainForm mainForm = new MainForm();
            if (!AppProcedures.SetFormSize(mainForm))
            {
                mainForm.WindowState = FormWindowState.Maximized;
            }
            if (string.IsNullOrEmpty(text) && string.IsNullOrEmpty(text2))
            {
                if (!AppData.ApplicationSettings.ShowWelcomeForm && AppData.ApplicationSettings.OpenLastProject)
                {
                    string text6 = AppProcedures.DetermineProjectFilePath(0);
                    if (!string.IsNullOrEmpty(text6))
                    {
                        mainForm.OpenProjectFileArgument(text6);
                    }
                }
            }
            else
            {
                mainForm.HmprArgument = text;
                mainForm.HmexArgument = text2;
                if (!string.IsNullOrEmpty(text))
                {
                    mainForm.OpenProjectFileArgument(text);
                }
            }
            Application.Run(mainForm);
        }
    }
}

Rolando um pouco mais abaixo, vemos um pedaço de código, uma espécie de construção. E tem os métodos NewLicenseKeyExists e DeleteOldLicense ; Você entende a direção do pensamento :frio:, eles já encontraram algo relacionado à licença, mas você ainda precisa ver o que está acontecendo lá dentro. Como existem (designs de código que a princípio parecem simples, mas na verdade nem tudo é tão simples quanto nos parecia. DeleteOldLicense fala por si e não estamos tão interessados, algo relacionado à remoção da licença antiga, podemos supor que esta é a desativação de licenças já disponíveis.Mas NewLicenseKeyExists já é mais interessante

Um pedaço de código que obviamente nos interessa.

RegistrationManager registrationManager = new RegistrationManager();
    bool flag = false;
    if (registrationManager.NewLicenseKeyExists())
    {
        flag = true;
        registrationManager.DeleteOldLicense();
    }
    else if (registrationManager.OldLicenseKeyExists() && registrationManager.ConvertLicense())
    {
        flag = true;
        registrationManager.DeleteOldLicense();
    }


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

Vamos para NewLicenseKeyExists e ver o que escondemos lá para surpresas, ou talvez algum tipo de método de verificação universal ou um algoritmo inquebrável :D. Para fazer isso, clique com o botão esquerdo em NewLicenseKeyExists.

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

E depois disso, esse pedaço de código fica disponível para nós. Em que os valores no registro do Windows são verificados e , se não estiverem lá, o resultado é retornado para nós como Falso - ou seja, proibir (não) e mesmo que haja algum valor, os cálculos criptográficos são já está acontecendo (Magic em uma palavra do desenvolvedor :D) . Escolher isso e entender que a criptografia mega legal é mais cara para você em termos de tempo e não faz sentido quando você pode fazer isso muitas vezes mais fácil, rápido e radical , você nem toma banho de vapor.

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

public bool NewLicenseKeyExists()
        {
            string text = RegistryUtils.GetRegistryKey("Software\\Borvid\\HttpMaster", "Id");
            if (string.IsNullOrEmpty(text))
            {
                return false;
            }
            text = EncryptionUtils.Decrypt(text);
            this.LicenseKeyUsed = text;
            return new EncryptedLicenseProvider("<EncryptedLicenseParameters>\r\n\t          <ProductName>HttpMaster Professional 2</ProductName>\r\n\t          <RSAKeyValue>\r\n\t            <Modulus>hQQnn6qzLcZdZPFiCcodmOnnEY/OWaM9DQUFKB8EMBndDF/TvgPduwO2vpClJ7qrf7f8sUuEGcGTjyZfcbverN2JaUynGPCXT1/lBDMMoRnbQmbr2qwVWS/cZBPR4s/4OyAM+mbKfc+OsUoUhHY4jYqf00in2XJQoVc8fXtbdic=</Modulus>\r\n\t            <Exponent>AQAB</Exponent>\r\n\t          </RSAKeyValue>\r\n\t          <DesignSignature>CHiUADfZeCEbMXEd87J+eusIYl8UyoMp9X7Fw17BwVwMCGyjarSCF66NwqOmxI6VWJR3lSRR1BOU8Z92PFE1OdApmhyE70dOuFNtEHfy69oH1zB2fHyy+S5fx3w2WHczExSVIGq43MJaJ06D6t4sz7ZL790PbviuLZIyDfAlBYQ=</DesignSignature>\r\n\t          <RuntimeSignature>SV7vYU99/VR0R/rfj5eDdiM96V1OKyMrkqUS962XiC33Y+JPi6GGLU9XDcMiq37CWV8Pi+pR+buNbbOq9tSF6Z8+xGHyYU+VKdIDfkpmxKsgVMQAJ8vfPZoVOAceB/sid6KQyxdZlAKMX1mMo+/FXHwZ2anHHbjDarQUWPGCG4A=</RuntimeSignature>\r\n\t          <KeyStrength>7</KeyStrength>\r\n\t        </EncryptedLicenseParameters>", string.Empty).ValidateLicenseKey(text) != null;
        }

OBSERVAÇÃO: a chamada para NewLicenseKeyExists vem da biblioteca dinâmica HttpMaster.Engine.dll , localizada ao lado do arquivo de programa principal HttpMaster.Windows.exe . Isso pode ser facilmente entendido olhando no depurador. Ou seja, um tipo de construção onde as funções de teste da dll são carregadas do arquivo principal do programa, se for só para dizer.

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

O que pode ser feito aqui? Sim, tudo é muito simples, você pode fazer a função sempre retornar True , para qualquer resultado. E corte toda a verificação criptográfica , e esse é o ponto :D . Para fazer isso, clique com o botão direito do mouse na função e selecione Alterar método no menu.

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

Como resultado, todo o código de verificação se transformará em uma linha return true; e ficará assim:

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



E agora salvamos nossas alterações já em HttpMaster.Engine.dll (Dynamic Library File). Vamos executar o programa e ver o que temos. A janela pedindo para ativar o programa desapareceu, o programa iniciou no modo profissional. Mas há uma coisa, mas se você for ao menu Help - License Data para ver informações sobre a licença . Então a imagem é exibida não muito bonita, tivemos uma exceção na forma de um erro e ela é exibida e machuca o olho . :frio:. É claro que mesmo nessa situação o programa vai funcionar perfeitamente, mas não fica legal e vamos consertar.

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

Voltando ao início e usando a busca por exemplo Licenseinfo ou visualmente, encontramos a função, o local onde exatamente NewLicenseKeyExists
é chamado e, dependendo do resultado, é exibido no License Information . Este é o lugar :Dque precisávamos encontrar.

Isso é:

public LicenseInfoForm()
{
    this.InitializeComponent();
    RegistrationManager registrationManager = new RegistrationManager();
    if (registrationManager.NewLicenseKeyExists())
    {
        this.licenseKeyLabel.Text = string.Format(this.licenseKeyLabel.Text, registrationManager.LicenseKeyUsed.Substring(0, 5) + " ...");
        this.deleteLicensePanel.Visible = true;
        this.purchaseButton.Visible = false;
        this.okButton.Visible = false;
        this.cancelButton.Text = FormStrings.closeButton;
        return;
    }
    this.addLicensePanel.Visible = true;
}

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

o que fazer a seguir? Sim, nada particularmente complicado, ou seja, o campo this.licenseKeyLabel.Text = e é responsável pela saída de dados para o programa no menu Help - License Data.
E como já curamos o programa, podemos preencher este campo com qualquer dado arbitrário e isso não afetará de forma alguma o funcionamento do programa. Vamos escrever lá, por exemplo, o seguinte texto "Registrado em -EXE- no fórum covil"; . Então o código completo ficará assim:

public LicenseInfoForm()
{
    this.InitializeComponent();
    if (new RegistrationManager().NewLicenseKeyExists())
    {
       // , .
        this.licenseKeyLabel.Text = " -EXE- XSS.IS";
        this.deleteLicensePanel.Visible = true;
        this.purchaseButton.Visible = false;
        this.okButton.Visible = false;
        this.cancelButton.Text = FormStrings.closeButton;
        return;
    }
    this.addLicensePanel.Visible = true;
}

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

Salvamos o resultado e vemos o que obtivemos. Iniciamos o programa e vamos ao menu Ajuda - Dados da licença e vemos como fica nossa inscrição. Já parece mais sólido, concorda?:frio:

Você pode ir além e escrever sua autoria ou texto arbitrário em nome do próprio programa, no formulário principal. Como fazer isso ? Sim, tudo é simples. Como sabemos, todas as variáveis ​​de texto relacionadas aos nomes de janelas, campos e não apenas são atribuídas no formulário principal do programa. Para encontrar a linha que precisamos no depurador, vá ao MainForm e procure a palavra Professional , conforme aparece no nome do programa.

Em seguida, editamos o nome do programa como desejar, você pode adicionar qualquer texto. Por exemplo, vamos adicionar o seguinte texto lá ( Artigo para o fórum XSS.IS de -EXE- ). Clique com o botão direito do mouse e selecione editar instrução IL , adicione texto e salve.
Bem, como você gosta dessa opção, também não parece nada. O usuário, tendo iniciado o programa, verá imediatamente quem o reverteu ;). Bem, e se mostrarmos programas de cracking, essas pequenas coisas também serão úteis para o futuro. Como resultado, curamos o programa, trouxemos beleza, isso é tudo para quebrar esse software. E, em geral, nem todo mundo vai além.


Deixe-me agora mostrar como você pode localizar o software no idioma que você precisa, se houver necessidade disso. Bom, acontece que dói os olhos se o programa só tiver inglês e pronto. Então agora vamos ver como fazer direto do depurador sem sair de casa :frio:Vamos rodar o programa e olhar o menu Arquivo. Vemos que inicialmente todos os menus, como o programa, estão em inglês, então vamos encontrar esse menu na estrutura do código e traduzir alguns itens para o russo.

Para isso, buscando por MainForm, por exemplo, procuramos o nome do menu Novo Projeto . Aqui o principal para nós é só pegar e achar pelo menos um ponto e onde está um e o resto, acredite. E eis que encontramos o texto desejado. Vemos grupos de menu e sua estrutura. Bem, agora vamos alterar alguns valores e ver o que obtemos.

Para fazer isso, clique com o botão direito do mouse e selecione Editar método. Editamos o texto de que precisamos, traduzimos para o russo e clicamos em Compilar .

Depois disso, obtemos uma versão do programa com alterações. E só temos que salvar o resultado no arquivo exe finalizado e ver o resultado executando o programa.

Salvamos o programa, no depurador o arquivo - salve tudo e execute o programa. E vamos ver o que temos. E o que aconteceu conosco é que traduzimos as falas do inglês para o russo, o que é muito bom, não é ? Bem, se necessário, você pode traduzir (localizar) o programa para o idioma de que precisa.

Bem, vamos resumir um pouco .
Neste artigo, examinamos a proteção de outro programa . Algumas nuances foram aprendidas com o artigo, a saber, que a proteção de software pode ser chamada ( verificada ) não apenas do arquivo principal, mas também de arquivos auxiliares, bibliotecas dinâmicas . Talvez a abordagem esteja parcialmente correta, mas ao criar quais verificações, o desenvolvedor , antes de tudo, deve pensar em programar um método (algoritmo) de proteção não padrão. Não vamos inflar bolhas de sabão :frio:, porque todos viram como eu contornei a proteção. Portanto, esta é apenas uma das maneiras mostradas, grosso modo, nos dedos.

Não paro por aí, cada artigoserá igual à alma quebrada do programa ;) . Bem, todos tenham um desenvolvimento agradável, prático emoderno, tudo vai dar certo para você, por conta própria, desejo apenas sucesso! ;). Perdoem-me, desenvolvedores de software:D.



https://mega.nz/file/gCURlRpQ#JYiSiiB_k … greawiwmgg

0

2


» COVIL HACKER » rachaduras/inversão » Artigo Engenharia Reversa para Iniciantes [Parte 3 \ -EXE-]


|