使用 OllyDbg 破解 C# 应用程序

2024-03-01

我想知道是否有办法用 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,重新启动并填写任何数据以“完成注册”。

以下是带有 Main() 方法的 MyCrackMe 类的代码:

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

Here is OllyDbg screenshot and message which comes when setting breakpoints ollydbgscreenshot


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

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

  • dbgclr
  • ildasm
  • cordbg
  • CFF 浏览器 http://www.ntcore.com

Also PEBrowse http://www.smidgeonsoft.prohosting.com/pebrowse-pro-file-viewer.html can debug the JIT generated native machine code too! PEBrowse

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

  • Shukhrat Nekbaev 的 .NET 应用程序逆向代码工程 http://epublications.uef.fi/pub/urn_nbn_fi_uef-20131001/urn_nbn_fi_uef-20131001.pdf

  • OWASP .NET 调试 https://www.owasp.org/images/7/77/OWASP_IL_7_DOT_NET_Reverse_Engineering.pdf

  • dotNET http://www.scribd.com/doc/36459834/Dot-Net

  • 在 MSDN 上即时重写 MSIL http://msdn.microsoft.com/en-us/magazine/cc188743.aspx

  • .NET 内部结构和本机编译 http://www.ntcore.com/files/netint_native.htm

Stackexchange 网络有一个专门用于逆向工程 https://reverseengineering.stackexchange.com/,请加入我们:) 可能会有answer https://reverseengineering.stackexchange.com/questions/2254/patching-a-net-4-0-binary-in-olly-or-cff-explorer已经回答你的问题了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 OllyDbg 破解 C# 应用程序 的相关文章

  • WritePrivateProfileString 未在末尾添加属性

    我正在使用以下命令在 ini 文件中写入一些属性WritePrivateProfileString函数并且一切正常 但是当我添加多行文本时 出现了问题 这是代码和输出 WritePrivateProfileString T General
  • C# 中的密码恢复工具不起作用

    嗨 我对此还很陌生 我创建了一个门户 用户可以登录并在其中查看我制作的其他程序 问题是密码恢复似乎不起作用 我没有收到任何错误消息 我只是收到消息 我们无法访问您的信息 请重试 我已经正确设置了 ASP NET 配置 并使用不同的用户和权限
  • 何时在定义上下文或实例化点中发生非依赖名称的重载解析?

    3 4 基本 lookup p1 重载解析 13 3 在名称查找成功后发生 void g long void g int int template
  • 此上下文中仅支持实体类型、枚举类型或基本类型

    我目前正在开发一个搜索页面 我只需要返回主题的主题详细信息列表 其中包含存储在 int ST 中的所有主题标签 id 目前 ST null true ST Contains b ThemeTagID 行似乎给了我一个错误 附加信息 无法创建
  • 验证码怎么写?

    我正在开发一个注册表 我想放置验证码 我生成一个随机字符串 但如何将其转换为图像 否则我如何开发验证码或任何参考 谢谢 Try out 验证码 http recaptcha net plugins aspnet 或查看博客文章 使用 Asp
  • Collection.Contains() 使用什么来检查现有对象?

    我有一个强类型的自定义对象列表 MyObject 它有一个属性Id 以及一些其他属性 假设Id of a MyObject将其定义为唯一 我想检查我的收藏是否还没有MyObject对象有一个Id在我添加新的之前 共 1 个MyObject到
  • 如何获得字符串的所有字谜

    我试图找到一个字符串的所有可能的字谜并仅使用递归将它们存储在数组中 我被困住了 这就是我所拥有的一切 int main const int MAX 10 string a ABCD string arr 10 permute arr a 0
  • 如何将整个流读入 std::string ?

    我正在尝试将整个流 多行 读入字符串中 我正在使用这段代码 它有效 但它冒犯了我的风格感 当然有更简单的方法吗 也许使用字符串流 void Obj loadFromStream std istream stream std string s
  • 如何从子窗口中加载的用户控件按钮关闭子窗口?

    这是我的 ChildWindow xaml 代码 1
  • 如何检测机器是否加入域?

    如何检测计算机是否已加入 Active Directory 域 相对于工作组模式 如果没有必要的话 不要用 pinvoke 来愚弄 参考System DirectoryServices 然后调用 System DirectoryServic
  • GCC 和 -Wconversion

    让我们编译以下程序 int main uint16 t data 0 data uint16 t std round 3 14f return 0 with g Wconversion prog cpp 我们会得到warning conve
  • 最好的 C++ 编译器是哪个? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 Datagridview 中为图像列提供超链接

    如何在winforms中超链接到DataGridViewImageColumn OP 评论中的代码示例 DataGridView dgv new DataGridView dgv Name dgv i dgv DataSource dsMa
  • 如何存储将被多个不同类访问的字符串常量? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 关于堆栈溢出有太多不同的答案 声明一个命名空间 并在 hpp 文件中将所有字符串标记为 extern const 并在 cpp 文件中放置它们的
  • 在 C 或 C++ 中使用逗号作为宏名称

    我想做这样的事情 define define MAX 10 000 000 undef 有什么技巧可以做到吗 编辑 我知道 C 14 中的数字分隔符 我正在寻找一种技巧来对不兼容的编译器执行相同的操作 EDIT2 请考虑Variadic M
  • 使用 CryptUnprotectData 解密 WEP wlan 配置文件密钥

    我正在尝试使用解密 WEP 配置文件的密钥加密解除数据保护 http msdn microsoft com en us library windows desktop aa380882 28v vs 85 29 aspx 我获取配置文件密钥
  • 在C中更改函数内的数组

    我正在学习 C 并且很困惑为什么在 main 中创建的数组不会在函数内部更改 我假设传递的数组是一个指针 并且更改指针应该更改数组 对吧 有人可以解释这种情况下发生了什么吗 谢谢你的帮助 int main int i length 10 i
  • 在 asp.net MVC 控制器中调用异步外部 Web 服务

    在 Asp net MVC 控制器 GET 方法 中 我调用外部 Web 服务 用于 IP 地理定位 返回 IP 位置的 json 数据 如何使调用异步 以便堆栈可以在等待服务响应时继续 当 GEO IP 请求完成后 我希望能够更新数据库
  • 计算 .NET Core 项目的代码指标?

    我正在研究 ASP NET Core 和 NET Core 项目 对于经典的 C 项目 Visual Studio 2015 具有计算代码指标的功能 对于 NET Core 预览版 2 工具中缺少支持 在工具更加完整之前 有人知道解决方法吗
  • 提高批量请求的野兽内存使用率

    我运行这个boost beast 客户端 异步 ssl http www boost org doc libs develop libs beast example http client async ssl http client asy

随机推荐