该案例仅供研究学习,不提供破解后软件下载,请在24小时之内删除相关软件、忘记相关内容。。
先来介绍个工具,dnSpy,下载地址:http://down.52pojie.cn/Tools/NET/dnSpy%20v2.0.2.0.zip
集分析,反编译和调试于一身,像是是ILSpy with Debugger,Reflector+Reflexil的合体,而且感觉比ILSpy和Reflector更强大,操作和UI都和VS类似
首先PEid查下
那么直接放到dnSpy中看一下
发现是加了混淆,用DotNet Id查一下是什么
直接用de4dot来脱一下看看
其实这里是DotNet Id查的有问题,很明显的看到其实这个是Reactor 4.2,再用dnSpy载入发现正常了,虽然里面还有一些伪代码,但是不影响阅读了
先来看看这个程序的流程,打开后是一个登陆界面,根据提示,可以找到这个窗口对应`login1`,登陆按钮点击事件是`Button2_Click`,免费试用按钮点击事件是`Button1_Click`
直接点击免费试用进入`MainForm`,发现最上面是一个`MenuStrip`,看到里面的一些信息
最显眼的无非就是`到期日期:免费版`,那么在`MainForm`中搜索一下`免费版`这个关键字
在`MainForm_Load`中,可以看到这么一些代码
似乎仅仅是和`lblver.Text`做了比较处理?找了找控件发现`lblver`其实是`ToolStripMenuItem`,而且还做了属性封装,取值返回的直接就是一个控件,一开始想的修改返回值基本上失败了
回过头来看看,点击免费试用之后的处理
`method_21()`这个方法是得到一个`MainForm`的实例,将其中的`lblver`强制命名为免费版,那么将这里更改成专业版之后看一下
功能比对,可以发现这里很多限制都已经去掉了,但是可以发现在一些地方仍然是免费版,比如
不过这问题不大,仅仅是显示而已,可以看到功能还是专业版的功能,但是其他一些地方就是这样
这里感觉很奇怪,明明都在MainForm中,为什么验证方法会不一样呢,于是再搜索一下这些地方的验证过程是什么样的
找到两处明显不同的验证代码如下:
[C#] 纯文本查看 复制代码 if (Class6.bool_10)
{
goto IL_235;
}
IL_1E0:
num2 = 35;
Interaction.MsgBox("免费版不支持此功能!\r\n请升级正式版!", MsgBoxStyle.Information, "提示");
IL_1F5:
num2 = 36;
int arg_22A_0 = this.Handle.ToInt32();
string text = "Open";
string text2 = "http://www.zhanshensoft.com/price.html";
string text3 = "";
string text4 = "";
MainForm.ShellExecuteA(arg_22A_0, ref text, ref text2, ref text3, ref text4, 1);
IL_230:
goto IL_E55;
IL_235:
num2 = 39;
[C#] 纯文本查看 复制代码 if (!Class6.bool_8)
{
Interaction.MsgBox("免费版不支持数据自动保存和导出,且最多挖掘1000个关键词!\r\n请升级正式版!", MsgBoxStyle.Information, "提示");
int arg_7B_0 = this.Handle.ToInt32();
string text = "Open";
string text2 = "http://www.zhanshensoft.com/price.html";
string text3 = "";
string text4 = "";
MainForm.ShellExecuteA(arg_7B_0, ref text, ref text2, ref text3, ref text4, 1);
}
else
{
Class2.Class3_0.method_2().txtNum.Text = "33";
Class2.Class3_0.method_2().ShowDialog();
}
可以看到判断了`Class6.bool_8`和`Class6.bool_10`的值,而这两个值是一个bool型的静态字段,找了整个程序也没见到在哪儿有赋值,那么就自己动手来赋值好了,因为`Class6`是个类,那么在它的构造方法中将`bool_8`,`bool_10`赋值为`true`,上面那两种判断就可以避开了,来到`Class6`的构造方法,右键点击`编辑IL指令`
添加这几句指令
解释下这两条指令
`ldc.i4.1`(将整数值1作为Int32推送到计算机堆栈上)
`stsfld`(用来自计算堆栈的值替换静态字段的值)指令
替换完成后看现在`Class6`的构造方法
再来测试一下功能是否正确
修改后的破解专业版点击导出按钮
未修改的破解专业版点击导出按钮
==============================
超过10位正式成员同意,转正成功。
管理05
|