首页
社区
课程
招聘
[原创]用VC SDK实现的ICopyHook和IShellExecuteHook接口
发表于: 2013-1-17 14:34 19665

[原创]用VC SDK实现的ICopyHook和IShellExecuteHook接口

2013-1-17 14:34
19665

反正代码不多,就直接贴出来算了,有不对的大家请多多指教
该程序是个Shell扩展,使用regsvr32注册,使用regsvr32 /u取消注册
ICopyHook就是监视目录复制的,IShellExecuteHook就是监视程序执行,在这个程序里面我把他们两个都实现了

/********************CopyHook.def********************/

LIBRARY "CopyHook.dll"
EXPORTS
	DllGetClassObject PRIVATE
	DllRegisterServer PRIVATE
	DllUnregisterServer PRIVATE
	DllCanUnloadNow PRIVATE
#include <Windows.h>
#include <Stdio.h>
#include <Tchar.h>
#include <Shlobj.h>
#include <InitGuid.h>

#include "ShellHook.h"
#include "ShellHookFactory.h"

HMODULE 		g_hinst;
ULONG			g_lLockNumber;
ULONG			g_lRefThisDll;

HRESULT ClsidToString(REFCLSID clsid, LPTSTR lpszClsid, int cchClsid)
{
	HRESULT				result;
	LPWSTR				lpszStr;

	if((result = StringFromCLSID(clsid, &lpszStr)) == S_OK)
	{
#ifdef UNICODE
		lstrcpyn(lpszClsid, lpszStr, cchClsid);
#else
		WideCharToMultiByte(CP_OEMCP, 0, lpszStr, -1, lpszClsid, cchClsid, 0, 0);
#endif

		CoTaskMemFree(lpszStr);	
	}

	return result;
}

HRESULT RegisterClsid(LPTSTR lpszClsid, LPTSTR lpszModule)
{
	HKEY				hKey;
	HKEY				hSubKey;
	TCHAR				szSubKey[1024];
	TCHAR				szModel[] = _T("Apartment");
	LSTATUS				status;
	
	lstrcpy(szSubKey, _T("CLSID\\"));
	lstrcat(szSubKey, lpszClsid);
	status = RegCreateKey(HKEY_CLASSES_ROOT, szSubKey, &hKey);
	if(status == ERROR_SUCCESS)
	{
		status = RegCreateKey(hKey, _T("InProcServer32"), &hSubKey);
		if(status == ERROR_SUCCESS)
		{
			RegSetValue(hSubKey, NULL, REG_SZ, lpszModule, 0);
			RegSetValueEx(hSubKey, _T("ThreadingModel"), 0, REG_SZ, (BYTE*)szModel, sizeof(szModel));
			RegCloseKey(hSubKey);
		}
		RegCloseKey(hKey);
	}

	return HRESULT_FROM_WIN32(status);
}

HRESULT UnRegisterClsid(LPTSTR lpszClsid)
{
	TCHAR				szSubKey[1024];
	LSTATUS				status;
	
	lstrcpy(szSubKey, _T("CLSID\\"));
	lstrcat(szSubKey, lpszClsid);
	lstrcat(szSubKey, _T("\\InProcServer32"));
	status = RegDeleteKey(HKEY_CLASSES_ROOT, szSubKey);

	lstrcpy(szSubKey, _T("CLSID\\"));
	lstrcat(szSubKey, lpszClsid);
	status = RegDeleteKey(HKEY_CLASSES_ROOT, szSubKey);

	return HRESULT_FROM_WIN32(status);
}

STDAPI DllGetClassObject (const CLSID &rclsid, const IID &riid, void **ppv)
{
	if (rclsid == CLSID_MyShellHook) 
	{		
		CMyShellHookFactory *pFactory = new CMyShellHookFactory;

		if (pFactory == NULL)
			return E_OUTOFMEMORY ;
		
		return pFactory->QueryInterface(riid, ppv);
	}

	return CLASS_E_CLASSNOTAVAILABLE;
}

STDAPI DllCanUnloadNow (void)
{
	if (g_lRefThisDll == 0 && g_lLockNumber == 0)
		return S_OK;
	else
		return S_FALSE;
}

STDAPI DllRegisterServer ()
{
	TCHAR				szClsid[64];
	TCHAR				szModule[MAX_PATH];
	HKEY				hKey;
	
	ClsidToString(CLSID_MyShellHook, szClsid, 64);
		
	if(RegCreateKey(HKEY_CLASSES_ROOT, _T("Directory\\shellex\\CopyHookHandlers\\zCopyHook"), &hKey) == ERROR_SUCCESS)
	{
		RegSetValue(hKey, NULL, REG_SZ, szClsid, 0);
		RegCloseKey(hKey);		
	}	
	if(RegOpenKey(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ShellExecuteHooks"), &hKey) == ERROR_SUCCESS)
	{
		RegSetValueEx(hKey, szClsid, 0, REG_SZ, NULL, 0);
		RegCloseKey(hKey);		
	}
	if(RegOpenKey(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer"), &hKey) == ERROR_SUCCESS)
	{
		DWORD		dwVal = 1;
		RegSetValueEx(hKey, _T("EnableShellExecuteHooks"), 0, REG_DWORD, (LPBYTE)&dwVal, sizeof(DWORD));
		RegCloseKey(hKey);		
	}
	
	GetModuleFileName(g_hinst, szModule, MAX_PATH);
	return RegisterClsid(szClsid, szModule);
}

STDAPI DllUnregisterServer ()
{
	TCHAR				szClsid[64];
	HKEY				hKey;
	
	ClsidToString(CLSID_MyShellHook, szClsid, 64);

	RegDeleteKey(HKEY_CLASSES_ROOT, _T("Directory\\shellex\\CopyHookHandlers\\zCopyHook"));
	if(RegOpenKey(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ShellExecuteHooks"), &hKey) == ERROR_SUCCESS)
	{
		RegDeleteValue(hKey, szClsid);
		RegCloseKey(hKey);		
	}
	if(RegOpenKey(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer"), &hKey) == ERROR_SUCCESS)
	{
		RegDeleteValue(hKey, _T("EnableShellExecuteHooks"));
		RegCloseKey(hKey);		
	}

	return UnRegisterClsid(szClsid);
}

BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
	switch(fdwReason)
	{
	case DLL_PROCESS_ATTACH://加载dll;
		{
			g_hinst = hinstDLL;
			
		}
		break;
	case DLL_PROCESS_DETACH://释放dll
		{
		}
		break;
	case DLL_THREAD_ATTACH://新建线程
		{
		}
		break;
	case DLL_THREAD_DETACH://线程退出
		{
		}
		break;
	}

	return TRUE;
}


class CMyShellHookFactory : public IClassFactory
{
public:
	CMyShellHookFactory();
	~CMyShellHookFactory();
	
	HRESULT STDMETHODCALLTYPE QueryInterface (REFIID iid, void **ppvObject);
	ULONG STDMETHODCALLTYPE AddRef ();
	ULONG STDMETHODCALLTYPE Release ();

	HRESULT STDMETHODCALLTYPE CreateInstance (IUnknown *pUnkOuter, REFIID riid, void **ppvObject);
	HRESULT STDMETHODCALLTYPE LockServer (BOOL fLock);
private:
	ULONG			m_lRefCount;
};


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 8
支持
分享
最新回复 (15)
雪    币: 305
活跃值: (66)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
如果是文件监控的话 ReadDirectoryChangesW 也不错
2013-1-17 23:44
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
第一次看到用sdk做这个,试着新建一个工程,结果发现编译出来的怎么都不对,导出函数都看不到.
我不知道哪里做错了,楼主能把工程也打个包上来不?
2013-1-18 01:28
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
早上又试了下,原来是def文件没设置对,只是简单的添加def文件是不行的,还得在工程设置里指定这个def文件.
附上可编译的工程
上传的附件:
2013-1-18 10:13
0
雪    币: 123
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢分享,学习了,同样喜欢SDK
2013-1-27 13:34
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
thanks..........
2013-1-28 13:08
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
ICopyHook这个接口是干嘛用的?资源管理器会加载到?
2013-1-28 17:01
0
雪    币: 778
活跃值: (208)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
8
嗯,就是监视目录复制的
2013-4-11 15:36
0
雪    币: 33
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
9
前端时间还有人利用这个注入EXP添加启动呢!
2013-4-12 10:47
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
楼主是用vs2010建的工程,我用vs2008新建工程编译后,出现如下错误:
error C2504: “IShellExecuteHook”: 未定义基类
error C2061: 语法错误 : 标识符“LPSHELLEXECUTEINFO”
有人知道为什么吗
2013-8-20 09:00
0
雪    币: 745
活跃值: (3823)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
感谢分享!
2014-4-28 14:40
0
雪    币: 745
活跃值: (3823)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
32位 Win7 SP1为什么没效果呢
2014-4-28 14:54
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
楼主,为什么我注册了你的dll,文件夹复制没有反应的(已重启explorer.exe,电脑也重启过,确认注册信息已写到注册表中);请告知如何操作(或者是我忘记了哪些操作)才会使文件复制弹出提示对话框,感激不尽!
2017-7-1 15:08
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
下面的问题,是MS的一个BUG。可以手工修改ShlObj.h文件,在“#include  <shobjidl.h>”后面加一行“#include  <shellapi.h>”
  “IShellExecuteHook”:  未定义基类
2017-9-7 16:20
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
没有反应的,建议注意一下32位和64位。软件在不同的OS里运行要编译不同的版本
2017-9-7 17:08
0
雪    币: 5
活跃值: (637)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
为什么只能拦截到少数操作,比如打开任务管理器,等。我想在用户双击一个文件时进行拦截,这个接口也办不到啊
2023-3-29 21:44
0
游客
登录 | 注册 方可回帖
返回
//