Взломать приложение C # с OllyDebug

Я хотел бы знать, есть ли способ взломать приложение C # Windows с OllyDebug. У меня есть простое мое собственное приложение CrackMe, написанное на Visual C # 2010 Express. Когда я открываю его с помощью OllyDebug и изменяю код ASM по мере необходимости, в OllyDebug отсутствует опция «Копировать в исполняемый файл», поскольку мое окно регистрационной формы динамически выделяется оператором «new» (то есть, я полагаю, вызовом функции VirtualAlloc () в отладчике). Хотя я могу изменить код ASM (который просто выполняет NOP JE), я не могу сохранить файл .exe с взломанным кодом, похоже, что OllyDbg «видит» код в сегменте данных, который не существует, когда приложение запускается и только динамически распределяется. Может кто-нибудь помочь мне с проблемой? Я думаю, что изменение * .exe должно быть возможно по крайней мере с двумя подходами:

1) Погрузитесь глубже в код с помощью OllyDbg и найдите место, где хранится актуальный код перед выделением (потому что новый экземпляр RegistrationForm волшебным образом не выходит из пространства, не так ли?)

2) Если это позволяет быстро создавать приложения в VS Express и не требует слишком сложного кода, используйте статические вызовы, чтобы при каждом нажатии «Регистрация» отображалось одно и то же окно RegistrationForm (которое будет сохраняться в разделе кода приложения и, следовательно, будет изменяемым в OllyDbg).

Будет нормально указать, как переписать код и упростить выделение того же экземпляра RegistrationForm (singleton?). Единственное, что мне нужно, это взломать и сохранить * .exe, перезапустить и заполнить любые данные для «полной регистрации».

Вот код класса MyCrackMe с методом 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);
        }
    }
}

Класс главного окна:

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();
        }
    }
}

Форма регистрации класса:

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);
            }
        }
    }
}

Вот скриншот OllyDbg и сообщение, которое появляется при установке точек останова

Ответы на вопрос(2)

Ваш ответ на вопрос