Вытаскиваем исходник C# из exe-файла


Рабочие компьютеры у меня меняются не так уж редко. И далеко не всегда переносится вся информация. Что-то кажется ненужным сейчас, но может понадобится в дальнейшем или просто интересно вспомнить. Так и произошло с программой «Запомни домино». На днях я просматривал исходники и не обнаружил её – и на самом деле, писал пару лет назад, все потерялось. Что ж, так как я никак не шифровал exe и знаю, на чем написано (C# Net 4.0) и нет нативного кода, то попробуем вытащить исходник.

Для этого мы воспользуемся программой .NET Reflector 8. По сути это очень хороший декомпилятор. Открываем с помощью её наш экзешник и видим кучу непонятного. Не стоит пугаться, все на самом деле очень просто. В самом низу левой панели наш открывшийся файл: пару кликов по дереву и оппа – мы открываем нашу Form1!



Правда, здесь пока только перечисление полей, но это уже что-то. Так как программа простенькая, то нам надо только найти обработчики кнопок. Кнопки всего две, немного поискав находи обработчик для первой:

private void button2_Click(object sender, EventArgs e)
{
    int num;
    int num2;
    this.timer1.Interval = ((int) this.numericUpDown3.Value) * 0x3e8;
    this.labelEnd.Visible = false;
    this.numericUpDown2.Visible = false;
    this.numericUpDown3.Visible = false;
    this.labelChisloDomino.Visible = false;
    this.label1.Visible = false;
    this.label2.Visible = false;
    this.label3.Visible = false;
    this.label4.Visible = false;
    this.label5.Visible = false;
    Random random = new Random();
    do
    {
        num = random.Next(0, 7);
        num2 = random.Next(0, 7);
    }
    while (num2 < num);
    Image image = Image.FromFile(string.Concat(new object[] { Path.GetDirectoryName(Application.ExecutablePath), @"\img\", num, "-", num2, ".png" }));
    this.sum = num + num2;
    this.label1.Image = image;
    this.chisloDomino = (int) this.numericUpDown2.Value;
    if (this.chisloDomino > 1)
    {
        do
        {
            num = random.Next(0, 7);
            num2 = random.Next(0, 7);
        }
        while (num2 < num);
        image = Image.FromFile(string.Concat(new object[] { Path.GetDirectoryName(Application.ExecutablePath), @"\img\", num, "-", num2, ".png" }));
        this.sum = (this.sum + num) + num2;
        this.label2.Image = image;
        this.label2.Visible = true;
    }
    if (this.chisloDomino > 2)
    {
        do
        {
            num = random.Next(0, 7);
            num2 = random.Next(0, 7);
        }
        while (num2 < num);
        image = Image.FromFile(string.Concat(new object[] { Path.GetDirectoryName(Application.ExecutablePath), @"\img\", num, "-", num2, ".png" }));
        this.sum = (this.sum + num) + num2;
        this.label3.Image = image;
        this.label3.Visible = true;
    }
    if (this.chisloDomino > 3)
    {
        do
        {
            num = random.Next(0, 7);
            num2 = random.Next(0, 7);
        }
        while (num2 < num);
        image = Image.FromFile(string.Concat(new object[] { Path.GetDirectoryName(Application.ExecutablePath), @"\img\", num, "-", num2, ".png" }));
        this.sum = (this.sum + num) + num2;
        this.label4.Image = image;
        this.label4.Visible = true;
    }
    this.label1.Visible = true;
    this.button2.Visible = false;
    this.timer1.Start();
}
Сложного здесь ничего нет. Берем число секунд, все делаем невидимым, затем рандомно вытаскиваем на свет божий необходимое число костяшек. Один интересный момент: почему-то я сделал не циклом и для каждой костяшки идет отдельный выбор, хотя все можно сократить. Видимо, я рассчитывал именно на три, как сейчас вспоминается и когда делал для четырех – просто добавил, не переделывая код.

И еще: в каждом выборе костяшки есть дополнительный цикл do while – чтобы первое число (верхней половины костяшки) было меньше нижней. Почему так? Смотрим в папку с изображениями: нумерация изображений сделана именно таким образом: от меньшего к большему – видимо, чтобы избежать повторения. Кстати, в программе не реализован поиск повторяющихся – но, видимо, мне этого и не надо было.



Ну и в конце запускаем таймер на нужное число секунд. Код таймер прост:

private void timer_Tick(object sender, EventArgs e)
{
    this.count++;
    this.label1.Visible = false;
    this.label2.Visible = false;
    this.label3.Visible = false;
    this.label4.Visible = false;
    this.button1.Visible = true;
    this.numericUpDown1.Visible = true;
    this.timer1.Stop();
}
После этого обработчик другой кнопки

private void button1_Click(object sender, EventArgs e)
{
    this.label1.Visible = true;
    if (this.chisloDomino > 1)
    {
        this.label2.Visible = true;
    }
    if (this.chisloDomino > 2)
    {
        this.label3.Visible = true;
    }
    if (this.chisloDomino > 3)
    {
        this.label4.Visible = true;
    }
    this.button1.Visible = false;
    this.numericUpDown1.Visible = false;
    this.labelEnd.Visible = true;
    this.numericUpDown2.Visible = true;
    this.labelChisloDomino.Visible = true;
    this.numericUpDown3.Visible = true;
    this.label5.Visible = true;
    int num = (int) this.numericUpDown1.Value;
    if (this.sum == num)
    {
        this.labelEnd.Text = string.Concat(new object[] { "Сумма: ", this.sum, " Ваш вариант: ", num, " Верно!" });
    }
    else
    {
        this.labelEnd.Text = string.Concat(new object[] { "Сумма: ", this.sum, " Ваш вариант: ", num, " Неправильно." });
    }
    this.button2.Text = "Еще раз?";
    this.button2.Visible = true;
}
Здесь тоже все просто. Сначала показываем, что нужно показать и скрываем, что ненужно. Затем сравниваем введённый пользователем результат и правильный и выводим ответ. Кстати, упражнение интересное, в реальности так рекомендуется тренировать внимание.

Ну и вот так просто мы достали исходный код из программы на C# с помощью .NET Reflector 8. Таким образом, если вам требуется помочь посмотреть исходники exe файла, то вы всегда можете написать мне. За небольшую плату я вам с удовольствием помогу.

Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, .NET Reflector, декомпиляция




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Особенности Java
Урок 4. Конструкторы и финализаторы C#
Проза современных авторов: сказки и рассказы