软件破解,安卓app逆向破解

某个软件的逆分析和注册器创建检查前言中没有注册时的解密过程软件信息,逆编译源代码,分析源代码,创建注册器,创建注册表代码

前言

该软件获取计算机的硬件信息,包括CPU序号、MAC地址、硬盘序列号,并根据这些硬件信息生成3358www.Sina.com/。 用户将序列号发送给软件提供程序,提供程序将http://www.Sina.com/(.lic格式的文件)发送给用户,用户可以使用注册码完成注册。

本文将解决以下问题:

软件如何使用硬件信息生成序列号(3358www.Sina.com/和序列号的转换关系)软件如何从序列号生成http://www.Sina.com 如何根据序列号(或硬件信息)获取注册码?注册码

如果未注册,请先运行软件:

软件直接显示对话框。

单击“确定”,然后单击上面菜单栏中的“注册”,再单击“获取硬件信息”,软件安装目录中的“硬件信息收集工具. exe”将自动打开。

在界面中,可以直接查看该软件读取的硬件信息:CPU序列号、MAC地址和硬盘序列号。

单击“硬件号”,将http://www.Sina.com/http://www.Sina.com /此序列号发送到软件提供商,从提供商获得注册码,然后单击图2中的“注册”

解密过程与查看软件信息一样,查看序列号此软件的编写语言以确定是否添加shell。

很明显,该软件是用注册码是否有效语言编写的,基于.注意:以下内容将屏蔽敏感信息!本文仅做技术研究!框架。

硬件信息

因此,正如接下来想在C#反编译软件序列号中做的那样~

源代码反编译正常流程下打开此软件的ExeinfoPe

在左侧视图中,该软件包括http://www.Sina.com/: quality.startup、Quality.Startup.Config和Quality.Startup.Properties

C#语言

然后分析NET类的代码。 用于实现功能的核心代码如下所示。

//流程1 (作者评论:私有bool authorize ) ) try ) string text=uitxtregisterkey.text; 字符串文本2=’ license ‘; 字符串文本3=’/license ‘; //流程的步骤2 (笔者注释) if (! text.contains (文本3 ) |! text.contains(text2) { new form }.showerror dialog )“硬件编号异常。 请在生成硬件编号时复制所有字符信息)”返回假; (//过程第二步)笔者的评论) text=text.replace(text2,”).replace (text 3,”).Trim ); //过程3 (作者注释) text=extended utils.decrypt (text.substring (0,text.Count )- 4 ),text.substring ) ) text if(hardmessage==null ) { new form }.showerror dialog )“硬件序列号异常。 生成硬件序列号时,请在不更改字符信息的情况下完全复制)”返回假; } enum helper.getenumdescription (hard message.duration ); if(hardmessage.CPUinfo!=hardware information.CPU info|| hard message.disk no!=hardware information.disk no |!=hardware information.MAC地址(new form ).ShowErrorDialog (“硬件信息不匹配”); 返回假; } servermessageservermessage=new server mess

age();serverMessage.Clients = 1;serverMessage.Code = Guid.NewGuid().ToString();serverMessage.Date1 = DateTime.Now;switch (hardMessage.Duration){case EDuration.Forever:serverMessage.Date2 = DateTime.Now.AddYears(100);break;case EDuration.OneMonth:serverMessage.Date2 = DateTime.Now.AddMonths(1);break;case EDuration.ThreeMonth:serverMessage.Date2 = DateTime.Now.AddMonths(3);break;case EDuration.SixMonth:serverMessage.Date2 = DateTime.Now.AddMonths(6);break;case EDuration.OneYear:serverMessage.Date2 = DateTime.Now.AddYears(1);break;case EDuration.TwoYear:serverMessage.Date2 = DateTime.Now.AddYears(2);break;case EDuration.FiveYear:serverMessage.Date2 = DateTime.Now.AddYears(5);break;default:serverMessage.Date2 = DateTime.Now.AddMonths(1);break;}serverMessage.HDMessage = new HardMessage{CPUInfo = HardWareInformation.CPUInfo,DiskNo = HardWareInformation.DiskNo,MacAddress = HardWareInformation.MacAddress};File.WriteAllText(Paths.AppLicfilePath, ExtendedUtils.Encrypts(JsonHepler.Json_SerializeObject(serverMessage)));if (serverMessage != null){skinLabelLastTime.Text = LimitTime(serverMessage);}UIMessageTip.ShowOk(“注册完成”);skinLabelLastTime.Visible = true;uiLabel.BringToFront();uiLabel.Visible = true;skinLabelLastTime.BringToFront();MainForm.Instance.Text = MainForm.RegisteredTitle;MainForm.Instance.SetStatusMsg(string.Empty);return true;}catch (Exception ex){LogHelper.Error(ex);}return false;} 分析源代码

经分析,读取注册码后的流程为:

用户指定注册码文件路径后,软件调用uiSymbolButton1_Click方法读取注册码文件,得到注册码text。用户点击“注册”按钮,软件调用Authorize方法(该方法就是上面展示的核心代码);如果text中不包含字符串”<License>” 或 “</License>”,则报错。否则,把”<License>” 和 “</License>“都替换成空字符串,也就是删掉text中的”<License>” 和 “</License>”,得到text;调用ExtendedUtils.Decrypt方法对text解密。密文是text的第0位到倒数第5位(text.Substring(0, text.Count() – 4)),解密密钥是text的最后4位(text.Substring(text.Count() – 4))。解密后的明文也存在text中;调用JsonHepler.Json_DeserializeObject方法对text反序列化,得到hardMessage;分别提取hardMessage中的CPUInfo字段、DiskNo字段和MacAddress字段(这些字段代表了注册码中的硬件信息),与本机的实际硬件信息对比,如果全部匹配,则注册码有效!

数据的大致流程图如下(注意:hardMessage的字段除了图中的三个以外,根据反编译出来的源代码可知,还有Clients字段):

以上的流程回答了问题2

至此,再来回答问题1
既然软件验证注册码的时候用到Json_DeserializeObject方法来反序列化(字符串→硬件信息)
那么生成注册码的时候就可以用Json_SerializeObject方法来序列化(硬件信息→字符串)

最后回答问题3
对于破解者来说,需要写一个程序(或者称为注册机),输入硬件信息(CPU序号、MAC地址、硬盘序列号),输出注册码
参考上面的流程图,很容易想到,只要把这个流程反过来就行。
既然软件判断注册码是否有效的流程是:
(注册码)去掉两个字符串→解密(得到序列号)→反序列化→对比硬件信息

那么破解者的程序流程就应该是:
输入硬件信息→序列化(得到序列号)→加密→加上两个字符串(得到注册码)!!

参考源代码:
软件使用ExtendedUtils.Decrypt方法解密
那么注册机就可以用ExtendedUtils.Encrypt方法加密

软件使用JsonHepler.Json_DeserializeObject方法反序列化
那么注册机就可以用JsonHepler.Json_SerializeObject方法序列化

其中要注意的一个小细节是:根据源代码可知,解密用的密文在前,4位长度的解密密钥紧跟着密文后面,密文和解密密钥是不重叠的!密文在前解密密钥在后组成字符串。因此,解密用到的密钥不是固定的,完全就是字符串的最后四位

而且在ILSpy中继续查看ExtendedUtils.Decrypt方法的实现方法(如下图),发现是使用DES算法加密,这是一种对称加密算法,加密密钥和解密密钥相等,因此加密密钥是可以任意指定4位字符串的!

编写注册机

接下来就可以编写一个注册机了,这也是最激动人心的时候!

与软件相同,注册机也用C#语言写,使用Winform做一个小窗体界面。
输入:硬件信息(包括CPU序号、MAC地址、硬盘序列号)。
输出:注册码文件。

注意:以下只展示核心代码

首先需要定义一个HardMessage类,作为序列化的依据。

class HardMessage{ public string CPUInfo { get; set; } public string DiskNo { get; set; } public string MacAddress { get; set; } public int Clients { get; set; }}

然后就到了注册机的核心部分:

//构造硬件信息变量hardmessage,对hardmessage序列化为SerializeMessageHardMessage hardmessage = new HardMessage { CPUInfo = MyCPUInfo, DiskNo = MyDiskNo, MacAddress = MyMacAddress, Clients = 1 };string SerializeMessage = JsonHepler.Json_SerializeObject(hardmessage);//加密。明文为SerializeMessage,加密密钥为”abcd”(密钥可任意指定一个长度为4的字符串)//加密后的密文为EncryptMessagestring EncryptMessage = ExtendedUtils.Encrypt(SerializeMessage, “abcd”);//在密文EncryptMessage前加”<License>”,后加”</License>”string License = “<License>” + EncryptMessage + “</License>”;//生成注册码文件StreamWriter sw = new StreamWriter(“注册码.lic”);sw.Write(License);sw.Dispose(); 生成注册码

代码写全后,编译运行。

把硬件信息输入后,在注册机所在目录下就生成了“注册码.lic”的文件。
最后,在图2中的界面点击“浏览”,选择这个“注册码.lic”文件,点击注册。。。。。。

Bingo!!

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注