【问题标题】:Cracking C# application with OllyDebug使用 OllyDbg 破解 C# 应用程序
【发布时间】:2014-08-14 23:47:43
【问题描述】:

我想知道有没有办法用 OllyDebug 破解 C# Windows 应用程序。我有一个用 Visual C# 2010 Express 编写的简单 CrackMe 应用程序。当我用 OllyDebug 打开它并根据需要修改 ASM 代码时,OllyDebug 中没有“复制到可执行文件”选项,因为我的注册表单窗口是使用“new”运算符动态分配的(我相信,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 屏幕截图和消息

【问题讨论】:

  • “教我什么是 .Net 可执行文件,以便我可以破解一些许可”对于 SO 来说似乎有点过于宽泛(即使忽略道德问题)。
  • 我相信学习反破解最好的方法就是知道如何破解。这只是我自己用于教育目的的项目。我什至在 OllyDbg 中使用“user32.dll”导入并调用 MsgBox API 进行显式调用,这样更容易破解,你认为有人会这样做而不是 MessageBox.Show("Hello world") 吗?我认为专业开发人员编写的应用程序不会像我的那样容易被破解。如果主题对于 StackOverflow 来说太大,请参考一些教程或操作方法。

标签: c# assembly ollydbg cracking


【解决方案1】:

更新:dnSpy 可能最适合此目的。

.NET 使用 IL 字节码,当您运行应用程序时会编译为本机指令,因此它在 .NET VM 中运行,类似于 java。您现在对 olly 所做的可能是调试它自己的框架,而不是您的 JIT 生成的本机代码。 (如果我理解正确,你想要)。据我所知,olly 无法保存已修补的 .NET 应用程序。但是,还有其他解决方案可以操作/观察 MSIL 代码。

PEBrowse 也可以调试 JIT 生成的本地机器码!

您可能也对这些论文感兴趣:

Stackexchange 网络有一个专门用于 reverse engineering 的站点,请加入我们:) 那里可能已经有一个 answer 供您提问。

【讨论】:

  • 是的,我知道 .NET 应用程序被翻译成 IL(这就是为什么 VB、C#、C++、F# 或任何其他微软可能发明的用 .NET 编写的语言)都被翻译成 IL。我可以使用 IlSpy 来反汇编和破解我的应用程序(这太容易了,几乎可以翻译成源代码)。不过,禁止使用 IlSpy(或 ildasm)进行反汇编也很容易。
  • @t3rmin41 小提示 C++ 没有被翻译成 IL。 C++/CLI 有一些功能,但只有 C++ 没有。
  • 好的,另一个问题 - .NET 应用程序(比方说,用 C# 编写)在什么时候被转换为本机代码(这里的“本机”是指在 OllyDbg 中观察到的 ASM 代码)? .NET 应用程序中是否有任何本机代码可以被低级调试器(而不是 IlSpy、ildasm 和其他“高级”调试器)反汇编和修改?我是否正在尝试不可能的事情 - 修改应用程序低级代码,该代码仅在应用程序加载到内存而不是 .exe 本身时被转换为低级(由 Windows DLL)?
  • @t3rmin41 它由 EE(执行引擎)在运行时 (JIT) 转换为本机代码。编译后的二进制文件中没有本机代码。既然找到了生成的本机代码,我不知道,我猜它会出现在内存中的某个地方,然后在超出范围时消失。
  • @Dominik,根据我的尝试和谷歌搜索,您的陈述“编译的二进制文件中没有本机代码”似乎是正确的。感谢您提供的所有信息,我需要一些时间来浏览文章并尝试使用 PEBrowser。
【解决方案2】:

我记得这个软件中有补丁选项。 您需要激活补丁功能。 我希望这现在可以工作。 我正在做同样的事情

【讨论】:

    猜你喜欢
    • 2014-06-30
    • 2014-07-31
    • 2023-03-11
    • 2012-02-22
    • 2019-01-25
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    相关资源
    最近更新 更多