终于搞清楚Manifest 的解压问题了

终于搞清楚Manifest的解压问题了

20151213

19:47

Manifest的解压缩问题,今天终于搞清楚了。

1、它也是增量压缩;

2、源文件很特别,包含在 wcp.dll中,是固定的一段文本,可以称为模板。

Win10 x86版本为例,模板在0x0027bea0处,长度0x236a

 

intReadManifestTemplate()

{

char temp[0x236a];

 

WCHAR* inFilename =L"C:\\ServicingStack-10\\x86\\wcp.dll";

ifstream fin(inFilename,ios::binary);

fin.seekg(0x0027bea0);

fin.read(temp, 0x236a);

 

WCHAR* filename =L"C:\\ServicingStack-10\\Manifest.template"; 

ofstream fout(filename, ios::binary);

fout.write(temp, 0x236a);

fout.close();

return 0;

}


 

为了方便使用,可以把这部分提取出来,单独保存为一个文件;

3、后面的解压缩就与正常的增量压缩一样了。


本来,wcp.dll 中就有 DecompressManifest 的函数,只是由于能力有限,调用函数的企图没有成功,在最后一步,释放内存时出错。

还要再努力。


 可能是由于在调试模式下,系统会创建有关跟踪的类,而在发行模式下,就没有这样的类,我们的程序是在中途插入的,未能对有关跟踪的类进行必要的初始化,因此,在调试模式下,是会释放相关的内存空间,但是,却没有创建,故程序出错,而在发行模式下,不需要这样的跟踪类,故程序可以正常运行。

下面的程序可能是用于创建的函数:

void sub_1012A554()
{
  int v0; // ecx@2
  int v1; // eax@2
  int v2; // edi@3
  void (__thiscall *v3)(_DWORD, _DWORD); // esi@7
  void (__thiscall *v4)(_DWORD, _DWORD); // esi@7
  char v5; // [sp+Ch] [bp-14h]@13
  PVOID DllImageBase; // [sp+10h] [bp-10h]@9
  __int16 v7; // [sp+14h] [bp-Ch]@2
  int v8; // [sp+18h] [bp-8h]@6

  if ( !dword_1027D5A4 )
  {
    sub_1008FED7((int)&v7);
    sub_1012A39C(&Name, v0);
    v1 = (int)RtlAllocateHeap(*(HANDLE *)(__readfsdword(48) + 24), 0, 0x834u);
    if ( v1 )
      v2 = sub_1012A3B0(v1);
    else
      v2 = 0;
    if ( !v2 )
      goto LABEL_14;
    sub_1012A490(v2, (PWSTR)(v7 != 0 ? v8 : 0));
    if ( _InterlockedCompareExchange((volatile signed __int32 *)&dword_1027D5A4, v2, 0) )
    {
      v3 = *(void (__thiscall **)(_DWORD, _DWORD))(*(_DWORD *)v2 + 224);
      __guard_check_icall_fptr(*(_DWORD *)(*(_DWORD *)v2 + 224));
      v3(v2, 0);
      v4 = *(void (__thiscall **)(_DWORD, _DWORD))(*(_DWORD *)v2 + 224);
      __guard_check_icall_fptr(*(_DWORD *)(*(_DWORD *)v2 + 224));
      v4(v2, 1);
    }
    if ( !ModuleImageBase )
    {
      DllImageBase = 0;
      if ( LdrGetDllHandle(0, 0, &dword_10012D0C, &DllImageBase) < 0
        || LdrLoadDll(0, 0, &dword_10012D0C, &DllImageBase) < 0 )
        goto LABEL_14;
      if ( _InterlockedCompareExchange((volatile signed __int32 *)&ModuleImageBase, (signed __int32)DllImageBase, 0) )
        LdrUnloadDll(DllImageBase);
    }
    _InterlockedOr((volatile signed __int32 *)&v5, 0);
    LdrGetProcedureAddress(ModuleImageBase, &stru_10012D1C, 0, &ProcedureAddress);
LABEL_14:
    sub_1008FF20(&v7);
  }
}

是否如此,尚需验证。

可能也不是这个原因,发现了这样一个目录和文件,C:\BVTBin\Tests\installpackage\csilogfile.log,用于保存 CBS 的日志。要想起作用,必须先创建目录和文件。

一查,网也有好多人在说。

http://bbs.pcbeta.com/viewthread-838238-1-1.html

崩溃的原因可能还是由于调试模式与发行模式下堆的管理方式不同。

http://blog.csdn.net/zhengxh/article/details/6910548


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值