第一步、分析程序
DIE查壳,无壳,.Net 开发的软件,因此选择dnSpy来作为逆向工具。
第二步,找关键位置
载入dnSpy,运行起来,点击注册。
输入假码,提示“错误的注册码”
暂停,在调用堆栈中找到这个弹窗的来源。
可知,btnOK_Click事件被触发后,假码导致66行的错误报错被触发。
由此可知,btnOK_Click即为注册购买窗口中确定按钮的消息事件。
第三步,分析注册逻辑
把注册方法拿出来阅读一下。
private void btnOK_Click(object sender, EventArgs e) { bool flag = false; bool flag2 = false; bool flag3 = false; bool flag4 = false; for (int i = 1; i < this.txtReg.Text.Length; i++) { if (this.txtReg.Text.Substring(i, 1) == "W") { flag = true; } if (this.txtReg.Text.Substring(i, 1) == "A") { flag2 = true; } if (this.txtReg.Text.Substring(i, 1) == "N") { flag3 = true; } if (this.txtReg.Text.Substring(i, 1) == "G") { flag4 = true; } } if (this.txtReg.Text == "MD9M3M9CV2834PWPEOT" && 20171031 > Convert.ToInt32(DateTime.Now.ToString("yyyyMMdd"))) { MessageBox.Show(Form1.lan[38], "OK", MessageBoxButtons.OK); FileStream fileStream = new FileStream(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\w2psound.dll", FileMode.Create); StreamWriter streamWriter = new StreamWriter(fileStream); string value = "20130303"; streamWriter.Write(value); streamWriter.Flush(); streamWriter.Close(); fileStream.Close(); base.Close(); Form1.zhuce = true; Application.Exit(); return; } if (this.txtReg.Text.Trim().Length != 15) { MessageBox.Show(Form1.lan[39], Form1.lan[39], MessageBoxButtons.OK); base.Close(); return; } if (flag && flag2 && flag3 && flag4) { MessageBox.Show(Form1.lan[38], "OK", MessageBoxButtons.OK); FileStream fileStream2 = new FileStream(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\w2psound.dll", FileMode.Create); StreamWriter streamWriter2 = new StreamWriter(fileStream2); string value2 = "20130303"; streamWriter2.Write(value2); streamWriter2.Flush(); streamWriter2.Close(); fileStream2.Close(); base.Close(); Form1.zhuce = true; Application.Exit(); return; } MessageBox.Show(Form1.lan[39], Form1.lan[39], MessageBoxButtons.OK); base.Close();}
首先定义了四个flag,然后循环判断,检查注册码中是否包含W、A、N、G这四个字符,大概是作者姓王吧……
为了验证下这个逻辑,我们输入假码WANG看看。
在30行下断点,逐过程调试,把for循环走完。
然后发现flag并没有被置为true。
原因是W实际上是WANG这个字符串的第0个字符,而它的for从1开始计算,因此正确的注册码的第2-5位应该是WANG。
至于第一位是多少,目前看不来,随便,假设它是M吧。
接下来看49行的判断。
如果注册码等于“MD9M3M9CV2834PWPEOT”且现在的时间早于20171031。
遗憾的是这已经是2020年了。
当然你也可以爆破这个判断,修改方式很多,有以下逻辑:
1.注册码等于xxx,且时间晚于xxx
2.注册码等于xxx,或时间晚于xxx
3.注册码不等于xxx,或时间早于xxx
4.注册码不等于xxx,且时间晚于xxx
你可以随意玩。
本篇教程目的是分析注册算法,而不是爆破,所以无视这个判断,继续往下看。
64行,如果注册码长度不是15位,报错。
70行,如果几个flag都是true,则注册成功。
综上,只要2-5位是WANG就行了。
试一试。
用MWANGMWANGMWANG尝试注册,提示成功。
这就完了?
是的,这是一个注册思路,很简单的算码。
继续分析,看看他提示注册成功后干了什么。
首先是一个弹窗,提示注册成功了。
然后在Environment.SpecialFolder.ApplicationData这个位置创建了一个dll,其内容为20130303。
这个目录在哪里呢?
按Win+R,打开运行对话框,输入%appdata%,确定。
你就能看到这个文件。
右键,打开方式,记事本。
吐血。
卒。
当然,你别用记事本去打开其他软件的dll,正常情况下我们的dll和exe一样是由编译产生的。
接下来我们分析一下这个软件是如何判断软件是否注册的。
既然写入了这个dll,打开软件时的判断肯定会和这个文件有关。
搜索一下这个文件名,可以发现在软件窗口加载时进行了判断,如果有这个文件且内容为20130303,则这个软件已经注册。
因此,我们可以不计算注册码,直接伪造授权文件。
在桌面新建一个记事本文档,输入内容20130303,将这个文档的名字改成w2psound.dll。
然后把这个文件放入%appdata%目录。
经测试,效果是一样的。
所涉及的样本下载地址:https://muruoxi.lanzous.com/iR3QYecsmof
声明:本站所有资源均由网友分享,如有侵权内容,请在文章下方留言,本站会立即处理。