1.windbg script-.enumtag扩展插件

我们可以在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)


windbgengine2






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值