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

questionAnswers(2)

yourAnswerToTheQuestion