吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5169|回复: 12
收起左侧

[.NET逆向] 萌新学习DSA加密应用——MacroRxxxxxxx注册码解析

[复制链接]
S.L.Kagura 发表于 2019-10-25 16:39
本帖最后由 S.L.Kagura 于 2019-10-25 16:54 编辑

前言

前两天逛论坛,浏览了大佬的汉化发布贴
看说明是C#写的,顿时来了兴趣,主要想学习一下注册码的算法,看看有没有很有意思的东西。
在下萌新一枚,初学C#,有分析错误和记录错误的地方还请不吝赐教!

工具准备

dnSpy-netcore-win32 v6.0.5
待分析软件 v5.8

分析

首先用dnSpy载入,直接看到大大的Key名称空间,里面还有Encryption、LiceneseChecker、SerialGeneration这种十分照顾在下的名称,瞬间心态良好。
1.png
接着我们找到注册码的验证函数VerifyKey,VerifyKey这个函数还有一个重载函数,记得不要看错。这个过程很简单,就算不会分析,随便点点都能找到,所以寻找过程不是本次的重点。
2.png
接着我们看一下验证过程,上来第一件事直接正则匹配,如果是XXXX-XXXX-XXXX-XXXX这种格式的验证码,直接限制到期日在2014年1月31日。
3.png
这里我们肯定不会用旧版的注册码,往下会看到首先程序尝试用Base64转换,转换成功则继续,失败则返回。(关键点标记①)
4.png
紧接着,程序提取了转换后验证码的最后2字节,并组合在一起转换成整数型num。(关键点标记②)
5.png
5-1.png
这还没有完,程序通过C#的位运算符&,匹配num的最后一位数字是否是1,并返回布尔值。如果为真,则有更新限制。(关键点标记③)
6.png
之后,程序通过右移位运算符>>,把num的最后一位去掉,剩余的数就是注册码的有效月数。注意一点,此处的移位操作是对num变量的二进制型进行操作。如num的十进制型值为12,用二进制表示就是00001100,向右移动一位后变成00000110,再转换成十进制表示就是6。(关键点标记④)
7.png
最后,程序再把去除掉有效期和更新限制的注册码,以及转换为字节组型的用户名,作为参数一并传给DSA函数进行验证。(关键点标记⑤)
8.png
DSA算法是一种常用的不对称加密算法,在下对这个算法原理学习还不到位,这里就不讲解原理了。虽然原理上有区别,但是其应用方法和RSA是一样的,私钥加密明文得到密文,通过公钥解密密文得到明文。通过分析代码,你可以更深层次了解和学习到相关的内容,十分的迷思。这或许是作者的福利,咱也不知道,咱也不敢问...

复原

了解清楚的注册码的验证过程,我们只需要逆推关键点操作,就可以得到注册码生成的过程了。


[C#] 纯文本查看 复制代码
public static string MakeSerial(string username)
{
    // 有效期和更新限制
    DateTime expirationDate = new DateTime(2099, 12, 31);
    bool releaseLimited = false;

    // DSA加密用户名(关键点标记⑤)
    DSACryptoServiceProvider dcsp = new DSACryptoServiceProvider(keySize);
    dcsp.FromXmlString(priKeyString);
    byte[] bMessage = new UTF8Encoding().GetBytes(username);
    byte[] serial = dcsp.SignData(bMessage);
    dcsp.PersistKeyInCsp = false;

    // 生成有效期更新限制代码
    int countMonth = (expirationDate.Year - DateTime.Now.Year) * 12 + (expirationDate.Month - DateTime.Now.Month); //计算月份(关键点标记④)
    byte[] value = IntToDoubleByte(countMonth * 2 + Convert.ToInt32(releaseLimited)); //添加更新限制(关键点标记③)

    // 组合(关键点标记②)
    serial = CopyByteArray(serial, value);

    // Base64编码(关键点标记①)
    return Convert.ToBase64String(serial);
}

免费评分

参与人数 3威望 +1 吾爱币 +9 热心值 +3 收起 理由
Hmily + 1 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
笙若 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
夏雨微凉 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

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

空空如也丫 发表于 2019-10-25 17:10
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
SonyXperia 发表于 2019-10-25 17:11
醉挽清风 发表于 2019-10-25 17:14
了解清楚的注册码的验证过程,我们只需要逆推关键点操作,就可以得到注册码生成的过程
亿联网络 发表于 2019-10-25 17:15
支持楼主  学习学习
蒋蒋蒋 发表于 2019-10-25 17:16
学习一下,谢谢
forward2000 发表于 2019-10-25 17:16
Have a Look At!!!!!
SquareMin 发表于 2019-10-25 17:22
学习了。感谢楼主
charmy20 发表于 2019-10-25 17:25
感谢!!!
王贺民 发表于 2019-10-25 17:28
没有接触过C#
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-16 16:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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