国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

鉤子的應(yīng)用: 程序運(yùn)行監(jiān)視

2019-11-17 05:36:39
字體:
供稿:網(wǎng)友
 作者:Victor Chen
來自:C++ 愛好者
http://www.cppfans.com

--------------------------------------------------------------------------------

程序介紹:

利用這個(gè)程序:
1.可以監(jiān)視在你的電腦運(yùn)行的程序, 把在你的電腦運(yùn)行過的程序的時(shí)間和名字記錄下來;
2.可以阻止你規(guī)定的禁用程序的執(zhí)行, 比如不讓玩游戲
3.這個(gè)程序需要加入注冊表, 在系統(tǒng)啟動(dòng)時(shí)就運(yùn)行, 達(dá)到監(jiān)視的目的。注冊表大概都不生疏,就是這里:
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" (關(guān)閉禁用程序)
2003-02-03 17:32:19 "掃雷" -> "掃雷" (關(guān)閉禁用程序)
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 "掃雷" -> "掃雷" (關(guān)閉禁用程序)
2003-02-03 17:36:05 "CabinetWClass" -> ""
2003-02-03 17:36:31 "Red Alert" -> "Red Alert" (關(guān)閉禁用程序)
2003-02-03 17:36:56 "ExploreWClass" -> ""
2003-02-03 17:37:07 - [System Shutdown - 0 days, 0 hrs, 1 mins, 30 secs]

程序運(yùn)行只需要3個(gè)文件:
hwhpapp.exe 可執(zhí)行文件
hwhpdrv.dll 安裝鉤子的動(dòng)態(tài)鏈接庫
hwhpapp.cfg 禁用軟件黑名單, 可用記事本修改
程序運(yùn)行會自動(dòng)產(chǎn)生記錄文件:
hwhpapp.sys 可以用記事本打開看

程序原理:

一.鉤子
利用 API 函數(shù) SetWindowsHookEx() 安裝一個(gè)全局鉤子, 鉤子類型為 WH_SHELL。
WH_SHELL 鉤子可監(jiān)視所有應(yīng)用程序的主窗口創(chuàng)建或者關(guān)閉。
最典型的應(yīng)用就是 Windows 的狀態(tài)欄,當(dāng)程序運(yùn)行時(shí),把主窗口的標(biāo)題加入狀態(tài)欄,程序退出時(shí),從狀態(tài)欄刪除。
假如你截獲這個(gè)鉤子,可以做到禁止?fàn)顟B(tài)欄的顯示,也可以自己作一個(gè)狀態(tài)欄,或者作一個(gè)歷史記錄,把所有在你電腦曾經(jīng)運(yùn)行的程序記錄下來。假如運(yùn)行的程序不是你希望的,你可以直接關(guān)閉這個(gè)程序,達(dá)到禁止運(yùn)行的目的。

二.動(dòng)態(tài)鏈接庫
由于鉤子是全局的,必須把這個(gè)鉤子定義到 .DLL 的動(dòng)態(tài)鏈接庫里,這就涉及到建立動(dòng)態(tài)鏈接庫。

三.共享內(nèi)存
由于鉤子是安裝到系統(tǒng)里的,鉤子的運(yùn)行是在操作系統(tǒng)里面,因此這個(gè)鉤子不能使用你的程序所定義的任何全局變量!
既然如此,有什么辦法解決呢?在本程序里利用共享內(nèi)存技術(shù),利用 API 函數(shù) CreateFileMapping() 可創(chuàng)建共享內(nèi)存,這個(gè)內(nèi)存可以在任何運(yùn)行的程序中使用,也就是說任何運(yùn)行的 .EXE、.DLL 和其他程序都可以使用這塊內(nèi)存。在本程序中直接使用了 Victor 串口 VCL 控件里的 TSharedMemory 共享內(nèi)存類。


四.記錄文件和軟件黑名單文件
把所有在你的電腦執(zhí)行的程序記錄保存在一個(gè)文本文件里, 因?yàn)閿U(kuò)展名為 .txt 很輕易被發(fā)現(xiàn),因此采用擴(kuò)展名 .sys
軟件黑名單文件保存在 .cfg 文件里,同樣因?yàn)?.ini 文件很輕易發(fā)現(xiàn)并且打開修改。
這兩個(gè)文件都保存在與你的 .exe 文件的相同文件夾里,并且與 .exe 文件同名.

五.保證你的程序只能同時(shí)運(yùn)行一個(gè)
假如你同時(shí)運(yùn)行兩個(gè)程序,記錄文件就會亂套,所以必須保證只能運(yùn)行一個(gè)。
當(dāng)你的程序剛開始運(yùn)行的時(shí)候,就是在 WinMain() 函數(shù)的最開始,就要判定是否已經(jīng)運(yùn)行了,假如已經(jīng)運(yùn)行,就直接退出。
判定的方法很簡單,就是檢查程序共享的內(nèi)存是否存在,假如檢查到共享的內(nèi)存已經(jīng)存在,那就是已經(jīng)運(yùn)行了。

六.程序隱身, 不能顯示在任務(wù)欄和任務(wù)治理器里面
這個(gè)也很簡單,只要在主程序的 application->Run(); 前面加一句話:
SetWindowLong(Application->Handle, GWL_EXSTYLE, GetWindowLong(Application->Handle, GWL_EXSTYLE)WS_EX_TOOLWINDOW);
就可以了。


--------------------------------------------------------------------------------

程序介紹
.DLL 文件:這是最要害的鉤子的代碼:

#include <vcl.h>
#include "yb_base.h" //Victor 串口控件里面的一個(gè)頭文件

#define MYAPPMARK "VICTOR_APPMONI_20010612" //共享內(nèi)存標(biāo)志

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);
};

//定義共享的數(shù)據(jù)結(jié)構(gòu)
typedef strUCt
{
  HHOOK hHook; //當(dāng)前使用的 HOOK
//... 此處可增加其他共享的數(shù)據(jù)
} 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 文件里共享的內(nèi)存
   THookSharedData *HookSharedData = ((THookSharedData*)(AppMem.AppInfo->Data)); //共享的數(shù)據(jù)
   HookSharedData->hHook = hThisHook; //把 hThisHook 保存到共享內(nèi)存里
}

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 文件里共享的內(nèi)存
   if(AppMem.Valid)if(AppMem.Exists) //假如共享內(nèi)存存在
   {
       HWND hMainWnd = AppMem.AppInfo->hMainForm;

       if(hMainWnd)
       {
           if(nCode==HSHELL_WINDOWCREATED)
           {
               PostMessage(hMainWnd, WM_USERCMD, UC_WINHOOK, wParam);
           }
       }
   }
   //在 Hook 里無法調(diào)用 hThisHook, 必須用共享內(nèi)存里面的 hHook
   THookSharedData *HookSharedData = ((THookSharedData*)(AppMem.AppInfo->Data)); //共享的數(shù)據(jù)
   return CallNextHookEx(HookSharedData->hHook, nCode, wParam, lParam);
}

--------------------------------------------------------------------------------

EXE文件主程序的代碼:

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR lpCmdLine, int)
{
   if(!AppMem.Valid)
   {
       return 1;
   }
   if(AppMem.Exists) //已經(jīng)存在 (程序以前已經(jīng)運(yùn)行過了,

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 淮阳县| 清远市| 永泰县| 宁阳县| 濮阳市| 通州市| 湘潭县| 自贡市| 高陵县| 拉孜县| 依兰县| 喀喇沁旗| 天等县| 潜江市| 黄山市| 竹山县| 义乌市| 伊金霍洛旗| 高清| 丰都县| 新民市| 永昌县| 黄山市| 临沭县| 祥云县| 银川市| 肇源县| 崇左市| 兴安县| 衡南县| 黑龙江省| 贵阳市| 岑巩县| 慈利县| 盖州市| 建阳市| 东光县| 瑞安市| 襄樊市| 双牌县| 昆山市|