问题 如何从Publisher计算PublisherID?


我想了解一下Windows Store和APPX包的内部情况。 package.appxmanifest有一个 <Identity> 例如,具有包名称,发布者和版本属性的元素

<Identity
    Name="MyCompany.MyGreatApp"
    Publisher="CN=B408A06D-44F7-4860-A12E-644DD44FA743"
    Version="1.0.0.3" />

显然,当我在VS2013中打开此清单并转到Packaging选项卡时,它会显示一个只读的“Package Family Name”字段,它是包名称,下划线和看起来像的串联 发布者字符串的奇怪哈希

MyCompany.MyGreatApp_f08ys7xx9zb3y

我该如何计算这个哈希值(也称为 的publisherId)?也可以看看 PackageId类 要么 PACKAGE_ID结构

以下是您渴望密码分析师的一些示例值。它是13个小写字母和数字,因此近似“质量”是67位。谢谢!

8wekyb3d8bbwe   CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
amge560j0aq9g   CN=C357A519-CEE3-4675-9EF4-44DE1D99A5D6
a2xxwqz7shah6   CN=07AACB4D-E1D7-4606-AF0F-77713A7C52F6
cw5n1h2txyewy   CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
54ggd3ev8bvz6   CN=2180B9A4-DDFD-4BFD-8D7E-EADC9C394EF5
azstdzfk4mfqj   CN=246910D1-A42D-4A04-8CF1-0C2A5CD42D4D
rxzpp8adhbvh8   CN=7882B094-0135-443F-8362-164AA239F2A0
pwh22gvzcj20c   CN=9C2E3884-8027-4E71-97C7-BB7731A649A4
q4d96b2w5wcc2   CN=DCD4AC3C-C7E0-46FF-8387-51FDC8CBC467
r6rtpscs7gwyg   CN=54157592-46DE-47CD-AF04-3B89DE46E29B
8xx8rvfyw5nnt   CN=6E08453F-9BA7-4311-999C-D22FBA2FB1B8
kzf8qxf38zg5c   CN=Skype Software Sarl, O=Microsoft Corporation, L=Luxembourg, S=Luxembourg, C=LU
a76a11dkgb644   CN=40886CD1-D5C5-48D6-B914-AB6E72010FFC
6bhtb546zcxnj   CN=BBC567E9-A52C-43A3-A890-F8B17D68310E
46hhcags7zat8   CN=ABF01D82-FF53-447D-B7E8-61B6F2105F68

pd2za7f9waemw   CN=B408A06D-44F7-4860-A12E-644DD44FA740
h0ed56e8a88dc   CN=B408A06D-44F7-4860-A12E-644DD44FA741
wcvtzcf7freyj   CN=B408A06D-44F7-4860-A12E-644DD44FA742
f08ys7xx9zb3y   CN=B408A06D-44F7-4860-A12E-644DD44FA743
85zvc56jp30ec   CN=C408A06D-44F7-4860-A12E-644DD44FA743
x4nmjqajw9mv6   CN=D408A06D-44F7-4860-A12E-644DD44FA743
qrhphajnj16d4   CN=E408A06D-44F7-4860-A12E-644DD44FA743

9879
2018-02-05 04:10


起源

我可能完全没有了,但我也注意到上面的样本哈希中缺少字母I,L,O和U.这将使我们达到(10 + 22)个可能的值(5位);时间13总共为65位。所以我们可能会从普通的MD5,SHA1或其他东西看到奇怪编码的65位。我假设这个PublisherID哈希值的实现并不完全疯狂。 - Tomas Karban


答案:


我猜测PublisherId值的构造方式非常接近。我听到一些窃窃私语......

价值是 克罗克福德的Base32 编码的前八个字节 SHA-256 发布者字符串的哈希值 UTF-16 (小端)。我有一个很好的实现,我使用我的问题中的示例值验证。


9
2018-02-14 09:16



你可以发布实施吗?我很乐意看到它并与我正在写的那个相比。 - David
@Tomas Karban我也想看看你的实施 - Gorgsenegger


或者您只需使用Kernel32.dll方法PackageFamilyNameFromId:

private static string GetPackageFamilyName(string name, string publisherId)
{
  string packageFamilyName = null;
  PACKAGE_ID packageId = new PACKAGE_ID
  {
    name = name,
    publisher = publisherId
  };
  uint packageFamilyNameLength = 0;
  //First get the length of the Package Name -> Pass NULL as Output Buffer
  if (PackageFamilyNameFromId(packageId, ref packageFamilyNameLength, null) == 122) //ERROR_INSUFFICIENT_BUFFER
  {
    StringBuilder packageFamilyNameBuilder = new StringBuilder((int)packageFamilyNameLength);
    if (PackageFamilyNameFromId(packageId, ref packageFamilyNameLength, packageFamilyNameBuilder) == 0)
    {
      packageFamilyName = packageFamilyNameBuilder.ToString();
    }
  }
  return packageFamilyName;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 4)]
private class PACKAGE_ID
{
  public uint reserved;
  public uint processorArchitecture;
  public ulong version;
  public string name;
  public string publisher;
  public string resourceId;
  public string publisherId;
}


[DllImport("kernel32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
private static extern uint PackageFamilyNameFromId(PACKAGE_ID packageId, ref uint packageFamilyNameLength, StringBuilder packageFamilyName);

public static void TestMethod()
{
  GetPackageFamilyName("MyCompany.TestApp", "CN=YourPublisherId");
}

2
2018-02-15 11:26