组件名的生成终于解决了

组件名的生成终于解决了

 

这个问题的解决,也标志着这一类问题的解决。

大体的过程是这样的:

找到初始化接口的程序,在虚函数表中找到所需要的函数入口,分别执行,就能得到所要的结果了。

 

// 运行 RtlGetSystem得到 IRtlSystemIsolationLayerTearoff接口的地址,不需要输入参数

IRtlSystemIsolationLayerTearoff  *pSystem = NULL;

RtlGetSystem(0, NULL, &pSystem);

 

LPWSTRpszPathIn = L"C:\\amd64_microsoft-windows-w..oyment-languagepack_31bf3856ad364e35_6.3.9600.16384_zh-cn_e3e124965f8d9d70.manifest";

IRtlDefinitionIdentity* idi = NULL;

// 运行 GetManifestId得到 IRtlDefinitionIdentity接口的地址,输入参数为 RtlGetSystem的输出和文件路径

GetManifestId(pSystem, pszPathIn, &idi);

 

 

// IRtlDefinitionIdentity接口的地址后退四全字段,得到 CRtlDefinitionIdentity 的地址

CRtlDefinitionIdentity* di = (CRtlDefinitionIdentity*)(*(UINT_PTR*)&idi - 4*sizeof(UINT_PTR));

// ICRtlDefinitionIdentity这是 CRtlDefinitionIdentity类提供的虚函数表

ICRtlDefinitionIdentity* vft;

vft = (ICRtlDefinitionIdentity*)&di->vft1;

 

PLUNICODE_STRINGs = newLUNICODE_STRING();

// 比较怪的是,结果字符串要先初始化出一定的空间,太小了还不行。比如:200,也能运行,但有出错提示,400 就好了。

RtlAllocateLUnicodeString(400, s);

// 调用类函数,得到

vft->GenerateKeyFormIntoBuffer(1, s);

 

GeneratePseudoKeys( &a1, &a2, &a3)中可知,一次会生成三个散列值。

标志位只用到到了低四位,从高到低,分别是:4321

第一位对应第一个散列值,第一位为 1 时输出;但是,如果第一位为 0,而第二位也为 0 时,同样能输出第一个散列值。

if ( v11 // 第二位
{
  v29 =v37;
}
else
// 不是第一位,也是第一位

  v29 =(Windows::WCP::Implementation::Rtl *)v41;
  if (v33 // 第三位
    v29 =(Windows::WCP::Implementation::Rtl *)v35;
}

第二位对应第二个散列值,只要第二位为 1 就输出,不管第一位的值。

第三位比较特别,在外层就限制了不能为 1,否则就出错;而从内层看,是可以为 1 的,应该就是对应 GeneratePseudoKeys( &a1, &a2, &a3)第三个散列值。

if ( a2 &0xFFFFFFF4 )
  goto 参数错误处理;
第四位为 0,表示字符串为LHFormat,LH 可能是 LongHorn 的缩写,表示从 Vista 开始的版本;为 1,表示字符串为XPFormat,这就没啥好说的了。

 

int__thiscall CRtlIdentityBase::GenerateKeyFormIntoBuffer(CRtlIdentityBase*this, unsigned __int32a2, struct _LUNICODE_STRING *a3)
{

  v3 =this;
  v4 =0;
  v10 =this;
  v15 =C00000E5;
  if (a3 )
    *(_DWORD *)a3 = 0;
  if (a2 & 0xFFFFFFF4)
    goto LABEL_32;
  if (!a3 )
  {
    // a3 不能为空

  }
  if
(!RtlIsLUnicodeStringValid((int)a3) )
  {
LABEL_32:
    CBaseFrame<CVoidRaiseFrame>::SetInvalidParameter_NullPointer(&v15);
    v13 =v5;
    v14 =v6;
    goto LABEL_8;
  }
  if
(a2 & 8)  // 第四位为 1
  {
    if
(a2 & 1)
      v4 =1;
    if (a2 & 2)
      v4 |=2u;
    if (a2 & 4)
      v4 |=4u;
    v8 =*(int(__thiscall **)(CRtlIdentityBase *))(*(_DWORD *)v3 + 80);
    __guard_check_icall_fptr(v8);
    if ((unsigned __int8)v8(v10) )
      v4 |=8u;

// 生成 XP 格式的散列值
    result =CRtlIdentityBase::GenerateKeyFormIntoBuffer_XPFormat(v10,v4, a3);
  }
  else  
// 第四位为 0
  {
    if
(a2 & 1)
      v4 =1;
    if (a2 & 2)
      v4 |=2u;
    if (a2 & 4)
      v4 |=4u;
    v9 =*(int(__thiscall **)(CRtlIdentityBase *))(*(_DWORD *)v3 + 80);
    __guard_check_icall_fptr(v9);
    if ((unsigned __int8)v9(v10) )
      v4 |=8u;
// 生成 LH 格式的散列值
    result =CRtlIdentityBase::GenerateKeyFormIntoBuffer_LHFormat(v10,v4, a3);
  }
  if
(result >= 0)
    result =0;
  return result;
}

 

下面是不同标志值时的输出结果:

0 1
0x00ff3d78 {Length=0x000000ca MaximumLength=0x00000190 Buffer=0x00fef630L"
amd64_microsoft-windows-w..oyment-languagepack_31bf3856ad364e35_6.3.9600.16384_zh-cn_e3e124965f8d9d70
2 3
0x00d33cd0 {Length=0x000000ac MaximumLength=0x00000190 Buffer=0x00d2f630L"
amd64_microsoft-windows-w..oyment-languagepack_31bf3856ad364e35_zh-cn_f593f441a3428c44


4 5 6 7 12 13 14 15
(F) base\wcp\identity\id_baseidentity.cpp(822):
 Error STATUS_INVALID_PARAMETERoriginated in function
CRtlIdentityBase::GenerateKeyFormIntoBuffer expression:
Valid flags check failed: Flags

8
0x01003aa0 {Length=0x000000e8 MaximumLength=0x00000190 Buffer=0x00fff630L"
amd64_Microsoft-Windows-WinMDE-Package-avcore-deployment-LanguagePack_31bf3856ad364e35_6.3.9600.16384_zh-cn_a9ec947a

9 11
(F) base\wcp\identity\id_baseidentity.cpp(498):
 Error STATUS_NOT_IMPLEMENTED originatedin function
Windows::Identity::Rtl::Implementation::CRtlIdentityBase::GenerateKeyFormIntoBuffer_XPFormatexpression:
(Flags & (GenerateKeyFormIntoBuffer_XPFormat_Flags::WILDCARD_MISSING_ATTRIBUTES|
GenerateKeyFormIntoBuffer_XPFormat_Flags::IGNORE_SERVICING)) == 0

10
0x00bd39c0 {Length=0x000000ca MaximumLength=0x00000190 Buffer=0x00bcf630L"
amd64_Microsoft-Windows-WinMDE-Package-avcore-deployment-LanguagePack_31bf3856ad364e35_zh-cn_f059e3fc


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值