Взлом приложения C # с OllyDebug

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

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

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

Будет нормально указать, как переписать код и упростить выделение одного и того же экземпляра RegistrationForm (синглтона?). Единственное, что мне нужно, это взломать и сохранить * .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 и сообщение, которое появляется при установке точек останова ollydbgscreenshot


person t3rmin41    schedule 24.06.2014    source источник
comment
Научи меня, что такое исполняемый файл .Net, чтобы я мог взломать некоторые лицензии, кажется слишком широким для SO (даже без учета этических соображений).   -  person Alexei Levenkov    schedule 24.06.2014
comment
Я считаю, что лучший способ научиться лечить взлом - это уметь взламывать. Это только мой собственный проект в образовательных целях. Я даже использую импорт user32.dll и вызываю MsgBox API для явного вызова в OllyDbg, что упрощает взлом. Как вы думаете, кто-нибудь сделает это вместо MessageBox.Show (Привет, мир)? Я не думаю, что приложения, написанные профессиональными разработчиками, взламываются так легко, как мои. Если тема слишком велика для StackOverflow, мы также будем признательны за ссылки на какой-либо учебник или инструкции.   -  person t3rmin41    schedule 24.06.2014


Ответы (2)


Обновление: dnSpy, вероятно, наиболее подходит для этой цели.

.NET использует байт-коды IL, которые компилируются в собственные инструкции при запуске приложения, поэтому оно запускается в виртуальной машине .NET, подобно java. Теперь с помощью olly вы можете отлаживать сам фреймворк, а не собственный код, сгенерированный JIT. (чего вы хотите, если я вас правильно понимаю). Насколько мне известно, сохранение пропатченного .NET-приложения полностью недоступно. Однако есть и другие решения для управления / наблюдения за кодом MSIL.

Также PEBrowse также может отлаживать машинный код, сгенерированный JIT! PEBrowse

Вас также могут заинтересовать эти документы:

В сети Stackexchange есть сайт, посвященный обратному проектированию, пожалуйста, присоединяйтесь к нам там :) Там может быть answer уже на ваш вопрос там.

person Dominik Antal    schedule 24.06.2014
comment
Да, я знаю, что приложения .NET переведены на IL (именно поэтому VB, C #, C ++, F # или любой другой язык, который Microsoft может изобрести, написанный на .NET), все переведены на IL. Я могу разобрать и взломать свое приложение с помощью IlSpy (что слишком просто, оно переведено почти в исходный код). Хотя запретить дизассемблирование с помощью IlSpy (или ildasm) тоже несложная задача. - person t3rmin41; 24.06.2014
comment
@ t3rmin41 Небольшое примечание C ++ не переводится на IL. В C ++ / CLI есть части, которые есть, но только в C ++ их нет. - person Scott Chamberlain; 25.06.2014
comment
Хорошо, еще один вопрос - в какой момент приложение .NET (скажем, написанное на C #) транслируется в собственный код (под собственным я подразумеваю здесь код ASM, который наблюдается в OllyDbg)? Есть ли в приложении .NET собственный код, который можно разобрать и изменить с помощью отладчика низкого уровня (не с помощью IlSpy, ildasm и других отладчиков высокого уровня)? Я пытаюсь сделать невозможное - изменить низкоуровневый код приложения, который переводится на низкоуровневый (Windows DLL) только при загрузке приложения в память, а не в самом .exe? - person t3rmin41; 25.06.2014
comment
@ t3rmin41 Он транслируется в машинный код во время выполнения (JIT) EE (механизмом выполнения). В скомпилированном двоичном коде нет собственного кода. Теперь, когда находится этот сгенерированный собственный код, я не знаю, я предполагаю, что он появится где-то в памяти, а затем исчезнет, ​​когда он выйдет за пределы области видимости. - person Dominik Antal; 26.06.2014
comment
@Dominik, судя по тому, что я пробовал и гуглил, похоже, ваше утверждение В скомпилированном двоичном коде нет собственного кода. Спасибо за всю предоставленную информацию, мне нужно время, чтобы просмотреть статьи и попробовать PEBrowser. - person t3rmin41; 27.06.2014

Насколько я помню, в этом программном обеспечении есть опция патча. вам необходимо активировать функцию патча. Надеюсь, теперь это сработает. Я работаю над тем же

person Rupali Raut    schedule 07.02.2017