主题:用HOOK实现禁止复制文件?
p2006
[专家分:0] 发布于 2006-09-18 23:02:00
用VC下HOOK方法,实现禁止复制文件的功能,求各位大哥大姐给点这方面的资料或是源码供参考,万分感谢!!!
回复列表 (共7个回复)
沙发
tianyuan001 [专家分:6740] 发布于 2006-09-18 23:10:00
没听说过 HOOK 有这个功能
板凳
aaronwang [专家分:16870] 发布于 2006-09-19 08:48:00
API HOOK,
HOOK CopyFile(Ex)和CreateFile发现要保护的文件直接返回错误应该就可以了.
3 楼
p2006 [专家分:0] 发布于 2006-09-19 23:50:00
楼上的大哥或哪位知道的麻烦告诉我这个程序(DLL)大概的流程(哪步用什么函数)?
钩子是怎么设置的?这个程序中SetWindowsHookEx函数的四个参数如何设置?要不要像挂接某个进程中一个DLL中的某个函数那样改变函数的地址实现?
kernel32.dll中CopyFile函数到底是怎么被挂接的?
我现在都搞糊涂了,求求大家帮忙!!!
4 楼
aaronwang [专家分:16870] 发布于 2006-09-20 00:07:00
搜一下API HOOK的资料就有了.或者搜索屏幕取词(也是通过API HOOK来实现的)的资料.
没写好的话很容易出错.而且是系统性的错误.
5 楼
p2006 [专家分:0] 发布于 2006-09-21 23:53:00
我看过《windows核心编程》里hook的例子,例子程序有一个主要实现ReplaceIATEntryInOneMod的CAPIHook类,请问我的这个程序有必要去替换函数地址吗?
大家教教我具体怎么实现啊?我必须赶紧完成这个程序了!
下面是插入和替换函数的程序,我修改了一下没成功,哪位高手教我怎么去改呀?
(例子程序的功能是hook MessageBox,将MessageBox上面显示的文本内容发送到指定的地方)
///////////////////////////////////////////////////////////////////////////////
// Prototypes for the hooked functions
typedef int (WINAPI *PFNMESSAGEBOXA)(HWND hWnd, PCSTR pszText,
PCSTR pszCaption, UINT uType);
typedef int (WINAPI *PFNMESSAGEBOXW)(HWND hWnd, PCWSTR pszText,
PCWSTR pszCaption, UINT uType);
// We need to reference these variables before we create them.
extern CAPIHook g_MessageBoxA;
extern CAPIHook g_MessageBoxW;
///////////////////////////////////////////////////////////////////////////////
// This function sends the MessageBox info to our main dialog box
void SendLastMsgBoxInfo(BOOL fUnicode,
PVOID pvCaption, PVOID pvText, int nResult)
{.....................}
///////////////////////////////////////////////////////////////////////////////
// This is the MessageBoxW replacement function
int WINAPI Hook_MessageBoxW(HWND hWnd, PCWSTR pszText, LPCWSTR pszCaption,
UINT uType) {
// Call the original MessageBoxW function
int nResult = ((PFNMESSAGEBOXW)(PROC) g_MessageBoxW)
(hWnd, pszText, pszCaption, uType);
// Send the information to the main dialog box
SendLastMsgBoxInfo(TRUE, (PVOID) pszCaption, (PVOID) pszText, nResult);
// Return the result back to the caller
return(nResult);
}
///////////////////////////////////////////////////////////////////////////////
// This is the MessageBoxA replacement function
int WINAPI Hook_MessageBoxA(HWND hWnd, PCSTR pszText, PCSTR pszCaption,
UINT uType) {
// Call the original MessageBoxA function
int nResult = ((PFNMESSAGEBOXA)(PROC) g_MessageBoxA)
(hWnd, pszText, pszCaption, uType);
// Send the infomration to the main dialog box
SendLastMsgBoxInfo(FALSE, (PVOID) pszCaption, (PVOID) pszText, nResult);
// Return the result back to the caller
return(nResult);
}
///////////////////////////////////////////////////////////////////////////////
// Hook the MessageBoxA and MessageBoxW functions
CAPIHook g_MessageBoxA("User32.dll", "MessageBoxA",
(PROC) Hook_MessageBoxA, TRUE);
CAPIHook g_MessageBoxW("User32.dll", "MessageBoxW",
(PROC) Hook_MessageBoxW, TRUE);
// Since we do DLL injection with Windows' hooks, we need to save the hook
// handle in a shared memory block (Windows 2000 actually doesn't need this)
#pragma data_seg("Shared")
HHOOK g_hhook = NULL;
#pragma data_seg()
#pragma comment(linker, "/Section:Shared,rws")
///////////////////////////////////////////////////////////////////////////////
static LRESULT WINAPI GetMsgProc(int code, WPARAM wParam, LPARAM lParam) {
// NOTE: On Windows 2000, the 1st parameter to CallNextHookEx can
// be NULL. On Windows 98, it must be the hook handle.
return(CallNextHookEx(g_hhook, code, wParam, lParam));
}
///////////////////////////////////////////////////////////////////////////////
// Returns the HMODULE that contains the specified memory address
static HMODULE ModuleFromAddress(PVOID pv) {
MEMORY_BASIC_INFORMATION mbi;
return((VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
? (HMODULE) mbi.AllocationBase : NULL);
}
///////////////////////////////////////////////////////////////////////////////
BOOL WINAPI LastMsgBoxInfo_HookAllApps(BOOL fInstall, DWORD dwThreadId) {
BOOL fOk;
if (fInstall) {
chASSERT(g_hhook == NULL); // Illegal to install twice in a row
// Install the Windows' hook
g_hhook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc,
ModuleFromAddress(LastMsgBoxInfo_HookAllApps), dwThreadId);
fOk = (g_hhook != NULL);
} else {
chASSERT(g_hhook != NULL); // Can't uninstall if not installed
fOk = UnhookWindowsHookEx(g_hhook);
g_hhook = NULL;
}
return(fOk);
}
6 楼
pangbai [专家分:360] 发布于 2006-09-22 13:22:00
HHOOK SetWindowsHookEx(int idHook;
HOOKPROC lpfn;
HINSTANCE hMod;
DWORD dwThreadId);
其中:参数idHook 指定了钩子的类型,总共有如下13种:
WH_CALLWNDPROC 系统将消息发送到指定窗口之前的"钩子"
WH_CALLWNDPROCRET 消息已经在窗口中处理的"钩子"
WH_CBT 基于计算机培训的"钩子"
WH_DEBUG 差错"钩子"
WH_FOREGROUNDIDLE 前台空闲窗口"钩子"
WH_GETMESSAGE 接收消息投递的"钩子"
WH_JOURNALPLAYBACK 回放以前通过WH_JOURNALRECORD"钩子"记录的输入消息
WH_JOURNALRECORD 输入消息记录"钩子"
WH_KEYBOARD 键盘消息"钩子"
WH_MOUSE 鼠标消息"钩子"
WH_MSGFILTER 对话框、消息框、菜单或滚动条输入消息"钩子"
WH_SHELL 外壳"钩子"
WH_SYSMSGFILTER 系统消息"钩子"
参数lpfn为指向钩子处理函数的指针,即回调函数的首地址;参数hMod则标识了钩子处理函数所处模块的句柄;第四个参数dwThreadId 指定被监视的线程,如果明确指定了某个线程的ID就只监视该线程,此时的钩子即为线程钩子;如果该参数被设置为0,则表示此钩子为监视系统所有线程的全局钩子。此函数在执行完后将返回一个钩子句柄。
7 楼
p2006 [专家分:0] 发布于 2006-09-23 17:06:00
说实话,楼上说的这些对我实在没帮助,但谢谢你的关注,给你加30分!
windows核心编程的那个感觉复杂了点,我又从网上下了个APIHook的程序,修改了一下但还是不行,大家再帮我看看啊,谢谢了!
//////////////////////////////// APIHook_Dll.cpp
#include "stdafx.h"
#include "APIHook_Dll.h"
#include <ImageHlp.h>
#include <tlhelp32.h>
#pragma comment(lib,"ImageHlp")
#pragma data_seg("Shared")
HMODULE hmodDll=NULL;
HHOOK hHook=NULL;
#pragma data_seg()
#pragma comment(linker,"/Section:Shared,rws")
///////////////////////////////////// DllMain
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
//if(sHook)
case DLL_PROCESS_DETACH:
UnInstallHook();
break;
}
hmodDll=hModule;
return TRUE;
}
///////////////////////////////////// HookOneAPI
void WINAPI HookOneAPI(LPCTSTR pszCalleeModuleName,PROC
pfnOriginApiAddress,PROC pfnDummyFuncAddress,HMODULE hModCallerModule)
{
ULONG size;
PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)
ImageDirectoryEntryToData(hModCallerModule,TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT,&size);
if (pImportDesc == NULL)
return;
for (;pImportDesc->Name;pImportDesc++)
{
LPSTR pszDllName =
(LPSTR)((PBYTE)hModCallerModule+pImportDesc->Name);
if (lstrcmpiA(pszDllName,pszCalleeModuleName) == 0)
break;
}
if (pImportDesc->Name == NULL)
{
return;
}
PIMAGE_THUNK_DATA pThunk =
(PIMAGE_THUNK_DATA)((PBYTE)hModCallerModule+pImportDesc->FirstThunk);//IAT
for (;pThunk->u1.Function;pThunk++)
{
PROC * ppfn= (PROC *)&pThunk->u1.Function;
if (*ppfn == pfnOriginApiAddress)
{
WriteProcessMemory(GetCurrentProcess(),ppfn,&(pfnDummyFuncAddress),
sizeof(pfnDummyFuncAddress),NULL);
return;
}
}
}
BOOL WINAPI HookAllAPI(LPCTSTR pszCalleeModuleName,PROC
pfnOriginApiAddress,
PROC pfnDummyFuncAddress,HMODULE hModCallerModule)
{
if (pszCalleeModuleName == NULL)
{
return FALSE;
}
if (pfnOriginApiAddress == NULL)
{
return FALSE;
}
if (hModCallerModule == NULL)
{
MEMORY_BASIC_INFORMATION mInfo;
HMODULE hModHookDLL;
HANDLE hSnapshot;
MODULEENTRY32 me = {sizeof(MODULEENTRY32)};
VirtualQuery(HookOneAPI,&mInfo,sizeof(mInfo));
hModHookDLL=(HMODULE)mInfo.AllocationBase;
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,0);
BOOL bOk = Module32First(hSnapshot,&me);
while (bOk)
{
if (me.hModule != hModHookDLL)
{
hModCallerModule = me.hModule;
HookOneAPI(pszCalleeModuleName,pfnOriginApiAddress,
pfnDummyFuncAddress,hModCallerModule);
}
bOk = Module32Next(hSnapshot,&me);
}
return TRUE;
}
else
{
HookOneAPI(pszCalleeModuleName,pfnOriginApiAddress,
pfnDummyFuncAddress,hModCallerModule);
return TRUE;
}
return FALSE;
}
//////////////////////////////////// UnhookAllAPIHooks
BOOL WINAPI UnhookAllAPIHooks(LPCTSTR pszCalleeModuleName,PROC
pfnOriginApiAddress,
PROC pfnDummyFuncAddress,HMODULE hModCallerModule)
{
PROC temp;
temp = pfnOriginApiAddress;
pfnOriginApiAddress = pfnDummyFuncAddress;
pfnDummyFuncAddress = temp;
return HookAllAPI(pszCalleeModuleName,pfnOriginApiAddress,
pfnDummyFuncAddress,hModCallerModule);
}
////////////////////////////////// GetMsgProc
LRESULT CALLBACK GetMsgProc(int code,WPARAM wParam,LPARAM lParam)
{
return CallNextHookEx(hHook,code,wParam,lParam);
}
//////////////////////////////////// InstallHook
void __declspec(dllexport) WINAPI InstallHook(BOOL IsHook,DWORD
dwThreadId)
{
if(IsHook)
{
//hmodDll = ::LoadLibrary("APIHook_Dll.dll");
hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)GetMsgProc,hmodDll,dwThreadId);
HookAllAPI("kernel32.dll",GetProcAddress(GetModuleHandle("kernel32.dll"),
"CopyFileW"),(PROC)&H_CopyFileW,NULL);
HookAllAPI("kernel32.dll",GetProcAddress(GetModuleHandle("kernel32.dll"),
"CopyFileA"),(PROC)&H_CopyFileA,NULL);
}
else
{
UnInstallHook();
UnhookAllAPIHooks("kernel32.dll",GetProcAddress(GetModuleHandle("kernel32.dll"),
"CopyFileW"),(PROC)&H_CopyFileW,NULL);
UnhookAllAPIHooks("kernel32.dll",GetProcAddress(GetModuleHandle("kernel32.dll"),
"CopyFileA"),(PROC)&H_CopyFileA,NULL);
}
}
///////////////////////////////////// UnInstallHook
BOOL WINAPI UnInstallHook()
{
UnhookWindowsHookEx(hHook);
return TRUE;
}
///////////////////////////////////// H_CopyFileA
BOOL WINAPI H_CopyFileA(
LPCTSTR lpExistingFileName,
LPCTSTR lpNewFileName,
BOOL bFailIfExists )
{
MessageBox(.......);
}
///////////////////////////////////// H_CopyFileW
BOOL WINAPI H_CopyFileW(
LPCTSTR lpExistingFileName,
LPCTSTR lpNewFileName,
BOOL bFailIfExists)
{
MessageBox(.......);
}
我来回复