最近电脑坏掉,正维修中今天告诉我登录不到系统 告诉对方密码
也没有办法进入系统,只有重装了哎,内存注入及几个重要函数
远过程汇编调用包括截包方面的代码是白写了 不过也没办法,
好了不谈那些 今天我介绍如何软破解一款《2015会计从业题库
M7.01》的.NET软件 方法是“软破”
我们去下载这个软件 http://pan.baidu.com/s/1i3o8dsL
在把它安装上,这里的步骤我就不说明了
把软件安装上后,在桌面或开始中会出现在这个图标,我们双击它
运行,会发现
一个对话框,要求我们输入产品秘钥 但是我们没有却需要用它怎么
做呢?只有去破解它才可以了。
右键它的快捷方式,属性,查找目标
我们看到它与桌面上快捷方式的图标不一样,但是不管他
总之目标文件就是它没错
右键“会计从业资格考试.exe”文件,如果你安装有.NET Refector
那么则会出现这个右键选项,我们单击它进去
咦,在.NET Refector中混淆过该程序引发“索引超出了数组界限”
的错误,那么可以判断该软件被混效过而且很大可能性是由
“.NET Reactor”混淆的,那么我们可以使用ILSpy去反汇编
由ILSpy打开“会计从业资格考试”后,我们发现好多命名空间有些是
不清楚的东西,那么我们怎么看呢?找有意义的命名,上面则有两个
一个“passwordCode”一个“会计从业资格考试”,所以我们先去看看
在“会计从业资格考试”命名空间中有什么
呀,一进去全是各种奇怪的命名 容我小小吐糟一下 那么到了这里
该怎么做,我们不可能一个一个分析 而由于该软件已被确定被混
淆过所以没办法使用搜索功能去搜索文本常量
我们只有粗滤通过命名估计是哪个,这个“CheckForm / 检查窗体”
相当可疑,所以我们先进去看看它的代码
上面的代码被混淆过,很难看出个具体 既然无法搜索文本常量
那么就在这个代码中找“窗体控件”的位置代码然后在比较一下
我们随意使用一个“窗口Spy"的工具,如上“彗星小助手”吧
窗口位置是“左边:24 顶边:48 尺寸:77x12”好的,现在我们
在ILSpy反编译CheckForm类中查找(CTRL+F)这个大小,
我们按照窗体设计器自动生成代码的格式“new Point(24, 48)”
填写在编辑框内,点击右光标键按钮 如上图找到了一个
相同的位置,那么基本可以确定我们要找的验证窗口在
这里,那么我们知道是通过“点击按钮”进行验证的而
窗口上只有一个Button而CheckForm的代码中也只有一
个Button那么可以确认它就是验证功能的按钮 我们需要
找到他连接的事件响应函数
但是很容易,熟悉VS/WinForm开发的人一定能很快的
反应过来确定就是这个button1_Click,那么我们看看
它的代码结构 很明显是一个简单的验证 验证成功后
把“注册码”保存下来,但是它的验证条件是
passwordClass.decode(“textBox2 / 注册码”)==“textBox1 / 机器码”
所以找到问题,那么我们就去点击“passwordClass.decode”
现在我们需要打开VS了,新建一个项目ARECrack 可能有人问
passwordClass.encode 会有加密代码?那不可能啊 否则谁都给
它轻松破了对吧 这软件的Key别人花钱150一个...扯淡
它的解密算法原理相当简单,它如何解得我们就怎么加
加与解通常是相反的操作,它的解密有伤部分是
text += str[i] - '\n' + '\u0005';
我们就修改成
text += str[i] + '\n' - '\u0005';
好的把调试板的value的值复制到“你的执行码”编辑框
中在点击“点击验证”按钮
但是出现“你的机器码输入不正确,请联系管理员。”信息框
激活失败了,那么肯定是加密的代码有点小错误 怎么修改呢
我们观察它的 解密有伤部分
text += str[i] - '\n' + '\u0005';
是上面的方式,那么会不会加密是有伤部分需要修改成
text += (char)(str[i] + '\n' - '\u0005');
好的把调试板的value的值复制到“你的执行码”编辑框
中在点击“点击验证”按钮
破解成功,那么可以得出它的正确加密算法是
static string encode(string str)
{
string text = "";
for (int i = 0; i < str.Length; i++)
{
text += (char)(str[i] + '\n' - '\u0005');
}
return text;
}
而它的正确解密算法是
static string decode(string str)
{
string text = "";
for (int i = 0; i < str.Length; i++)
{
text += (char)(str[i] - '\n' + '\u0005');
}
return text;
}
.NET反编译软件都具备一定的缺陷,我们需要了解
上面的例子则很清楚 如果我们不动脑袋去思考的话
这个问题可能会困绕到很多人,但是我们努力去思
考去探索那么则一切都有可能、