我们可以在dump中二次数据中写入模块的基本信息,再通过.enumtag读出二次数据,再解析数据内容
但是.enumtag只是显示了数据的内存,解析还需要我们另写工具,所以可以考虑通过扩展插件来实现以下功能:
1.读取指定guid的数据,并解析数据,再显示到windbg(demo只是演示了取出数据,并打印到windbg上)
2.枚举所有的guid,并显示出来
使用了以下函数:
HRESULT
IDebugDataSpaces3::ReadTagged(
IN LPGUID Tag,
IN ULONG Offset,
OUT OPTIONAL PVOID Buffer,
IN ULONG BufferSize,
OUT OPTIONAL PULONG TotalSize
);
读取指定GUID中的数据
HRESULT
IDebugDataSpaces3::StartEnumTagged(
OUT PULONG64 Handle
);
注意,仅IDebugDataSpaces3支持,不要写错!
HRESULT
IDebugDataSpaces3::GetNextTagged(
IN ULONG64 Handle,
OUT LPGUID Tag,
OUT PULONG Size
);
Handle为StartEnumTagged传入,返回GUID和大小,S_OK 表示获取成功:
示例代码:
HRESULT CALLBACK hgytest(PDEBUG_CLIENT pDebugClient, PCSTR args)
{
UNREFERENCED_PARAMETER(args);
IDebugDataSpaces3* pDataSpaces = NULL;//注意只有3支持
if (SUCCEEDED(pDebugClient->QueryInterface(__uuidof(IDebugDataSpaces3), (void **)&pDataSpaces)))
{
// 查询指定GUID
GUID MyGuid = {0};
CHAR* RawData = new CHAR[4096];//分配4096大小来取
memset(RawData, 0x00, 4096);
ULONG ulSize = 0;//实际大小
IDebugControl* pDebugControl = NULL;
if (SUCCEEDED(pDataSpaces->ReadTagged(&MyGuid, 0, RawData, 4096, &ulSize)))
{
if (SUCCEEDED(pDebugClient->QueryInterface(__uuidof(IDebugControl4), (void **)&pDebugControl)))
{
char szSize[50] = {0};
sprintf(szSize, "%d-size for hgy", ulSize);
PrintHexDump(szSize, NULL, RawData, ulSize,pDebugControl);
pDebugControl->Release();
pDebugControl = NULL;
}
}
delete[] RawData;
RawData = NULL;
// 枚举GUID
ULONG64 handle = NULL;
if (SUCCEEDED(pDataSpaces->StartEnumTagged(&handle)))
{
if (SUCCEEDED(pDebugClient->QueryInterface(__uuidof(IDebugControl4), (void **)&pDebugControl)))
{
GUID tagGUID = {0};
ULONG szDataSize = 0;
while (S_OK == pDataSpaces->GetNextTagged(handle, &tagGUID, &szDataSize))//注意,这里使用S_OK
{
CHAR szBuf[MAX_PATH] = {0};
sprintf(szBuf, "GUID:{%08X-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X},size:0x%08x\n",
tagGUID.Data1,tagGUID.Data2,tagGUID.Data3,tagGUID.Data4[0],
tagGUID.Data4[1],tagGUID.Data4[2],tagGUID.Data4[3], tagGUID.Data4[4],
tagGUID.Data4[5],tagGUID.Data4[6],tagGUID.Data4[7],szDataSize);
pDebugControl->Output(DEBUG_OUTPUT_NORMAL, szBuf);//输出到windbg
}
pDebugControl->Release();
pDebugControl = NULL;
pDataSpaces->EndEnumTagged(handle);
}
}
pDataSpaces->Release();
}
return S_OK;
}
示例图:(前面打 印内存,后面打印所有的GUID)