查看: 10529|回复: 0

Windows 8应用商店付费软件的破解

[复制链接]
  • TA的每日心情
    奋斗
    2021-9-24 16:00
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2013-1-27 21:22:17 | 显示全部楼层 |阅读模式
    [开头说几句]
    看本帖之前先要对win8进行越狱(我之前的帖子:http://bbs.cnhonker.com/forum.ph ... &extra=page%3D1),本来越狱的目的只是为了获取完全的控制权,并不是为了破解付费软件,但考虑到我国的国情,还是研究一下吧,本文还是站在前人的肩膀上完成的,感谢kost的努力。
    [原理]
    win8应用商店的很多软件都要付费,且要使用信用卡购买,但微软并未把穷人的路封死,它为软件开发者提供了颁发OEM批量许可的方式,但仅限于支持sideloading的计算机上安装,所以我们需要先越狱,这个办法的前提是要破解的应用需要提供试用版,如图中例子所示:
    1.jpg

    应用商店的所有许可证均保存在C:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\WSLicense\tokens.dat文件中。
    具体过程是:先下载好试用版,然后将其license从tokens.dat中读取出来,将其中的软件信息替换为OEM版本,再添加数字签名,最后将其重新写入,如下图所示:
    2.jpg

    再打开应用,已经变成了正式版。

    [具体过程]
    1. 读取license
    tokens.dat并非文本文件,license以byte形式存储,kost提供了一个函数ReadTokens用来读取,我做了修改:
    [C] 纯文本查看 复制代码
    ..........
    private static bool ReadTokens(string appID,Boolean isALL){//appID就是应用的产品ID号,isALL为true时可输出查看所有已安装应用的appID。
     //isALL为false时,以appID为参数传入。
            try
                {
                    byte[] Tokens;
                    string TokensFileName;
                   TokensFileName = Environment.GetEnvironmentVariable("SystemRoot") +
                        "\\ServiceProfiles\\LocalService\\AppData\\Local\\Microsoft\\WSLicense\\tokens.dat";
                    Tokens = File.ReadAllBytes(TokensFileName);
                    byte[] LicenseStartPattern = Encoding.ASCII.GetBytes("<License");
                    byte[] LicenseEndPattern = Encoding.ASCII.GetBytes("</License>");
                    for (int pos = 0, pos_end; ; )//以"<License“为关键字循环读取
               {
                        pos = BinIndexOf(Tokens, LicenseStartPattern, pos);
                        if (pos < 0) break;
                        pos_end = BinIndexOf(Tokens, LicenseEndPattern, pos + 1);
                        if (pos_end < 0) break;
                        pos_end += LicenseEndPattern.Length;
                        XmlDocument x = new XmlDocument();
                        x.PreserveWhitespace = true;
                        try
                        {  //将读取到的数据写入xml中
                   x.InnerXml = Encoding.ASCII.GetString(Tokens, pos, pos_end - pos);
                            XmlNode nodeRoot = x.FirstChild;
                            XmlNode nodeBinding = nodeRoot["Binding"];
                            XmlNode nodePFM = nodeBinding["PFM"];
                            if (isALL)//如果isALL为true,输出所有产品ID信息
                   {
                                Console.WriteLine(nodePFM.InnerText);
                            }
                            else //否则将传入 appID指向的应用许可证保存为tokens.xml临时文件
                            {
                                if (nodePFM.InnerText == appID)
                                {
                                    File.WriteAllText(Environment.GetEnvironmentVariable("TEMP")+"\\tokens.xml", x.InnerXml, Encoding.UTF8);
                                }
                            }
                        }
                        catch (Exception)
                        {
                            pos_end = pos + 1;
                        }
                            pos = pos_end;
                    }
                }
                catch (Exception ex)
                {
                   Console.WriteLine("ReadTokens " + ex.Message);
                    return false;
                }
                return true;
            }

    2.将读取到的license转换为OEM:

    首先需要一个空白的license框架,以填充内容:
    [C] 纯文本查看 复制代码
    <License Version="1" Source="OEM" xmlns="urn:schemas-microsoft-com:windows:store:licensing:ls">
    <Binding Binding_Type="Machine">
    <ProductID></ProductID>
    <PFM></PFM></Binding>
    <LicenseInfo Type="Full">
    <IssuedDate></IssuedDate>
    <LastUpdateDate></LastUpdateDate>
    </LicenseInfo>
    </License>

    [C] 纯文本查看 复制代码
    ................ 
    private static xmlClass READ_LIC,WRITE_OEM; //xmlClass为事先写好的xml操作类,由于license文件带有命名空间,故要先进行定义。
     private static string LIC_PRODUCTID,LIC_PFM;
     private static string LIC_NAMESPACE = "urn:schemas-microsoft-com:windows:store:licensing:ls";//命名空间
    ....................
            private static XmlDocument ConvertLicToOEM(string Lic)//Lic为为tokens.xml临时文件的完整路径
            {
                try
                {
                    READ_LIC = new xmlClass(Lic, LIC_NAMESPACE);
                    WRITE_OEM = new xmlClass("lictemp.xml", LIC_NAMESPACE);//准备向lictemp.xml框架文件写入数据
              LIC_PRODUCTID = READ_LIC.getNodeWithNameSpace(@"/root:License/root:Binding/root:ProductID");//从tokens.xml临时文件读取ProductID和PFM
                    LIC_PFM = READ_LIC.getNodeWithNameSpace(@"/root:License/root:Binding/root:PFM");
                    WRITE_OEM.setNodeWithNameSpace(@"/root:License/root:Binding/root:ProductID", LIC_PRODUCTID);
                    WRITE_OEM.setNodeWithNameSpace(@"/root:License/root:Binding/root:PFM", LIC_PFM);
                    WRITE_OEM.setNodeWithNameSpace(@"/root:License/root:LicenseInfo/root:IssuedDate", "2022-11-01T14:25:14Z");
                    WRITE_OEM.setNodeWithNameSpace(@"/root:License/root:LicenseInfo/root:LastUpdateDate", "2022-11-01T14:25:14Z");//这两个日期为随机
              WRITE_OEM.Save();
    
                    XmlDocument XMLLIC = new XmlDocument();
                    XMLLIC.Load("lictemp.xml");
                    SignXml(XMLLIC);//下一步,对license 进行数字签名
                    return XMLLIC;
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    return null;
                }
            }

    3.进行数字签名
    对商店付费应用的app签名,必须使用RSA-SHA256算法,.net framework中没有,微软提供了一个补充类RSAPKCS1SHA256SignatureDescription的源码,包含在Security.Cryptography命名空间。
    [C] 纯文本查看 复制代码
             .....................
                SignedXml signedXml = new SignedXml(xmlDoc);//创建SignedXml对象
                signedXml.SigningKey = key;//设置密钥
                signedXml.SignedInfo.CanonicalizationMethod = "http://www.w3.org/2001/10/xml-exc-c14n#";
                signedXml.SignedInfo.SignatureMethod = @http://www.w3.org/2001/04/xmldsig-more#rsa-sha256;  //规范算法信息
                Reference reference = new Reference();//定义Reference元素
                reference.DigestMethod = @"http://www.w3.org/2001/04/xmlenc#sha256";//设置标识符
                reference.Uri = "";
                XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();//封装签名转换
                reference.AddTransform(env);
                signedXml.AddReference(reference);
                signedXml.ComputeSignature();//计算数字签名
    
                XmlElement xmlDigitalSignature = signedXml.GetXml();
                xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));//为xml添加签名信息
                xmlDoc.Save("lictemp.xml");
    .................................


                                                                                                                                                                                                                       转载与:b41k3r
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    指导单位

    江苏省公安厅

    江苏省通信管理局

    浙江省台州刑侦支队

    DEFCON GROUP 86025

    旗下站点

    邮箱系统

    应急响应中心

    红盟安全

    联系我们

    官方QQ群:112851260

    官方邮箱:security#ihonker.org(#改成@)

    官方核心成员

    Archiver|手机版|小黑屋| ( 苏ICP备2021031567号 )

    GMT+8, 2024-11-24 05:52 , Processed in 0.024344 second(s), 17 queries , Gzip On, MemCache On.

    Powered by ihonker.com

    Copyright © 2015-现在.

  • 返回顶部