钩子的应用:措施运行监督
当前位置:以往代写 > C/C++ 教程 >钩子的应用:措施运行监督
2019-06-13

钩子的应用:措施运行监督

钩子的应用:措施运行监督

副标题#e#

措施先容:

操作这个措施:

1.可以监督在你的电脑运行的措施, 把在你的电脑运行过的措施的时间和名字记录下来;

2.可以阻止你划定的禁用措施的执行, 好比不让玩游戏。

3.这个措施需要插手注册表, 在系统启动时就运行, 到达监督的目标。注册表或许都不生疏,就是这里:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

措施的记录名目:

2003-02-03 17:31:25 – [System Startup – Windows XP 5.01.2600]

2003-02-03 17:31:29 "CabinetWClass" -> "我的电脑"

2003-02-03 17:31:59 "Red Alert" -> "Red Alert" (封锁禁用措施)

2003-02-03 17:32:19 "扫雷" -> "扫雷" (封锁禁用措施)

2003-02-03 17:32:35 "OpusApp" -> "Microsoft Word"

2003-02-03 17:32:50 – [System Shutdown – 0 days, 0 hrs, 1 mins, 25 secs]

2003-02-03 17:35:37 – [System Startup – Windows 98 SE 4.10.2222]

2003-02-03 17:35:53 "扫雷" -> "扫雷" (封锁禁用措施)

2003-02-03 17:36:05 "CabinetWClass" -> ""

2003-02-03 17:36:31 "Red Alert" -> "Red Alert" (封锁禁用措施)

2003-02-03 17:36:56 "ExploreWClass" -> ""

2003-02-03 17:37:07 – [System Shutdown – 0 days, 0 hrs, 1 mins, 30 secs]

措施运行只需要3个文件:

hwhpapp.exe 可执行文件

hwhpdrv.dll 安装钩子的动态链接库


#p#副标题#e#

hwhpapp.cfg 禁用软件黑名单, 可用记事本修改

措施运行会自动发生记录文件:

hwhpapp.sys 可以用记事本打开看

措施道理:

一.钩子

操作 API 函数 SetWindowsHookEx() 安装一个全局钩子, 钩子范例为 WH_SHELL。

WH_SHELL 钩子可监督所有应用措施的主窗口建设可能封锁。

最典范的应用就是 Windows 的状态栏,当措施运行时,把主窗口的标题插手状态栏,措施退出时,从状态栏删除。

假如你截获这个钩子,可以做到克制状态栏的显示,也可以本身作一个状态栏,可能作一个汗青记录,把所有在你电脑曾经运行的措施记录下来。假如运行的措施不是你但愿的,你可以直接封锁这个措施,到达克制运行的目标。

二.动态链接库

由于钩子是全局的,必需把这个钩子界说到 .DLL 的动态链接库里,这就涉及到成立动态链接库。

三.共享内存

由于钩子是安装到系统里的,钩子的运行是在操纵系统内里,因此这个钩子不能利用你的措施所界说的任何全局变量!

既然如此,有什么步伐办理呢?在本措施里操作共享内存技能,操作 API 函数 CreateFileMapping() 可建设共享内存,这个内存可以在任何运行的措施中利用,也就是说任何运行的 .EXE、.DLL 和其他措施都可以利用这块内存。在本措施中直接利用了 Victor 串口 VCL 控件里的 TSharedMemory 共享内存类。

四.记录文件和软件黑名单文件

把所有在你的电脑执行的措施记录生存在一个文本文件里, 因为扩展名为 .txt 很容易被发明,因此回收扩展名 .sys

软件黑名单文件生存在 .cfg 文件里,同样因为 .ini 文件很容易发明而且打开修改。

这两个文件都生存在与你的 .exe 文件的沟通文件夹里,而且与 .exe 文件同名.

#p#副标题#e#

五.担保你的措施只能同时运行一个

假如你同时运行两个措施,记录文件就会乱套,所以必需担保只能运行一个。

当你的措施刚开始运行的时候,就是在 WinMain() 函数的最开始,就要判定是否已经运行了,假如已经运行,就直接退出。

判定的要领很简朴,就是查抄措施共享的内存是否存在,假如查抄到共享的内存已经存在,那就是已经运行了。

六.措施隐身, 不能显示在任务栏和任务打点器内里

这个也很简朴,只要在主措施的 Application->Run(); 前面加一句话:

SetWindowLong(Application->Handle, GWL_EXSTYLE, GetWindowLong(Application->Handle, GWL_EXSTYLE)|WS_EX_TOOLWINDOW);

就可以了。

——————————————————————————–

措施先容

.DLL 文件:这是最要害的钩子的代码:

#include <vcl.h>
#include "yb_base.h" //Victor 串口控件内里的一个头文件
#define MYAPPMARK "VICTOR_APPMONI_20010612" //共享内存符号
class __export THookedProcs
{
   public:
     THookedProcs();
     ~THookedProcs();
     void WINAPI InitFuncs(void);
     void WINAPI UninitFuncs(void);
   private:
     HHOOK hThisHook; //生存钩子的句柄
     static LRESULT CALLBACK HookedShellProc(int nCode, WPARAM wParam, LPARAM lParam);
};
//界说共享的数据布局
typedef struct
{
  HHOOK hHook; //当前利用的 HOOK
//... 此处可增加其他共享的数据
} THookSharedData;
THookedProcs::THookedProcs()
{
  hThisHook = NULL;
}
THookedProcs::~THookedProcs()
{
   UninitFuncs();
}
void WINAPI THookedProcs::InitFuncs(void)
{
   UninitFuncs();
   hThisHook = SetWindowsHookEx(WH_SHELL, (HOOKPROC) HookedShellProc, HInstance, 0);
   TSharedMemory AppMem(MYAPPMARK,4096); //在 EXE 文件里共享的内存
   THookSharedData *HookSharedData = ((THookSharedData*)(AppMem.AppInfo->Data)); //共享的数据
   HookSharedData->hHook = hThisHook; //把 hThisHook 生存到共享内存里
}
void WINAPI THookedProcs::UninitFuncs(void)
{
   if(hThisHook)
   {
     UnhookWindowsHookEx(hThisHook);
     hThisHook = NULL;
   }
}
LRESULT CALLBACK THookedProcs::HookedShellProc(int nCode, WPARAM wParam, LPARAM lParam)
{
   TSharedMemory AppMem(MYAPPMARK, 4096); //利用在 .EXE 文件里共享的内存
   if(AppMem.Valid)if(AppMem.Exists) //假如共享内存存在
   {
     HWND hMainWnd = AppMem.AppInfo->hMainForm;
     if(hMainWnd)
     {
       if(nCode==HSHELL_WINDOWCREATED)
       {
         PostMessage(hMainWnd, WM_USERCMD, UC_WINHOOK, wParam);
       }
     }
   }
   //在 Hook 里无法挪用 hThisHook, 必需用共享内存内里的 hHook
   THookSharedData *HookSharedData = ((THookSharedData*)(AppMem.AppInfo->Data)); //共享的数据
   return CallNextHookEx(HookSharedData->hHook, nCode, wParam, lParam);
}
--------------------------------------------------------------------------------
EXE文件主措施的代码:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR lpCmdLine, int)
{
   if(!AppMem.Valid)
   {
     return 1;
   }
   if(AppMem.Exists) //已经存在 (措施以前已经运行过了, 而且正在运行)
   {
     if(stricmp(lpCmdLine, "/SHOW")==0) //假如监测到呼吁行参数 /SHOW 就显示出已经运行的措施的主窗口
     {
       PostMessage(AppMem.AppInfo->hMainForm, WM_USERCMD, UC_SHOWWIN, 0);
     }
     return 0;
   }
   AppMem.ClearBuffer();
   try
   {
     Application->Initialize();
     Application->CreateForm(__classid(TFormMain), &FormMain);
     //下面的语句是防备显示在状态栏和任务打点器
     SetWindowLong(Application->Handle, GWL_EXSTYLE, GetWindowLong(Application->Handle, GWL_EXSTYLE)|WS_EX_TOOLWINDOW);
     Application->Run();
   }
   catch (Exception &exception)
   {
     Application->ShowException(&exception);
   }
   catch (...)
   {
     try
     {
       throw Exception("");
     }
     catch (Exception &exception)
     {
       Application->ShowException(&exception);
     }
   }
   return 0;
}
--------------------------------------------------------------------------------
主窗口措施:
TSharedMemory AppMem(MYAPPMARK, 4096); //界说共享的内存,这个内存是真正存在的
__fastcall TFormMain::TFormMain(TComponent* Owner)
: TForm(Owner)
{
   AppMem.AppInfo->hMainWnd = Application->Handle;
   AppMem.AppInfo->hMainForm = Handle;
   WriteStartupMessage(); //在记录文件里插手启动信息
   PostMessage(Handle, WM_USERCMD, UC_INITWIN, 0);
   MyHook = new THookedProcs;
   MyHook->InitFuncs(); //安装钩子
}
//---------------------------------------------------------------------------
__fastcall TFormMain::~TFormMain()
{
   MyHook->UninitFuncs(); //删除钩子
   delete MyHook;
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::FormCloseQuery(TObject *Sender, bool &CanClose)
{
   WriteShutdownMessage(); //在记录文件里插手退出信息
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::WndProc(Messages::TMessage &Message)
{
   if(Message.Msg == WM_USERCMD)
   {
     if(Message.WParam == UC_SHOWWIN)
     {
       Show();
       AppMem.ActiveAppWnd();
     }
     else if(Message.WParam == UC_INITWIN)
     {
       Hide();
       Left = (Screen->Width - Width) / 2;
       Top = (Screen->Height - Height) / 2;
     }
     else if(Message.WParam == UC_WINHOOK)
     {
       WinHookMessage(Message.LParam);
     }
   }
   TForm::WndProc(Message);
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::BnExitClick(TObject *Sender)
{
   Close();
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::BnHideClick(TObject *Sender)
{
   Hide();
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::CreateParams(Controls::TCreateParams &Params)
{
   TForm::CreateParams(Params);
   Params.Style = WS_OVERLAPPED|WS_DLGFRAME|WS_CAPTION|WS_SYSMENU;
   Params.ExStyle |= WS_EX_TOPMOST;
   Params.X = Screen->Width - 8;
   Params.Y = Screen->Height - 8;
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::WinHookMessage(long Param)
{
   HWND hWnd = (HWND) Param;
   char szWinCaption[256];
   char szWinClass[256];
   AnsiString s;
   DateTimeX x;
   s += AnsiString().sprintf("%04d-%02d-%02d %02d:%02d:%02d ", x.Year, x.Month, x.Day, x.Hour, x.Minute, x.Second);
   if(!GetWindowText(hWnd, szWinCaption, 256))
   *szWinCaption = 0;
   if(!GetClassName(hWnd,szWinClass,256))
   *szWinClass = 0;
   s += "\"" + AnsiString(szWinClass) + "\" -> \"" + AnsiString(szWinCaption) + "\"";
   if(!ValidAppCheck(hWnd, szWinClass,szWinCaption))
   s += " (封锁禁用措施)";
   s += "\r\n";
   TBinFileFuncs::WriteLogFileInfo(TRelPath().Extension("sys").c_str(), s.c_str()); //与 .exe 同名的 .sys 文件
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::WriteStartupMessage(void)
{
   AnsiString s;
   DateTimeX x = StartupTime;
   TSysInfo si;
   s += "========== Copyright (C) Victor Chen ===== Email: [email protected] ==========\r\n";
   s += AnsiString().sprintf("%04d-%02d-%02d %02d:%02d:%02d - ", x.Year, x.Month, x.Day, x.Hour, x.Minute, x.Second);
   s += AnsiString().sprintf("[System Startup - %s %d.%02d.%04d]", si.OS->OSName, si.OS->MajorVer, si.OS->MinorVer, si.OS->BuildNum);
   s += "\r\n";
   TBinFileFuncs::WriteLogFileInfo(TRelPath().Extension("sys").c_str(), s.c_str()); //与 .exe 同名的 .sys 文件
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::WriteShutdownMessage(void)
{
   AnsiString s;
   DateTimeX x;
   TimeX t; t.S000 = (x - StartupTime) % (24*60*60);
   int d = (x - StartupTime) / (24*60*60);
   s += AnsiString().sprintf("%04d-%02d-%02d %02d:%02d:%02d - ", x.Year, x.Month, x.Day, x.Hour, x.Minute, x.Second);
   s += AnsiString().sprintf("[System Shutdown - %d days, %d hrs, %d mins, %d secs]", d, t.Hour, t.Minute, t.Second);
   s += "\r\n";
   TBinFileFuncs::WriteLogFileInfo(TRelPath().Extension("sys").c_str(), s.c_str()); //与 .exe 同名的 .sys 文件
}
//---------------------------------------------------------------------------
bool __fastcall TFormMain::ValidAppCheck(HWND hwnd, char *cls, char *cap)
{
   TBinFile f;
   f.FileName = TRelPath().Extension("cfg"); //与 .exe 同名的 .cfg 文件
   f.OpenMode = TBinFile::omRead; //筹备读文件
   if(f.Exists) //假如文件存在
   {
     try
     {
       f.Active = true; //打开文件
       char aLine[2048];
       while(fgets(aLine,2000,f)) //读一行文本 (尺度 C 函数)
       {
         if(strnicmp(aLine,"CLASS=",6)==0) //用类名识别
         {
           TBinFileFuncs::DeleteSpaces(aLine+6,1,1); //去除空格
           if(stricmp(aLine+6,cls)==0)
           {
             PostMessage(hwnd, WM_CLOSE, 0, 0); //封锁措施
             return false;
           }
         }
         else if(strnicmp(aLine,"CAPTION=",8)==0) //用标题识别
         {
           TBinFileFuncs::DeleteSpaces(aLine+8,1,1); //去除空格
           if(stricmp(aLine+8,cap)==0)
           {
             PostMessage(hwnd, WM_CLOSE, 0, 0); //封锁措施
             return false;
           }
         }
       }
     }
     catch(Exception &e)
     {
       //忽略错误提示, 也可以在此处把错误信息添加到一个错误信息文件
     }
   }
   return true;
}

——————————————————————————–

本措施包括两个工程文件:

hwhpdrv.bpr 建设 .DLL 动态链接库

hwhpapp.bpr 建设 .EXE 应用措施

    关键字:

在线提交作业