回 帖 发 新 帖 刷新版面

主题:用HOOK实现禁止复制文件?

用VC下HOOK方法,实现禁止复制文件的功能,求各位大哥大姐给点这方面的资料或是源码供参考,万分感谢!!!

回复列表 (共7个回复)

沙发

没听说过 HOOK 有这个功能

板凳

API HOOK,
HOOK CopyFile(Ex)和CreateFile发现要保护的文件直接返回错误应该就可以了.

3 楼


楼上的大哥或哪位知道的麻烦告诉我这个程序(DLL)大概的流程(哪步用什么函数)?

钩子是怎么设置的?这个程序中SetWindowsHookEx函数的四个参数如何设置?要不要像挂接某个进程中一个DLL中的某个函数那样改变函数的地址实现?

kernel32.dll中CopyFile函数到底是怎么被挂接的?

我现在都搞糊涂了,求求大家帮忙!!!



4 楼

搜一下API HOOK的资料就有了.或者搜索屏幕取词(也是通过API HOOK来实现的)的资料.
没写好的话很容易出错.而且是系统性的错误.

5 楼

我看过《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 楼

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 楼

说实话,楼上说的这些对我实在没帮助,但谢谢你的关注,给你加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(.......);
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册