终于搞清楚Manifest 的解压问题了
来源:互联网 发布:d3.js tree demo 编辑:程序博客网 时间:2024/04/28 02:18
终于搞清楚Manifest的解压问题了
2015年12月13日
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
- 终于搞清楚Manifest 的解压问题了
- AT89S5X的ISP电缆终于搞清楚了
- 终于搞清楚了Jsp跟Servlet的关系了。
- 终于搞清楚java的序列化是干嘛的了。。
- 终于搞清楚了如何做非表格的导航条
- 终于搞清楚My Eclipse 和Eclipse的关系了
- 新建一个QT工程的详细步骤,终于搞清楚了!
- 终于搞清楚了JAX-RPC是什么
- 终于搞清楚了ADO数据库连接中的Persist Security Info参数的作用
- 困惑了好几年,今天终于搞清楚:浮动层的相对定位
- background-position 用法,终于搞清楚了,转来的保留下
- 终于搞清楚了C#二进制的一些关键操作了,解决了微软面试题,求数组中两两之差绝对值最小的值O(N)最少内存限制的问题!
- 再谈互斥锁与条件变量!(终于搞清楚了啊!!!!!)
- ftp安装和虚拟用户创建(终于搞清楚了)
- 再谈互斥锁与条件变量!(终于搞清楚了啊!!!!!)
- 我终于搞清楚为什么MobileTrack获取到的联通3G基站与大家手头的基站表不同了
- 终于搞清楚字符串内的\0用法啦,好开心
- 今天搞清楚了java连接db2的问题,jdbc的解决方案
- 扶了我一把的人,这辈子不能忘!
- HDU 1074 Doing Homework DP 状态压缩
- poj-1581
- 解决office 2007中的document imaging软件的OCR识别出错问题
- 方法很重要
- 终于搞清楚Manifest 的解压问题了
- HDU 1548 A strange lift
- relatedTarget与fromElement、toElement元素
- HDU 1505 求最大子矩阵(二维)
- Eclipse 使用
- "XXX"不扩展类"System.Web.UI.Page",因此此处不允许
- STM32之GPIO的使用
- poj_3006
- ubuntu source list