某批量Word转PDF转换器注册算法分析

爱必应

第一步、分析程序
DIE查壳,无壳,.Net 开发的软件,因此选择dnSpy来作为逆向工具。
某批量Word转PDF转换器注册算法分析-图1
第二步,找关键位置
载入dnSpy,运行起来,点击注册。
某批量Word转PDF转换器注册算法分析-图2
输入假码,提示“错误的注册码”
某批量Word转PDF转换器注册算法分析-图3
暂停,在调用堆栈中找到这个弹窗的来源。
某批量Word转PDF转换器注册算法分析-图4
可知,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看看。

某批量Word转PDF转换器注册算法分析-图5

在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尝试注册,提示成功。

某批量Word转PDF转换器注册算法分析-图6
这就完了?
是的,这是一个注册思路,很简单的算码。
继续分析,看看他提示注册成功后干了什么。
某批量Word转PDF转换器注册算法分析-图7
首先是一个弹窗,提示注册成功了。
然后在Environment.SpecialFolder.ApplicationData这个位置创建了一个dll,其内容为20130303。
这个目录在哪里呢?
按Win+R,打开运行对话框,输入%appdata%,确定。
某批量Word转PDF转换器注册算法分析-图8
你就能看到这个文件。
某批量Word转PDF转换器注册算法分析-图9
右键,打开方式,记事本。
某批量Word转PDF转换器注册算法分析-图10
吐血。
卒。
当然,你别用记事本去打开其他软件的dll,正常情况下我们的dll和exe一样是由编译产生的。
接下来我们分析一下这个软件是如何判断软件是否注册的。
既然写入了这个dll,打开软件时的判断肯定会和这个文件有关。
搜索一下这个文件名,可以发现在软件窗口加载时进行了判断,如果有这个文件且内容为20130303,则这个软件已经注册。
某批量Word转PDF转换器注册算法分析-图11
因此,我们可以不计算注册码,直接伪造授权文件。

在桌面新建一个记事本文档,输入内容20130303,将这个文档的名字改成w2psound.dll。

然后把这个文件放入%appdata%目录。

经测试,效果是一样的。

所涉及的样本下载地址:https://muruoxi.lanzous.com/iR3QYecsmof

声明:本站所有资源均由网友分享,如有侵权内容,请在文章下方留言,本站会立即处理。

原文链接:,转发请注明来源!

发表评论