首页
社区
课程
招聘
[原创]Hook Com接口函数
发表于: 2014-3-10 05:56 12917

[原创]Hook Com接口函数

2014-3-10 05:56
12917
【文章标题】:Hook Com接口函数
  【文章作者】:yhswwr(SilenceRet)
  【作者QQ】:3412259
  【编写语言】:C++
  【使用工具】:VS2008.VC++9
  【本文链接】:http://bbs.pediy.com/showthread.php?p=1266677
  【参考链接】:http://bbs.pediy.com/showthread.php?p=1266677
  【作者声明】:该贴仅供参考,失误之处请指教 转载请注名出处

DWORD* CHook::GetComProcAddrPointer( HMODULE hMod,LPCTSTR szClsGuid,LPCTSTR szDispatchGuid,LPCTSTR szFunctionName,LPSTR szErrMsg/*=NULL*/ )
{
	DWORD *pdwResult=NULL;

	USES_CONVERSION;
	CString strDispatchGuid(szDispatchGuid);

	//得到模块全路径
	CStringW strDllFilePathW;
	DWORD dwSize=::GetModuleFileNameW(hMod,strDllFilePathW.GetBuffer(1025),1024);
	strDllFilePathW.ReleaseBuffer(dwSize);

	//载入TypeLib
	ITypeLib *pLib;
	HRESULT ret=::LoadTypeLib(strDllFilePathW,&pLib);
	if (ret!=S_OK)
	{
		if(szErrMsg) strcpy(szErrMsg,"载入TypeLib失败");
		return pdwResult;
	}

	//得到接口函数偏移
	int nFunctionOffset=-1;

	int nTypeInfoCount=pLib->GetTypeInfoCount();
	for (int i=0;i<nTypeInfoCount;i++)
	{
		ITypeInfo *pTypeInfo;
		ret=pLib->GetTypeInfo(i,&pTypeInfo);

		TYPEATTR* pta;
		ret=pTypeInfo->GetTypeAttr(&pta);

		if (pta->typekind==TKIND_DISPATCH)
		{
			CString strGuid;
			strGuid.Format(_T("{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}"),
				pta->guid.Data1,pta->guid.Data2,pta->guid.Data3  
				,pta->guid.Data4[0],pta->guid.Data4[1],pta->guid.Data4[2],pta->guid.Data4[3],
				pta->guid.Data4[4],pta->guid.Data4[5],pta->guid.Data4[6],pta->guid.Data4[7]);
			
			if (strDispatchGuid.CompareNoCase(strGuid)==0)	//比较DispatchGuid
			{
				int nFunCount=pta->cFuncs;
				for (int j=0;j<nFunCount;j++)
				{
					FUNCDESC* pfd;
					pTypeInfo->GetFuncDesc(j, &pfd);

					BSTR bstrName;
					pTypeInfo->GetDocumentation(pfd->memid, &bstrName,NULL, NULL, NULL);
					pTypeInfo->ReleaseFuncDesc(pfd);
					CString strFunName(W2A(bstrName));
					if (strFunName.CompareNoCase(szFunctionName)==0)	//比较函数名
					{
						nFunctionOffset=j;
						break;
					}
				}
			}
		}
		pTypeInfo->ReleaseTypeAttr(pta);
		if (nFunctionOffset!=-1) break;
	}
	if (nFunctionOffset==-1)
	{
		if(szErrMsg) strcpy(szErrMsg,"查找接口函数失败");
		return pdwResult;
	}

	typedef int (WINAPI *DllGetClassObjectPtr)(REFCLSID, REFIID, LPVOID*);

	//得到DllGetClassObject函数地址
	DllGetClassObjectPtr pDllGetClassObject = (DllGetClassObjectPtr)GetProcAddress(hMod, "DllGetClassObject");

	CoInitialize(NULL);

	CLSID rclsid;
	IID riid;
	::CLSIDFromString(A2W(szClsGuid), &rclsid);//类ID
	::IIDFromString(A2W(szDispatchGuid), &riid);//接口ID

	IClassFactory *pICF = NULL;//类工厂接口指针
	
	if(pDllGetClassObject(rclsid, IID_IClassFactory, (void**)(&pICF))==S_OK)//获取类工厂接口指针
	{
		DWORD *pClassObject=NULL;
		if(pICF->CreateInstance(NULL, riid, (void**)&pClassObject)==S_OK)//创建COM对象	
		{
			pdwResult=(DWORD *)*pClassObject+nFunctionOffset;
		}else{
			if(szErrMsg) strcpy(szErrMsg,"创建COM对象失败");
		}
		pICF->Release();
	}else{
		if(szErrMsg) strcpy(szErrMsg,"获取类工厂接口指针失败");
	}
	
	CoUninitialize();
	return pdwResult;
}

DWORD CHook::HookComFunction( HMODULE hMod,LPCTSTR szClsGuid,LPCTSTR szDispatchGuid,LPCTSTR szFunctionName,DWORD dwNewFunAddr )
{
	CHAR szErrMsg[64]={0};
	DWORD *pAddress=GetComProcAddrPointer(hMod,szClsGuid,szDispatchGuid,szFunctionName,szErrMsg);
	if (!pAddress) MsgErrorAndExitProcess(szErrMsg);
	
	DWORD dwResult=*pAddress;
	
	DWORD dwTmp=dwNewFunAddr;
	CMemory::WriteMemory((DWORD)pAddress,(BYTE *)&dwTmp,4);
	return dwResult;
}


	//Hook 得到接口函数地址指针(模块,类GUID,接口GUID,函数名,失败返回的错误消息)返回值:接口函数地址指针
	static DWORD* GetComProcAddrPointer(HMODULE hMod,LPCTSTR szClsGuid,LPCTSTR szDispatchGuid,LPCTSTR szFunctionName,LPSTR szErrMsg=NULL);
	
	//Hook HookCom接口(模块,类GUID,接口GUID,函数名,新函数地址)返回值:原函数地址
	static DWORD HookComFunction(HMODULE hMod,LPCTSTR szClsGuid,LPCTSTR szDispatchGuid,LPCTSTR szFunctionName,DWORD dwNewFunAddr);


//调用
fnJieMi=(pfnJieMi)CHook::HookComFunction(hMod,"{11111111-2222-2222-2222-333333333333}","{66666666-7777-7777-7777-888888888888}","jiemi",(DWORD)JieMi);


仅供参考,代码从工程中扒出来的,CMemory::WriteMemory等相关需自己实现,我懒啊=,=

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 5
支持
分享
最新回复 (7)
雪    币: 8026
活跃值: (2511)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
COM一直不太懂
2014-3-10 08:09
0
雪    币: 64
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我都看不懂
2014-3-10 08:48
0
雪    币: 474
活跃值: (91)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
好强大,学习了!
2014-3-10 12:09
0
雪    币: 90
活跃值: (80)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
收藏了,正要需要弄com的东西
2014-3-13 11:57
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
真是太巧了,这几天遇到同样的问题,我先好好学习一下,感谢分享。
2014-3-24 15:51
0
雪    币: 264
活跃值: (85)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
mark,学习一下.....
2014-9-25 23:10
0
雪    币: 16
活跃值: (400)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
收藏起来慢慢看
2014-10-1 15:12
0
游客
登录 | 注册 方可回帖
返回
//