Olá a todos, Boas Festas a todos! , apresento a vocês a segunda parte do artigo sobre programas de pesquisa (cracking) . Este artigo discutirá em detalhes a proteção da versão atual, no momento da publicação do artigo, do programa http Logs View, versão 6.12.
Para que serve este programa: Este programa permite filtrar e analisar arquivos de log Apache/IIS/nginx (logs) . No site oficial do desenvolvedor https://www.apacheviewer.com/purchase/ é disponibilizado em três versões - gratuita (com restrições), para pessoas físicas e jurídicas. Falaremos agora sobre essas limitações, pois no artigo anterior contarei e mostrarei da forma mais simples possível para que fique clara a lógica de minhas ações.
O desenvolvedor do programa realmente não disse em seu site o que exatamente era limitado em funcionalidade, mas simplesmente notificou a todos que algumas funções foram bloqueadas e você pode desbloqueá-las com uma chave . Bem o quevamos olhar para o princípio de ativar o programa e tentar ver, para começar a determinar visualmente - o que exatamente é limitado em funcionalidade.
Baixe o programa, instale e execute. Se você olhar a guia Ajuda -> Sobre do programa, verá que as funções bloqueadas estão desativadas e acinzentadas . Isso já é bom e pelo menos já apareceu alguma clareza, agora já sabemos onde cavar.:frio:
Ou seja, todas as funções do programa estão inativas e acinzentadas, e existem algumas delas. E bem na parte inferior do programa há uma inscrição de que o programa precisa ser desbloqueado, ou seja, comprado. Bem, é claro que não faremos isso.
Por exemplo
De acordo com o padrão, primeiro precisamos determinar em que nosso programa está escrito (Linguagem de Programação) e se existe algum empacotador ou protetor no arquivo executável do programa. O utilitário ExeInfo PE nos ajudará com isso, selecione e arraste o arquivo executável para o nosso utilitário. E nós vemos esta foto.
Informações sobre o arquivo executável do programa: httpLogsView.exe
Bitness: Aqui, mostramos que este é um aplicativo do Windows de 64 bits (64 bits)
Linguagem de programação e se há ofuscação ou empacotamento (compressão): Eazfuscator.NET v3.3 - 5.0 [ v3.x ]
Recomendações: Para desofuscar o arquivo, o utilitário sugere o uso de de4dot
Como o programa está sob o código obfuscator (processado) - chamado Eazfuscator, será necessário desofuscar o código, trazer o código para uma forma legível (divina) para posteriormente analisar o princípio de proteção do programa. E se você deixar tudo como está, não será fácil ler o código e, em alguns casos, é simplesmente impossível. Em geral, o objetivo dos ofuscadores é simples, tornar o código ilegível renomeando, ofuscando funções e assim por diante.
Para desofuscação, usei outro programa de4dot 5.8 (Eazfuscator Support) , um assembly feito sob medida para este ofuscador . Como resultado, basta arrastar
o arquivo executável do programa sob investigação para de4dot.exe. E obtemos o resultado, por exemplo, quem não sabe o que é o quê - a coisa toda se parece com isso:
Depois que o arquivo for examinado, o arquivo httpLogsView-cleaned.exe aparecerá na pasta com seu programa . Este é o arquivo no qual nosso desofuscador retornou o código (Restaurado) , para um estado mais ou menos legível.
Por exemplo, vamos comparar o resultado antes e depois do processamento (desofuscação) do programa em estudo . Para fazer isso, carregue o arquivo no depurador. E como descobrimos acima que este é um aplicativo de 64 bits (64 bits) ( Usando o utilitário ExeInfo PE ), trabalhamos com dnSpy x64 .
e veja a comparação.
Essa é a estrutura do código do nosso arquivo original sob o ofuscador , onde o código é transformado em uma espécie de mingau em forma de linhas\u0002 e \u0002\u2000 e assim por diante . E é extremamente inconveniente analisar esse código. Tudo é feito de forma que, ao analisar o inverso - um engenheiro (um cracker, chame-o de conveniente) não conseguiu descobrir pelo que era responsável e não conseguiu realizar a intenção desejada - para charlatar o software , etc.
E esta é a estrutura do código após a desofuscação (tradução do código de difícil de ler para normal e compreensível para análise ). Aliás, vale ressaltar que nem sempre é possível restaurar 100%, devolver o código ao estado ideal . O fato é que o de4dot não pode restaurar os nomes das variáveis locais após o obfuscator. Mas a estrutura do código é trazida para uma forma normal, restaurada.
Deixe-me comentar por que isso está acontecendo. O obfuscator não extrai os nomes das variáveis locais, mas gera uma espécie de descompilador para elas . Mas
quanto aos argumentos da função, eles fazem parte da interface e , portanto, são armazenados. E no assembly compilado (IL), os nomes das variáveis locais não são armazenados.
E, como resultado, a estrutura do código após a desofuscação fica assim.
A parte principal foi desmontada, agora você pode prosseguir para a análise da proteção do programa . Lançamos nosso arquivo httpLogsView-cleaned.exe, já limpo do mal, no dnSpy x64. E passamos ao ponto de entrada do programa em estudo. Para fazer isso, clique com o botão direito em ir para o ponto de entrada
Aqui, Application.Run(new MainForm()) , o formulário principal do programa é lançado e inicializado. Bem, agora vamos pensar logicamente (ISSO É IMPORTANTE) . Com restrições como no nosso programa de hoje. Em 99% dos casos, ao carregar o programa (janela principal), o programa verifica a chave de ativação e se estiver correta , então o programa funciona, o quê? - será desbloqueado.
E se a chave de ativação não estiver correta, eles não estarão disponíveis . Disse para lhe dar uma ideia. É lógico? Ou eu estou errado? Acho e tenho certeza que estou certo , falo sem sarcasmo, puramente humanamente!
Simplesmente, gosto não só de considerar a proteção de acordo com o padrão, mas também de você, partindo do bom senso - não apenas quebre, mas também mostre os prós e os contras. No nosso negócio, no meu negócio (por hábito eu digo) - Tendo experiência e lutando com diferentes sistemas de defesa - estou tentando mostrar a você como procurar falhas (buracos) na proteção, deixando minha experiência .
Com o tempo, tendo adquirido experiência , você mesmo entenderá do que estou falando, isso se aplica a iniciantes, já que usuários experientes (reversos - os engenheiros já passaram por isso) são suas atividades diárias.
Devemos continuar? Acho que todos estão interessados? . Nesse caso, vá para new MainForm() , onde as várias funções são iniciadas (Clicando com o botão esquerdo do mouse em new MainForm()) .
E nós temos essa imagem. O significado no início pode não ser claro para todos, mas no final você entenderá 100%. Nós vamos mais longe.
Com base no que eu disse, vamos procurar o código (função e um trecho de código dela) responsável pelo carregamento (lançamento do programa e restrições) e ver o que acontece lá. Obviamente MainForm_Load é responsável por carregar os componentes que são carregados quando o programa inicia, ou estou errado? . Bem, claro que sim . E vamos ver o que se passa lá dentro, é mais interessante, viu. Como prometido , vamos considerar todas as nuances.
Para um entendimento completo, aqui está a função completa:
MainForm
// Token: 0x06000125 RID: 293 RVA: 0x0001591C File Offset: 0x00013B1C
private void MainForm_Load(object sender, EventArgs e)
{
try
{
if (Class95.bool_2)
{
Prefs.DeletePrefs();
}
Debug.Info("Started..");
Prefs prefs = Prefs.Load(Prefs.Filename);
if (string.IsNullOrEmpty(prefs.InstallID))
{
prefs.InstallID = Guid.NewGuid().ToString();
}
if (prefs.sizex > 50)
{
base.Width = prefs.sizex;
}
if (prefs.sizey > 50)
{
base.Height = prefs.sizey;
}
if (base.Width < 50)
{
base.Width = 957;
}
if (base.Height < 50)
{
base.Height = 595;
}
if (prefs.maximised)
{
base.WindowState = FormWindowState.Maximized;
}
if (prefs.x >= 0 && prefs.y >= 0)
{
base.Location = new Point(prefs.x, prefs.y);
}
this.prefs_0 = prefs;
try
{
if (!string.IsNullOrEmpty(this.prefs_0.Key))
{
string string_ = Class1.smethod_0(this.prefs_0.Key);
this.bool_0 = Class1.smethod_1(string_);
}
}
catch (Exception)
{
this.bool_0 = false;
}
if (this.bool_0)
{
if (this.prefs_0.Theme == "Dark")
{
MainForm.bool_2 = true;
}
if (MainForm.bool_2)
{
this.tabControl1.LookAndFeel.SkinName = "Metropolis Dark";
this.tabControl1.LookAndFeel.UseDefaultLookAndFeel = false;
LogLine.DarkMode = MainForm.bool_2;
this.color_0 = DarkTheme.smethod_0();
DarkTheme.smethod_2(this);
DarkTheme.smethod_8(this.contextMenuStripItems);
DarkTheme.smethod_8(this.contextMenuStripNotifyIcon);
}
}
if (this.prefs_0.logColumns == null || this.prefs_0.logColumns.Count <= 0)
{
this.prefs_0.logColumns = LogColumn.ResetLogColumns();
}
Debug.Info("Loading Custom Columns");
this.prefsColumns_0 = PrefsColumns.Load(PrefsColumns.Filename);
this.method_43();
DummyListView.prefs = prefs;
Debug.Info("Loading IP DB");
this.ip2Country_0 = new IP2Country(true, this.prefs_0.useCity);
this.parser_0 = new Parser(this.ip2Country_0);
this.parser_0.ParseCustomColumns = this.prefs_0.parseCustomColumns;
Statistics.int_0 = this.prefs_0.topNumber;
try
{
if (prefs.monitorAuto)
{
Debug.Info("Opening Logs...");
foreach (LoggerInfo loggerInfo in prefs.logsToView)
{
if (loggerInfo.Highlight != null)
{
this.method_49(loggerInfo.Highlight, true);
}
try
{
this.method_6(loggerInfo);
if (Class95.bool_0)
{
GC.Collect();
}
}
catch
{
}
}
}
if (Class95.list_0 != null)
{
foreach (string text in Class95.list_0)
{
try
{
bool flag = this.parser_0.IsErrorLog(text);
this.method_4(text, !flag, false);
if (Class95.bool_0)
{
GC.Collect();
}
}
catch
{
}
}
}
}
catch (Exception)
{
MessageBox.Show(Class96.smethod_248());
}
if (this.prefs_0.selTab >= 0 && this.tabControl1.TabPages.Count > this.prefs_0.selTab)
{
this.tabControl1.SelectedTabPageIndex = this.prefs_0.selTab;
}
try
{
if (IsStoreApp.IsWindowsStoreApp)
{
this.bool_0 = true;
this.bool_1 = true;
this.method_0();
}
}
catch
{
}
if (!this.bool_0)
{
this.lbStatusStripNotify.Text = Class96.smethod_271() + " http Logs Viewer..." + Class96.smethod_68();
this.method_2(false);
MainForm.bool_2 = false;
}
else
{
this.lbStatusStripNotify.Text = Class96.smethod_271() + " http Logs Viewer";
this.method_2(true);
}
Debug.Info("Apply L...");
this.method_45(false);
this.method_1();
Debug.Info("Apply L Done");
}
catch (Exception ex)
{
Debug.Error("Error Load: " + ex.Message);
if (this.prefs_0 == null)
{
this.prefs_0 = new Prefs();
}
}
finally
{
LoadForm.smethod_1();
}
if (this.prefs_0.checkupdates)
{
new Thread(new ThreadStart(this.method_26)).Start();
}
if (!this.bool_1)
{
if (File.Exists(Prefs.Filename + ".chk"))
{
Debug.Info("Config Check");
if (File.ReadAllText(Prefs.Filename + ".chk") == "0")
{
MessageBox.Show(this, Class96.smethod_54(), "http Logs Viewer", MessageBoxButtons.OK, MessageBoxIcon.Hand);
this.prefs_0.Key = string.Empty;
this.unlockCodeToolStripMenuItem_Click(this, null);
if (File.Exists(Prefs.Filename + ".chk") && this.bool_0)
{
Application.Exit();
}
}
else if (this.bool_0)
{
new Thread(new ThreadStart(this.method_24)).Start();
}
}
}
else if (this.bool_0)
{
new Thread(new ThreadStart(this.method_24)).Start();
}
this.timer_0.Interval = this.prefs_0.refreshtimeout * 1000;
this.timer_0.Enabled = true;
this.timer_0.Start();
GC.Collect();
if (base.Width <= 10)
{
base.Width = 668;
}
if (base.Height <= 10)
{
base.Height = 460;
}
this.menuStrip1.Visible = true;
this.toolStripBtnScroll.CheckState = (this.prefs_0.scroll_last ? CheckState.Checked : CheckState.Unchecked);
this.toolStripBtnRefresh.CheckState = (this.prefs_0.refreshAuto ? CheckState.Checked : CheckState.Unchecked);
Debug.Info("Started..OK");
}
E então vamos continuar o que vemos aqui, falando sem água, para não alongar o assunto. Meu princípio é mostrar a base e dizer por que é assim e de nenhuma outra maneira . E há duas maneiras de resolver o problema (pelo menos) . Mas como sempre, vamos começar com um simples , ou seja, esse é o caso apenas se você entender pouco sobre essa função (mas pelo menos há um conhecimento mínimo da linguagem de programação).
E assim, preste atenção ao trecho de código de MainForm_Load (ou seja, para um usuário simples e comum - falando):
Temos uma condição, vou comentar o que está acontecendo aqui, partindo do fato de que - COMO SE eu fosse novo neste negócio:
//
if (!this.bool_0)
{
// ,
this.lbStatusStripNotify.Text = Class96.smethod_271() + " http Logs Viewer..." + Class96.smethod_68();
this.method_2(false);
MainForm.bool_2 = false;
}
// .
// If
else
{
this.lbStatusStripNotify.Text = Class96.smethod_271() + " http Logs Viewer";
this.method_2(true);
}
Bem, vamos dar uma olhada em: Opção 1 (Se você não é uma pessoa experiente) e tudo é aproximadamente intuitivamente claro, digamos em termos gerais. Se formos para smethod_68(); então fica claro para nós que a chamada é inicializada aqui se a licença não for paga, não há chave, ou seja, precisamos doar $ . Naturalmente, as funções do programa são bloqueadas aqui
this.method_2(false);
MainForm.bool_2 = falso;
Vamos (clique esquerdo do mouse) para this.method_2(false); e veja o código :
private void method_2(bool bool_5)
{
if (bool_5)
{
this.toolStripStatusDonate.Text = "iannet";
this.toolStripStatusLabel1.Visible = false;
}
else
{
this.toolStripStatusDonate.Text = Class96.smethod_264();
this.toolStripStatusLabel1.Visible = true;
}
MainForm.smethod_1(this.statisticsToolStripMenuItem, bool_5, 5);
MainForm.smethod_1(this.topToolStripMenuItem, bool_5, 1);
MainForm.smethod_1(this.distinctToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.timeTakenToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.sizeToolStripMenuItem1, bool_5, -1);
MainForm.smethod_1(this.botsToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.requestAnalysisToolStripMenuItem1, bool_5, -1);
MainForm.smethod_1(this.referrerToolStripMenuItem1, bool_5, -1);
MainForm.smethod_1(this.statusCodesToolStripMenuItem2, bool_5, -1);
MainForm.smethod_1(this.behaviourToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.virtualHostToolStripMenuItem1, bool_5, -1);
this.topToolStripMenuItem.Enabled = true;
this.distinctToolStripMenuItem.Enabled = true;
this.timeTakenToolStripMenuItem.Enabled = true;
this.sizeToolStripMenuItem1.Enabled = true;
this.botsToolStripMenuItem.Enabled = true;
this.requestAnalysisToolStripMenuItem1.Enabled = true;
this.referrerToolStripMenuItem1.Enabled = true;
this.statusCodesToolStripMenuItem2.Enabled = true;
this.behaviourToolStripMenuItem.Enabled = true;
this.virtualHostToolStripMenuItem1.Enabled = true;
MainForm.smethod_1(this.userAgentToolStripMenuItem, bool_5, 1);
MainForm.smethod_1(this.visitsByCountryToolStripMenuItem1, bool_5, -1);
MainForm.smethod_1(this.reportsToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.visitsToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.hitsPerHourToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.hitsPerMinuteToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.visitsUniqueHitsToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.iPV6ToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.browsersToolStripMenuItem1, bool_5, -1);
MainForm.smethod_1(this.statusCodesToolStripMenuItem1, bool_5, -1);
MainForm.smethod_1(this.bandwidthToolStripMenuItem1, bool_5, -1);
MainForm.smethod_1(this.searchVisitsToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.iPToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.requestsToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.usersToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.hitsEachToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.botsToolStripMenuItem1, bool_5, -1);
MainForm.smethod_1(this.visitsPerHourToolStripMenuItem, bool_5, -1);
this.visitsByCountryToolStripMenuItem1.Enabled = true;
this.userAgentToolStripMenuItem.Enabled = true;
this.visitMonthToolStripMenuItem.Enabled = true;
this.visitsUniqueHitsToolStripMenuItem.Enabled = true;
this.hitsPerHourToolStripMenuItem.Enabled = true;
this.hitsPerMinuteToolStripMenuItem.Enabled = true;
this.visitsByCountryToolStripMenuItem2.Enabled = true;
this.worldToolStripMenuItem.Enabled = true;
this.visitsToolStripMenuItem.Enabled = true;
this.iPV6ToolStripMenuItem.Enabled = true;
this.browsersToolStripMenuItem1.Enabled = true;
this.statusCodesToolStripMenuItem1.Enabled = true;
this.bandwidthToolStripMenuItem1.Enabled = true;
this.searchVisitsToolStripMenuItem.Enabled = true;
this.iPToolStripMenuItem.Enabled = true;
this.requestsToolStripMenuItem.Enabled = true;
this.usersToolStripMenuItem.Enabled = true;
this.hitsEachToolStripMenuItem.Enabled = true;
this.botsToolStripMenuItem1.Enabled = true;
this.visitsPerHourToolStripMenuItem.Enabled = true;
this.statisticsSourceFilteredDataToolStripMenuItem.Enabled = true;
this.reportSourceFilteredDataToolStripMenuItem.Enabled = true;
MainForm.smethod_1(this.graphToolStripMenuItem, bool_5, 4);
this.toolStripBtnAFEnabled2.Enabled = bool_5;
this.toolStripBtnAFEnabled2.ToolTipText = Class96.smethod_39();
if (!bool_5)
{
this.toolStripBtnAFEnabled2.Checked = false;
this.toolStripBtnAFEnabled2.ToolTipText = Class96.smethod_41();
}
this.toolStripTBoxReferer2.Enabled = bool_5;
this.toolStripTBoxRequest2.Enabled = bool_5;
this.toolStripTBoxUserAgent2.Enabled = bool_5;
this.toolStripTBoxUser2.Enabled = bool_5;
this.toolStripTBoxVHost2.Enabled = bool_5;
this.tsddReferer.Enabled = bool_5;
this.tsddUser.Enabled = bool_5;
this.tsddVHost.Enabled = bool_5;
this.tsddRequest.Enabled = bool_5;
this.tsddUserAgent.Enabled = bool_5;
this.tsddDate.Enabled = bool_5;
this.enableAllReportsToolStripMenuItem.Visible = !bool_5;
this.enableAllReportsToolStripMenuItem.Enabled = true;
this.enableAllStatisticsToolStripMenuItem.Visible = !bool_5;
this.enableAllStatisticsToolStripMenuItem.Enabled = true;
this.enableGraphToolStripMenuItem.Visible = !bool_5;
this.enableGraphToolStripMenuItem.Enabled = true;
}
Não te lembra nada. Você pode me dizer o que exatamente está acontecendo aqui? E tudo é simples - o parâmetro bool_5 está aqui e desempenha todo o papel, em termos simples. Ou seja (a figura abaixo mostra as dependências True e False - se a condição não for atendida).
o que fazer a seguir? Sim, tudo é muito simples. A opção mais fácil e inofensiva é simplesmente fazer com que o programa responda True para qualquer resultado. Se não é mais profissional falar (no nível de QI = 0), sim - tudo é ativado mesmo que não haja chave e tudo esteja no tambor. :frio:.
Ou seja,
um pedaço de código
if (!this.bool_0)
{
this.lbStatusStripNotify.Text = Class96.smethod_271() + " http Logs Viewer..." + Class96.smethod_68();
this.method_2(false);
MainForm.bool_2 = false;
}
else
{
this.lbStatusStripNotify.Text = Class96.smethod_271() + " http Logs Viewer";
this.method_2(true);
}
Altere para Verdadeiro. Só assim. E isso significa que não importa como a condição funcione, já do lado, o programa é ativado de qualquer maneira . Isso eu mostrei uma maneira de quebrar, para ser franco:
if (!this.bool_0)
{
this.lbStatusStripNotify.Text = Class96.smethod_271() + " http Logs Viewer";
this.method_2(true);
}
else
{
this.lbStatusStripNotify.Text = Class96.smethod_271() + " http Logs Viewer";
this.method_2(true);
}
Acha que não vai dar certo? E eu digo que 1000% funcionará como um relógio. Vamos verificar, salvar o resultado e executar o programa. E vemos que as inscrições com um pedido para ativar, desbloquear o programa - desapareceram , em algum lugar, não entendo onde :frio:e as funções inativas ficaram ativas. Milagres e muito mais .
Interessante, no final.
Bem, se você seguir o método de um machado e um martelo, poderá seguir - um caminho banal. Voltando à função
private void method_2(bool bool_5)
{
if (bool_5)
{
this.toolStripStatusDonate.Text = "iannet";
this.toolStripStatusLabel1.Visible = false;
}
else
{
this.toolStripStatusDonate.Text = Class96.smethod_264();
this.toolStripStatusLabel1.Visible = true;
}
MainForm.smethod_1(this.statisticsToolStripMenuItem, bool_5, 5);
MainForm.smethod_1(this.topToolStripMenuItem, bool_5, 1);
MainForm.smethod_1(this.distinctToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.timeTakenToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.sizeToolStripMenuItem1, bool_5, -1);
MainForm.smethod_1(this.botsToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.requestAnalysisToolStripMenuItem1, bool_5, -1);
MainForm.smethod_1(this.referrerToolStripMenuItem1, bool_5, -1);
MainForm.smethod_1(this.statusCodesToolStripMenuItem2, bool_5, -1);
MainForm.smethod_1(this.behaviourToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.virtualHostToolStripMenuItem1, bool_5, -1);
this.topToolStripMenuItem.Enabled = true;
this.distinctToolStripMenuItem.Enabled = true;
this.timeTakenToolStripMenuItem.Enabled = true;
this.sizeToolStripMenuItem1.Enabled = true;
this.botsToolStripMenuItem.Enabled = true;
this.requestAnalysisToolStripMenuItem1.Enabled = true;
this.referrerToolStripMenuItem1.Enabled = true;
this.statusCodesToolStripMenuItem2.Enabled = true;
this.behaviourToolStripMenuItem.Enabled = true;
this.virtualHostToolStripMenuItem1.Enabled = true;
MainForm.smethod_1(this.userAgentToolStripMenuItem, bool_5, 1);
MainForm.smethod_1(this.visitsByCountryToolStripMenuItem1, bool_5, -1);
MainForm.smethod_1(this.reportsToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.visitsToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.hitsPerHourToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.hitsPerMinuteToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.visitsUniqueHitsToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.iPV6ToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.browsersToolStripMenuItem1, bool_5, -1);
MainForm.smethod_1(this.statusCodesToolStripMenuItem1, bool_5, -1);
MainForm.smethod_1(this.bandwidthToolStripMenuItem1, bool_5, -1);
MainForm.smethod_1(this.searchVisitsToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.iPToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.requestsToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.usersToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.hitsEachToolStripMenuItem, bool_5, -1);
MainForm.smethod_1(this.botsToolStripMenuItem1, bool_5, -1);
MainForm.smethod_1(this.visitsPerHourToolStripMenuItem, bool_5, -1);
this.visitsByCountryToolStripMenuItem1.Enabled = true;
this.userAgentToolStripMenuItem.Enabled = true;
this.visitMonthToolStripMenuItem.Enabled = true;
this.visitsUniqueHitsToolStripMenuItem.Enabled = true;
this.hitsPerHourToolStripMenuItem.Enabled = true;
this.hitsPerMinuteToolStripMenuItem.Enabled = true;
this.visitsByCountryToolStripMenuItem2.Enabled = true;
this.worldToolStripMenuItem.Enabled = true;
this.visitsToolStripMenuItem.Enabled = true;
this.iPV6ToolStripMenuItem.Enabled = true;
this.browsersToolStripMenuItem1.Enabled = true;
this.statusCodesToolStripMenuItem1.Enabled = true;
this.bandwidthToolStripMenuItem1.Enabled = true;
this.searchVisitsToolStripMenuItem.Enabled = true;
this.iPToolStripMenuItem.Enabled = true;
this.requestsToolStripMenuItem.Enabled = true;
this.usersToolStripMenuItem.Enabled = true;
this.hitsEachToolStripMenuItem.Enabled = true;
this.botsToolStripMenuItem1.Enabled = true;
this.visitsPerHourToolStripMenuItem.Enabled = true;
this.statisticsSourceFilteredDataToolStripMenuItem.Enabled = true;
this.reportSourceFilteredDataToolStripMenuItem.Enabled = true;
MainForm.smethod_1(this.graphToolStripMenuItem, bool_5, 4);
this.toolStripBtnAFEnabled2.Enabled = bool_5;
this.toolStripBtnAFEnabled2.ToolTipText = Class96.smethod_39();
if (!bool_5)
{
this.toolStripBtnAFEnabled2.Checked = false;
this.toolStripBtnAFEnabled2.ToolTipText = Class96.smethod_41();
}
this.toolStripTBoxReferer2.Enabled = bool_5;
this.toolStripTBoxRequest2.Enabled = bool_5;
this.toolStripTBoxUserAgent2.Enabled = bool_5;
this.toolStripTBoxUser2.Enabled = bool_5;
this.toolStripTBoxVHost2.Enabled = bool_5;
this.tsddReferer.Enabled = bool_5;
this.tsddUser.Enabled = bool_5;
this.tsddVHost.Enabled = bool_5;
this.tsddRequest.Enabled = bool_5;
this.tsddUserAgent.Enabled = bool_5;
this.tsddDate.Enabled = bool_5;
this.enableAllReportsToolStripMenuItem.Visible = !bool_5;
this.enableAllReportsToolStripMenuItem.Enabled = true;
this.enableAllStatisticsToolStripMenuItem.Visible = !bool_5;
this.enableAllStatisticsToolStripMenuItem.Enabled = true;
this.enableGraphToolStripMenuItem.Visible = !bool_5;
this.enableGraphToolStripMenuItem.Enabled = true;
}
E edite apenas no LOB assim. Voltando ao void privado method_2(bool bool_5) que discutimos acima e removendo MainForm.smethod_1 do código, tornando tudo True (desbloqueando assim todas as funções) e removendo a condição if . Isso também trará sucesso, apenas mais trabalho. Para quem é mais conveniente e compreensível.
De acordo com a reversão deste software, isso é tudo. A única coisa que gostaria de acrescentar é que você pode na janela Sobre (Adicionar sua autoria). E agora eu vou te mostrar como fazer isso. Vai ficar muito bom. Uma vez que esta janela tem uma inscrição para o exemplo de exibição de logs http.
Pesquisamos nos recursos do programa e vemos que o campo de texto pertence à janela Sobre.
E para beleza, vamos substituir e salvar por: CRACKED by -EXE XSS.IS
Como resultado , conseguimos o que pretendíamos :frio: . Acho que fica mais bonito e convincente.
Quantas defesas e tantos métodos para derrotá-los , o principal é analisar tudo com cuidado e diligência e a sorte estará do seu lado, isso é tudo para mim! E aproveitando: Desejo a todos um ótimo ano novo, bom humor e sucesso no novo ano . :sorriso10:
O que há no arquivo, captura de tela: