吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 16738|回复: 45
收起左侧

[.NET逆向] 一款.Net程序算法注册机编写详细教程

  [复制链接]
Marketing 发表于 2018-8-4 13:27
本帖最后由 Marketing 于 2018-8-4 13:29 编辑

第一次发布这么长的教程,可能有点啰嗦,希望大家理解. 技术含量不怎么高,适合新手入门.后面我会继续发布安卓逆向算法的相关算法分析,希望在论坛和各位大神相互学习.软件本身对大都数人价值不大.相关的敏感信息已经全部打码,发帖目的在于分享方法和思路.
1.    首先运行软件,提示需要注册才能继续使用,否则无法使用功能界面.
注册界面.png
2.     关闭软件, 直接使用dnSpy载入,发现程序反编译都是乱码,因为加了壳
加壳程序.png
3.     运行CMD命令使用de4dot脱壳,脱壳后的程序如下,类名,方法名都已经清晰可以看见.
脱壳后.png
4.     接下来就是定位关键代码, 因为我之前分析过,所以上面的截图就是验证关键代码, 其实一开始拿到软件,关键代码的定位是非常重要并且费时间的一步. 很多时候定位都可以通过搜索字符串实现, 但是还有很多情况是需要结合其他方式和个人逆向经验的.
4.1首先在dnSpy中运行调试程序. 输入假码,程序提示注册码长度无效,没关系,因为是随便输入的.
输入假码.png
4.2不要关闭它的错误提示, 返回dnSpy,在调试工具条按下暂停按钮.
调试按钮.png
4.3 简单单步跟踪几步,注意观察软件界面下方局部变量窗口的值变化.在某一个位置出现了,我们输入的假码信息, 停下来, 仔细分析上下代码和其他局部变量值,看看能否找出对我们有价值的信息.

关键数据.png
展开this对象的变量值,往下查找可以发现我们输入的用户名,密码,假码,包括机器码都存在在这里, 所以可以判断这里一定有我们想要的一些信息. 查看上图, this对象是属于 FmAddUser.接下来我们就去找 FmAddUser这个类进行分析.
假码信息.png

4.4   dnSpy右侧的资源管理器,查找到FmAddUser, 查看它的方法列表,很明显的可以看见它有几个按钮事件, 在逆向分析的时候按钮事件是需要我们特别关注了, 因为它是我们在执行操作时最先执行的代码.  一个一个查看,btn_ok_Click方法可以明显看到有注册码错误字符串(但是我通过dnSpy的搜索注册一个结果都没有,不知道是什么原因), 前面的代码进行的操作是普通注册软件的套路,首先读取用户输入信息,然后调用验证函数验证, 最后将验证结果进行对比,如果正确就返回OK,错误提示信息框错误.
4.5   一开始呢,也想直接在这里把他给爆破掉,但是程序有自校验, 修改任何地方都会导致奔溃.  第二次方式是想打个补丁,但是.NET程序打补丁还没尝试过,使用也不方便. 最后想着反编译的结果都这么清晰了,直接找出他的注册算法不是更好?

分析.png
5.     点击进入Verity()方法内, 开始分析软件注册算法
解密函数.png

进去之后发现调用了DESDecrypt ()方法, 原来是个常用的DES加密算法,这下分析就轻松多了,直接找出加密的Key,IVMode.  直接在DESDecrypt()方法前下一个断点,运行程序进行动态调试.

调试1.png       
在局部变量窗口可以看见DESDecrypt传入的参数分别是 RegCode(输入的注册码), “adecefgd”.继续跟进DESDecrypt方法, 发现DES加密的key,IV,Model分别是:


[C#] 纯文本查看 复制代码
       key = "abecefgd";

       iv = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };   //程序截图的是10进制, 这里是调试时的16进制字节数组

Mode="DES/CBC/PKCS7Padding"

//输出格式是Base64编码.


des.png       
到这里程序的加密算法已经特别清晰了, 接下来我们要分析进行加密前的原字符串和格式.
6.     返回Verity()方法进行分析:


[C#] 纯文本查看 复制代码
public string Verity()[/size][size=4]                {
                        string text = SDKSecurity.DESDecrypt(this.RegCode, this.\u000E);   //调用DES解密函数,  传入参数: RegCode(输入的注册码),DES加解密key(“adecefgd”)
                        //text= 解密后的结果
                        int num;
                        if (int.TryParse(text.Substring(0, 8), out num)) //截取解密结果的前8位字符, 通过调试可以知道这个是到期时间, 格式: 20180101
                        {
                                new DecryptFile().SetEndDate(text.Substring(0, 8));//保存到期时间到本地文件
                        }
                        if (string.IsNullOrEmpty(this.RegCode) || this.Machine != this.CountMachineCode() || text.Substring(8) != this.Machine)
                                //判断注册码是否为空, 机器码是否等于电脑机器码, 解密后的结果8位以后字符串是否等于机器码   .  如果为真,则提示错误
                        //这上面两个可以判断,解密后的结果是8位的到期时间+机器码
                        {
                                return global::\u0003.\u0002(122172263);
                        }
                        if (!DecryptFile.CanOpenPage())//检测注册文件是否保存成功,如果保存失败,返回提示用户重新注册
                        {
                                new DecryptFile().SetEndDate(global::\u0003.\u0002(122172246));
                                return global::\u0003.\u0002(122172231);
                        }
                        DecryptFile.AddDate();
                        return SDKSecurity.DESDecrypt(this.RegCode, this.\u000E).Substring(0, 8);//返回注册码的到期时间
                }



7.     接下来编写一个java代码进行验证,写入一个到期时间+自己的机器码,调试输出计算出的注册码


java代码.png
输出结果.png


8.     最后一步进行注册授权,看看是否计算正确

结果.png
点击确定,弹出注册成功,功能使用也都没有任何问题,说明程序算法分析已经完成啦!

注册成功.png

免费评分

参与人数 12吾爱币 +14 热心值 +11 收起 理由
smile1110 + 1 我很赞同!
她家的小帅哥 + 1 + 1 非常简单明了,适合我这种想入门.net的新手。谢谢
liphily + 1 + 1 详细——美滋滋
爱飞的猫 + 1 + 1 用心讨论,共获提升!
pentium450 + 1 + 1 谢谢@Thanks!
不苦小和尚 + 1 + 1 不错不错,能否把软件一起发一下
朱朱你堕落了 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
lpxx + 2 + 1 我很赞同!
qaz003 + 1 + 1 谢谢@Thanks!
luo461083042 + 1 谢谢@Thanks!
CrazyNut + 2 + 1 用心讨论,共获提升!
无情绝恋 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

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

她家的小帅哥 发表于 2018-12-22 17:09
请问下,if (string.IsNullOrEmpty(this.RegCode) || this.Machine != this.CountMachineCode() || text.Substring(8) != this.Machine)
                                //判断注册码是否为空, 机器码是否等于电脑机器码, 解密后的结果8位以后字符串是否等于机器码   .  如果为真,则提示错误
                        //这上面两个可以判断,解密后的结果是8位的到期时间+机器码

楼主说从上面两个可以判断出解密后的结果是8位到期时间+机器码,可是我好像没看出来哪里可以看出来是到期时间+机器码的呢?
她家的小帅哥 发表于 2018-12-22 17:05
就是dnspy的操作完全不懂,比如怎么写注释、怎么编辑、IL的基础知识、动态调试的时候怎么返回、有哪些快捷键等等。有哪些视频或者资料可以学习一下吗?
tiannu 发表于 2018-8-4 13:40
Abgail阿比 发表于 2018-8-4 13:46 来自手机
安卓小白过来学习一下
luo461083042 发表于 2018-8-4 13:50
感谢楼主发布,谢谢分享。
金龙影子 发表于 2018-8-4 13:53
论坛有你更精彩!
lyliucn 发表于 2018-8-4 14:06
本帖最后由 lyliucn 于 2018-8-4 14:16 编辑

NET的程序基本源代码都出来了,破解起来就相对容易些。

没看出来是什么软件。
相逢何必曾相识! 发表于 2018-8-4 14:41 来自手机
不懂帮顶
流风T回雪 发表于 2018-8-4 15:02
技术贴,顶起
xiaolong100 发表于 2018-8-4 15:42
我也学习一下!谢谢分享
约定的童话 发表于 2018-8-4 16:08
厉害了我的哥,膜拜中....
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-16 10:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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