.NET破解之分享给新注册的朋友
前些日子,在论坛里看了有人发过这个软件,也有大神分析过网络版,如果是重帖,请删除吧;正好11.11注册了很多新会员,给他们一个见面礼吧,抛砖引玉,我才来论坛的时候,也是看着前人教程慢慢学习的;好久没冒泡了,因为工作很忙,我还差61分就晋级"出类拔萃"用户组了,请朋友们多多支持。
本文目的
1.dnSpy的基本使用;
2.介绍.NET程序破解的基本流程。
工具介绍
de4dot:脱壳,用来将用来保护的壳进行脱去并去混淆。(不清楚没关系,慢慢就会懂了,自己也可以搜索一下这方面的内容)
dnSpy:分析,用来反编译、分析和调试的工具。(个人觉得是新手用来分析.NET最好用工具,类似于VS操作;这一次我果断抛弃了以前使用NET.Reflector)
下载链接:http://down.52pojie.cn/Tools/NET/
论坛里也有其他大神分析和发布过这个软件:
http://www.52pojie.cn/thread-413431-1-1.html
http://www.52pojie.cn/thread-411667-1-1.html
http://www.52pojie.cn/thread-411536-1-1.html
http://www.52pojie.cn/thread-412355-1-1.html
下载试用
试用,并观察其中的限制,这是为了找到突破口。试用后会发现:软件标题栏写的试用版(如果破解后可能是写成正式版、VIP等,反正不可能是试用二字),软件状态栏写了剩下时间(如果破解后应该是永久或未来具体的某个时间);在帮助菜单栏中还有"注册认证"按键和窗口。

如果我们输入任意用户名和密码,点击"注册",会弹出"注册信息已保存,请重新启动软件系统进行验证"。(也就意味重启软件会验证注册信息的正确性)

自动脱壳
直接将应用程序拖放到de4dot上,如果正常脱壳,将会生成一个带"-cleaned"的应用程序文件。(这一步,很关键,研究不深,不敢多讲。)


用de4dot脱完壳后,一般都没什么问题,但必须明白de4dot并不是万能的。
寻找关键
代码大家都能看懂,只是茫茫代码,想必从何下手,怎样才能药到病除是大家最关心的。这就需要根据上一步线索来寻。下图为dnSpy的工具条,上面的工具都很重要,后面都会用到。

方案I 从头到尾法
从头到尾是我自己取的名字,怎样称呼都行。其基本根据是任何程序都有个入口点(即程序最开始从哪里执行),跳过非重点,一点一点往下分析。
我们都知道,在程序里都有一个Main函数(C#里通常在Program.cs文件里),被设计为程序的起点。为此,反编译程序一般都有快速定位到此函数功能。将脱壳后的程序加载到dnSpy后,在程序上右键菜单上,点击"go to point"即可到达此函数。

//程序互斥性检查
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函数吧。

代码很容易懂,如果注册成功了,会怎样;如果注册失败了会怎样。其实,程序破解都是这样,即使使用加密狗、网络验证啊,都是这样的模式,只要花时间,找到关键点,并能成功修改,一般都可以搞定。
if (regServer.IsReg())
{
//注册成功相关的操作
}
Else
{
//产品过期或剩下多少天。
}
所以,这个程序的关键点应该是在IsReg函数了,如果返回true,则程序已注册,否则为未注册。
方案II 按图索骥法
根据现在的"证据"信息,我们搜索关键信息。我们在搜索框中搜索"您还可试用",在类型中选择"数字或字符串"(还有很多类型可以选择,非常有用哦)

这样,我们同样可以搜索到我们想要的关键信息。
暴破测试
我们修改如下,让它始终返回为真。
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了。
深入分析
暴破往往是新手的手法,我们更需要分析它的算法,写一个注册机。下面是分析过程:
//在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函数
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
public string GetSN(string strName)
{
return smethod_0(strName);
}
在VS里写这个函数,然后输入任意用户名,最后得到了注册码(这个格式要求的,想不到吧),然后拿去注册验证就没有问题了。

至此,我们分析完毕。
功能测试
接下来,我们需要测试一下这些功能,看是还有什么问题,在此略过。
.NET破解之分享给新注册的朋友的更多相关文章
- 新注册域名greenopen.site,向专业道路进军
新注册域名greenopen.site,向专业道路进军,欢迎访问!届时可以通过 greenopen.site jsxyhelu.github.io 或者jsxyhelu.cnblogs.com 访问本 ...
- Charles 破解版免费下载和注册安装教程
本文参考:[Charles 破解版免费下载和注册安装教程](https://www.axihe.com/tools/charles/charles/free-use.html) **软件开发不易,请尽 ...
- wordpress新注册用户或重置密码链接失效
在网上找了好多个博客,一个比一个不要脸,要更改的是两个文件,最后都抄成一个文件了. 原文链接https://www.cnblogs.com/liudecai/p/6474611.html 我是按照这个 ...
- Navicat Premium 12破解版激活(全新注册机)
使用打包下载就可以了 打包下载:(注册机有5.0和5.1用哪个看心情,我用的5.1) 连接:https://pan.baidu.com/s/1ARjFa2vEYxe9sljbrZR8fQ 提取码:lx ...
- IBM appscan 9.0破解版分享
简介:IBM AppScan该产品是一个领先的 Web 应用安全测试工具,曾以 Watchfire AppScan 的名称享誉业界.Rational AppScan 可自动化 Web 应用的安全漏洞评 ...
- 新注册第一帖----------------------乱码新手自学.net 之Linq 入门篇
作为一个业余开发,断断续续学.net/c#也有不少日子了, 学习过程中,不断忘了学,学了忘,这让我很苦恼. 以前学习过程中,我总是在笔记本中记录下来知识要点,这么久下来,笔记本都写了四五本了. 然而, ...
- App测试经验分享之登录注册
要诀 另外自己总结了一些要诀,仅供参考: 1)快:快速操作,营造冲突的场景,例如加载过程中返回键交互,快速点击登录按钮,快速切换菜单项,快速多次上下拉刷新 2)变:手机横竖屏.手机切换语言.手机调整字 ...
- keil密钥过期 新注册机 有效期至2032年
点击下载:keil注册机至2032年
- GVS案例分享|乘新时代姑苏舫号,体验匠心智能控制
水,是苏州的灵魂,串起苏州的古与今.动与静.金鸡湖景区位于苏州工业园区,总面积11.5平方公里,其中水域面积7.4平方公里. 新时代姑苏舫号,是金鸡湖景区极具苏式特征且规格超高的游览船型.船体分为上下 ...
随机推荐
- ios ZBar扫二维码奇奇怪怪的错误
Undefined symbols for architecture armv7: "_CVPixelBufferGetHeight", referenced from: -[ZB ...
- Mysql :removeAbandonedTimeout:180
#数据库链接超过3分钟开始关闭空闲连接 秒为单位 removeAbandonedTimeout:180 这个参数会是一个坑吗? http://www.oschina.net/question/1867 ...
- MyEclipse从数据库反向生成实体类之Hibernate方式 反向工程
前文: hibernate带给我们的O/RMapping思想是很正确的,即从面相对象的角度来设计工程中的实体对象,建立pojo,然后在编写hbm.xml映射文件来生成数据表.但是在实际开发中,往往我们 ...
- libevent源码深度剖析
原文地址: http://blog.csdn.net/sparkliang/article/details/4957667 第一章 1,前言 Libevent是一个轻量级的开源高性能网络库,使用者众多 ...
- 模拟Jquery选择器
目前实现的功能有以下几点: 1.$("#adom"); // 返回id为adom的DOM对象 2.$("a"); // 返回一个a标签的数组 3.$(" ...
- Knockout 新版应用开发教程之Observable Arrays
假如你想到侦测和相应一个对象的改变,假如你想要侦测和响应一一组合集的改变,就要用observableArray 在许多场景都是很有用的,比如你要在UI上需要显示/编辑的一个列表数据集合,然后对集合进行 ...
- Hadoop入门进阶课程9--Mahout介绍、安装与应用案例
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为 http://www.cnblogs.com/shishanyuan ...
- 3、使用Oracle Logminer同步Demo
使用Oracle Logminer同步Demo 1 Demo介绍 1.1 Demo设想 前面介绍了Oracle LogMiner配置使用以及使用LogMiner进行解析日志文件性能,在这篇文章中将利用 ...
- 受限玻尔兹曼机(RBM)学习笔记(四)对数似然函数
去年 6 月份写的博文<Yusuke Sugomori 的 C 语言 Deep Learning 程序解读>是囫囵吞枣地读完一个关于 DBN 算法的开源代码后的笔记,当时对其中涉及的算 ...
- Linux用户组管理
用户组信息存放:/etc/group 当组内只有一个用户,并且用户名和用户组名一致时默认不显示:组号1-499是系统预留的用户组,>=500的用户组是管理员手动创建的,组密码占位符用x表示 ...