组件名的生成终于解决了
这个问题的解决,也标志着这一类问题的解决。
大体的过程是这样的:
找到初始化接口的程序,在虚函数表中找到所需要的函数入口,分别执行,就能得到所要的结果了。
// 运行 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)中可知,一次会生成三个散列值。
标志位只用到到了低四位,从高到低,分别是:4、3、2、1
第一位对应第一个散列值,第一位为 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