吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 15668|回复: 59
收起左侧

[.NET逆向] .NET破解之分享给新注册的朋友

  [复制链接]
我也是个傻瓜 发表于 2015-11-15 20:59
本帖最后由 我也是个傻瓜 于 2015-11-15 21:11 编辑

2015-11-15_211313.png
前些日子,在论坛里看了有人发过这个软件,也有大神分析过网络版,如果是重帖,请删除吧;正好11.11注册了很多新会员,给他们一个见面礼吧,抛砖引玉,我才来论坛的时候,也是看着前人教程慢慢学习的;好久没冒泡了,因为工作很忙,我还差61分就晋级"出类拔萃"用户组了,请朋友们多多支持。
本文目的
(1).dnSpy的基本使用;
(2).介绍.NET程序破解的基本流程。
工具介绍
de4dot:脱壳,用来将用来保护的壳进行脱去并去混淆。(不清楚没关系,慢慢就会懂了,自己也可以搜索一下这方面的内容)
dnSpy:分析,用来反编译、分析和调试的工具。(个人觉得是新手用来分析.NET最好用工具,类似于VS操作;这一次我果断抛弃了以前使用NET.Reflector)
论坛里也有其他大神分析和发布过这个软件:
下载试用
试用,并观察其中的限制,这是为了找到突破口。试用后会发现:软件标题栏写的试用版(如果破解后可能是写成正式版、VIP等,反正不可能是试用二字),软件状态栏写了剩下时间(如果破解后应该是永久或未来具体的某个时间);在帮助菜单栏中还有"注册认证"按键和窗口。
如果我们输入任意用户名和密码,点击"注册",会弹出"注册信息已保存,请重新启动软件系统进行验证"。(也就意味重启软件会验证注册信息的正确性)
自动脱壳
直接将应用程序拖放到de4dot上,如果正常脱壳,将会生成一个带"-cleaned"的应用程序文件。(这一步,很关键,研究不深,不敢多讲。)
用de4dot脱完壳后,一般都没什么问题,但必须明白de4dot并不是万能的。
寻找关键
代码大家都能看懂,只是茫茫代码,想必从何下手,怎样才能药到病除是大家最关心的。这就需要根据上一步线索来寻。下图为dnSpy的工具条,上面的工具都很重要,后面都会用到。
方案I 从头到尾法
从头到尾是我自己取的名字,怎样称呼都行。其基本根据是任何程序都有个入口点(即程序最开始从哪里执行),跳过非重点,一点一点往下分析。
我们都知道,在程序里都有一个Main函数(C#里通常在Program.cs文件里),被设计为程序的起点。为此,反编译程序一般都有快速定位到此函数功能。将脱壳后的程序加载到dnSpy后,在程序上右键菜单上,点击"go to point"即可到达此函数。
[C#] 纯文本查看 复制代码
        //程序互斥性检查

        if (!AppSingle.IsMutextExist(Application.StartupPath))

        {

            Application.EnableVisualStyles();

            Application.SetCompatibleTextRenderingDefault(false);

            //这里做了什么,先关注一下,不用深入分析,如果后面找不到关键点,再回过头来看。

            Class6.y2cUPMIzDLQDG();

            if (new dlgLogin().ShowDialog() == DialogResult.OK)

            {

                //进入主窗体Main中(这里Main,不是程序的Main函数哈)

                Application.Run(new Main());

                return;

            }

        }
前面我们分析了,程序在启动后会检测注册码是否正确(以确定程序是显示试用版还是正式版),而在启动完成前我们没进行相关的点击等操作,说明程序是在某个自动完成的函数中进行,一般可能有窗体的Load函数,或timer控件的Tick函数等。这里我们不妨来看一下Main的Load函数吧。
代码很容易懂,如果注册成功了,会怎样;如果注册失败了会怎样。其实,程序破解都是这样,即使使用加密狗、网络验证啊,都是这样的模式,只要花时间,找到关键点,并能成功修改,一般都可以搞定。
[Asm] 纯文本查看 复制代码
    if (regServer.IsReg())

    {

        //注册成功相关的操作

    }

    Else

    {

        //产品过期或剩下多少天。

    }
所以,这个程序的关键点应该是在IsReg函数了,如果返回true,则程序已注册,否则为未注册。
方案II 按图索骥法
根据现在的"证据"信息,我们搜索关键信息。我们在搜索框中搜索"您还可试用",在类型中选择"数字或字符串"(还有很多类型可以选择,非常有用哦)
这样,我们同样可以搜索到我们想要的关键信息。
暴破测试
我们修改如下,让它始终返回为真。
[C#] 纯文本查看 复制代码
        public bool IsReg()

        {

            if (!(RegServer.m_strName == "") && !(RegServer.m_strSN == ""))

            {

                string nameBySN = this.GetNameBySN(RegServer.m_strSN);

                //return nameBySN = RegServer.m_strName;

                return true;

            }

            //return false;

            return true;

        }
在IsReg上右键,选择Edit Method Body,进行IL代码修改界面。(IL是.NET与汇编语言之间的中间过渡语言,类似于汇编语言,如果要搞.NET,必须要加以学习其语法),我们将最后返回为flase(ldc.i4.0)改为true(ldc.i4.1);再将IF语句中nameBySN==RegServer.m_strName(将op_Equality改op_INequality).
使用保存功能,将修改后的结果保存,重新打开,已经变成了"已注册":
现在不一定是完全破解了哦,只是暴力破解。
动态调试
程序并不是一次就写好了,可能需要反复的调试。这也一样,可能需要调试来进行分析,来来,我们来看一下怎么动态调试。
第一步,在需要Main函数中插入断点;
第二步,在应用程序上右键,debug(也可以使用菜单栏),弹出对话框,点击"debug",这样就会在断点处停下来,F5继续,和VS里操作一样。
如果弹出如下错误提示,选择dnSpy和dnSpy-x86另外一个即可,这是原程序的目标平台问题。(如果选用dnSpy,出现就这个问题,则选择dnSpy-x86来调试,反之亦然。)
我们可以看到,修改后的IsReg函数返回的值是true了。
深入分析
暴破往往是新手的手法,我们更需要分析它的算法,写一个注册机。下面是分析过程:
[C#] 纯文本查看 复制代码
//在IsReg函数中,最后返回的值是nameBySN和RegServer.m_strName是否相等。

nameBySN== RegServer.m_strName;

//而nameBySN等于GetNameBySN返回值。

nameBySN =this.GetNameBySN(RegServer.m_strSN);

//深入下去,需要分析smethod_1

public string GetNameBySN(string strSN){return SLEncrypt.smethod_1(strSN);}

//深入下去,需要分析smethod_3

public static string smethod_1(string encryptedValue){return SLEncrypt.smethod_3(encryptedValue, SLEncrypt.EncryptKey, SLEncrypt.EncryptVect);}
这里需要找EncryptKey和EncryptVect,需要用到一个比较实用的功能,就是分析,在任意对象上右键"analyze",可以找到这两个值,它是固定的
接着来就是比较关键的smethod_3函数
[C#] 纯文本查看 复制代码
        public  string smethod_1(string encryptedValue)
        {
            return smethod_3(encryptedValue, "2008-10-10", "xysoft2008");
        }

        public static string smethod_3(string encryptedValue, string key, string IV)
        {
            string text = encryptedValue;
            if (text.Length < 16)
            {
                return "";
            }
            for (int i = 0; i < 8; i++)
            {
                text = text.Substring(0, i + 1) + text.Substring(i + 2);
            }
            encryptedValue = text;
            key += "12345678";
            IV += "12345678";
            key = key.Substring(0, 8);
            IV = IV.Substring(0, 8);
            string result;
            try
            {
                ICryptoTransform transform = new DESCryptoServiceProvider
                {
                    Key = Encoding.UTF8.GetBytes(key),
                    IV = Encoding.UTF8.GetBytes(IV)
                }.CreateDecryptor();
                byte[] array = Convert.FromBase64String(encryptedValue);
                MemoryStream memoryStream = new MemoryStream();
                CryptoStream cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Write);
                cryptoStream.Write(array, 0, array.Length);
                cryptoStream.FlushFinalBlock();
                cryptoStream.Close();
                result = Encoding.UTF8.GetString(memoryStream.ToArray());
            }
            catch (Exception)
            {
                result = "";
            }
            return result;
        }
所以,只要输入一个SN(注册码),即可生成一个用户名,然后用来注册即可。但实际过程中,这个SN是有要求的,并不是任意一个字符串都可以,我们想不出来;而这里还有一个函数叫GetSN,它是通过输入一个用户名,得到一个注册,类似于GetNameBySN
[C#] 纯文本查看 复制代码
public string GetSN(string strName)

{

    return smethod_0(strName);

}
在VS里写这个函数,然后输入任意用户名,最后得到了注册码(这个格式要求的,想不到吧),然后拿去注册验证就没有问题了。
至此,我们分析完毕。
功能测试
接下来,我们需要测试一下这些功能,看是还有什么问题,在此略过。

点评

挺不错的。  发表于 2015-11-15 21:31

免费评分

参与人数 20威望 +1 吾爱币 +3 热心值 +20 收起 理由
forever_果酱 + 1 + 1 给大家个提示 代码里面有key和IV就是DES算法,因为DES加密的秘钥 只能是8.
flexlm_crk + 1 + 1 热心回复!
nikita. + 1 谢谢@Thanks!
starh + 1 + 1 谢谢@Thanks!
allcam + 1 谢谢@Thanks!
watking + 1 我很赞同!
龙城神 + 1 谢谢@Thanks!
sweetyrice + 1 鼓励转贴优秀软件安全工具和文档!
leiwuyuan + 1 终于知道在哪加热心值了。。。给你加一个。.
雨声潺潺 + 1 虽然看不懂,我还是要送分,因为新注册的
Sound + 1 + 1 已经处理,感谢您对吾爱破解论坛的支持!
馨羽 + 1 我很赞同!
15149755425 + 1 我很赞同!
先飞菜鸟 + 1 谢谢@Thanks!
tzxinqing + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩.
ydydq + 1 谢谢@Thanks!
hupengpeng + 1 我很赞同!
逍遥枷锁 + 1 谢谢@Thanks!
大青豆 + 1 我很赞同!
不懂767 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩.

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 我也是个傻瓜 发表于 2016-5-27 16:08
chyq20 发表于 2016-5-27 14:44
一个软件 进入关键点后确搜不到 注册 试用这些关键词 是不是作者将代码混淆了 新手见谅

这里有三种可能:
1.如你所说,你可根据代码是否脱壳良好,查一些其他字符串还判断;
2.也可能是网络验证,字符串是通过网络JSON字符串等传进来的,所以可能搜索不到;
3.也有可能是你没有找到正确的位置,你搜索的字符串不在主程序中,而在其他dll中
 楼主| 我也是个傻瓜 发表于 2015-12-12 15:18
hyxsp 发表于 2015-12-10 21:42
@xiao452159568,dnspy跟NET.Reflector,强在定位,可通过一条C#的指令定位到它相对应的IL代码,NET.Reflec ...

dnspy调试也不怕x86 x64的问题
dnspy不需要通过插件即可像VS一样断点调试
pppszxc 发表于 2015-11-15 21:03
不懂767 发表于 2015-11-15 21:10
这个不错,挺详细的,还没试过这种方式破解
我是邹军泽 发表于 2015-11-15 21:48
楼主学过.net..注册机是不是差不多哦就是直接copy代码。。。
scqandcy 发表于 2015-11-15 22:29 来自手机
我紧紧只是来顶
先飞菜鸟 发表于 2015-11-15 22:57
学习了,谢谢楼主
lianq 发表于 2015-11-16 07:54 来自手机
更好啊!学习了 加油。
tony2526 发表于 2015-11-16 09:18
真心膜拜Net大牛啊,Net的程序总是玩不转
痴心的叶子 发表于 2015-11-16 09:33
666~楼主给力
psx1lin 发表于 2015-11-16 09:46
利害

學起來
3
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-17 06:46

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表