ole32!OleConvertOLESTREAMToIStorage实际数据可能是0x0A6A5B88开头这里,格式在[MS-OLEDS]里有提到。
而且里面的对象并不能保证都是CFB文件(D0CF11E0开头)。
例如之前比较常见的,文件里嵌一个Package释放到临时目录,再用FileMoniker去调起文件的方法,Package的数据头就是02XXXXXX。
之前我是用WinDbg自动提取这个对象的数据的,记录的内容是这样的:
------
用WinDbg附加到WINWORD.exe,然后执行下面的命令(需要在C盘根目录下建立一个名为MemoryDump的文件夹)。
.symopt +0x100; r $t0 = 0; bc *; bu ole32!OleConvertOLESTREAMToIStorage; g; .while (1) { aS /c ${/v:filename} .printf "C:\\MemoryDump\\Dump_%i.OLEObject", $t0; .block { .writemem ${filename} poi(poi(poi(esp+4)+8)) L dwo(poi(esp+4)+c) }; al; ad *; r $t0 = $t0 + 1; g; }
详细解释
.symopt +0x100; 关闭不必要的符号加载 否则可能会把输出的错误信息写到aS定义的别名里
r $t0 = 0; 使用寄存器t0作为计数器
bc *; 清除所有断点
bu ole32!OleConvertOLESTREAMToIStorage; 对OleConvertOLESTREAMToIStorage下延迟的符号断点
g; 恢复执行
.while (1)
{
aS /c ${/v:filename} .printf "C:\\MemoryDump\\Dump_%i.OLEObject", $t0; 定义一个别名filename, 值为要写入的文件路径
.block { .writemem ${filename} poi(poi(poi(esp+4)+8)) L dwo(poi(esp+4)+c) }; 将OLE对象的内容写入到文件
al; 显示别名(调试用)
ad *; 清除别名
r $t0 = $t0 + 1; 计数器加1
g; 恢复执行
}
写入到文件的内容为OLEObject结构,在[MS-OLEDS]里有详细的定义。下面是一个简单的说明。
该结构的头部定义如
- offset - 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
0x00000000 0105 0000 0200 0000 1800 0000 4d73 786d ............Msxm
0x00000010 6c32 2e53 4158 584d 4c52 6561 6465 722e l2.SAXXMLReader.
0x00000020 362e 3000 0000 0000 0000 0000 0006 0000 6.0.............
第一个DWORD是OLEVersion,即OLE对象的版本号,通常为01050000。
第二个DWORD是ObjectType,即OLE对象的类型。
01表示LinkedObject(链接对象),02表示EmbeddedObject(嵌入对象),大多数情况是02。
接下来是3个LengthPrefixedAnsiString结构。
这个结构首先用一个DWORD用于表示后面的字符串长度,随后是一个该长度的以\0结尾的字符串。如果长度为0,则后面的字符串不存在。
第一个LengthPrefixedAnsiString结构是ClassName,用于描述对象的类别。
当ObjectType为02时,后两个LengthPrefixedAnsiString结构的字符串长度均为0。
如果ObjectType为02,在这3个LengthPrefixedAnsiString结构的数据就是OLE对象的实际数据(NativeData)了。
NativeData以一个DWORD开头(数据长度,设为length),随后的length个字节是数据(如果这个数据是02开头,通常是Package,如果是D0CF11E0就是复合文件结构了)。
------
对应到图里的内容的话,就是这样的:
0x0A6A5B88:
EA930B52 | 可能是修改过的OLE头, 一般来说这个值是01050000
02000000 | 0x02, EmbeddedObject
10000000 | 第一个LengthPrefixedAnsiString, 0x10, 随后的0x10个字节是一个以00结尾的ANSI字符串
34344A55 664C6D79 5A493858 48586300 |
00000000 | 第二个LengthPrefixedAnsiString
00000000 | 第三个LengthPrefixedAnsiString
00100000 | NativeData的大小, 0x1000(4KB)
D0CF11E0 A1B11AE1 ... | NativeData
最后于 2023-5-29 09:36
被ranni0225编辑
,原因: 格式修改