Cracking aplicativo C # com OllyDebug
Gostaria de saber se existe uma maneira de quebrar o aplicativo C # Windows com o OllyDebug. Eu tenho meu próprio aplicativo CrackMe simples, escrito com o Visual C # 2010 Express. Quando o abro com o OllyDebug e modifico o código ASM conforme necessário, não há opção "Copiar para executável" no OllyDebug, pois minha janela do formulário de registro é alocada dinamicamente com o operador "novo" (que, acredito, chamada de função VirtualAlloc () no depurador). Embora eu seja capaz de modificar o código ASM (que é simplesmente NOP'ing JE jumps), não consigo salvar meu arquivo .exe com código quebrado, parece que o OllyDbg "vê" o código no segmento de dados que não existe quando o arquivo o aplicativo é iniciado e somente é alocado dinamicamente. Alguém pode me ajudar com o problema? Eu acho que modificar * .exe deve ser possível com pelo menos 2 abordagens:
1) Aproxime-se mais do código com o OllyDbg e encontre um local onde o código real é mantido antes da alocação (porque a nova instância do RegistrationForm não sai magicamente do espaço, não é?)
2) Se ele permite a criação rápida de aplicativos no VS Express e não requer código muito complicado, use chamadas estáticas para que cada vez que clicar em "Registrar" mostre a mesma janela RegistrationForm (que será mantida na seção de código do aplicativo e, portanto, será modificável no OllyDbg).
Não há problema em apontar como reescrever o código e simplificar a alocação da mesma instância do RegistrationForm (singleton?). A única coisa que preciso é quebrar e salvar * .exe, reiniciar e preencher todos os dados para "concluir o registro".
Aqui está o código da classe MyCrackMe com o método Main ():
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyCrackMe {
class MyCrackMe {
public static void Main() {
MyForm mainWindow = new MyForm();
System.Windows.Forms.Application.Run(mainWindow);
}
}
}
Classe da janela principal:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace MyCrackMe {
public partial class MyForm : Form {
public MyForm() {
InitializeComponent();
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e) {
Application.Exit();
}
private void aboutToolStripMenuItem_Click(object sender, EventArgs e) {
MessageBox.Show("All rights reserved", "Message");
}
private void registerToolStripMenuItem_Click(object sender, EventArgs e) {
RegistrationForm registrationForm = new RegistrationForm();
registrationForm.Show();
}
}
}
Classe do formulário de inscrição:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace MyCrackMe {
public partial class RegistrationForm : Form {
// Use DllImport to import the Win32 MessageBox function.
[DllImport("user32.dll", EntryPoint = "MessageBoxA", CharSet = CharSet.Ansi)]
public static extern int MsgBox(int hWnd, String text, String caption, uint type);
public RegistrationForm() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
if (textBox1.Text == "lincoln" && textBox2.Text == "12345") {
MsgBox(0, "Registration completed successfully!", "Registration Message", 0);
} else {
MsgBox(0, "Registration failed", "Message", 0);
}
}
}
}
Aqui está a captura de tela e a mensagem do OllyDbg que vem ao definir pontos de interrupção