有朋友说希望这个程序开源,那我就开源吧,只是代码写的有些乱,不太好意思拿出来。这是当初刚刚接触HOOK知识的时候写的一个练习作品,后来陆续接到网友的回馈就在该基础上升级了这个程序,但由于时间关系,没有彻底的测试过,所以就出现了各种各样的问题。这次升级,刚发布就又发现了两个BUG(得去撞墙了我。。。)
[color=#3112ed,strength=3);DISPLAY:inline-block;COLOR:white;text-shadow:1px] 开源了 我就只有一个要求,希望你们能把自己的心得都能写在本文的下面的回复,让大家都能学习学习。顺便也能鼓励鼓励我继续开源。哈哈~~ 如果回复的不错,那其他作品也会开源。另外还有一个“神器级”源码哦。。。那个作品因为只完成了基本的功能所以没有发出来。透露一下主要功能:能随意提取网络上某一个压缩文件中里面的内容。例如:有一个2G的RAR压缩包的下载地址,但是你只需要其中的一个200K的小文件,那么就可以提起那200K的文件而不用下载整个压缩包。是不是很省时很省流量呀?嘎嘎。。。 其实原理一样很简单。。。 就看你们怎么回复咯。。
先说一下我当时的大概思路。
首先锁屏软件:1、要有自我保护的能力,不能被轻易的被终结自身的进程
2、限制用户的按键与鼠标以及拦截关键操作,这样就能保护用户的电脑受限操作,同时也能保护自身
3、锁屏是由用户选择窗体界面是否透明,如用户看电影时身边有小孩,就可以把调成透明,这样即能看电影又能防止小孩乱动。
4、重启后仍能直接锁屏,所以需要设置开机自启动,避免有人直接重启以绕过锁屏的限制。
5、密码可以记忆,修改时需要验证,避免其他人恶意修改。(修改密码需要验证是一位网友提出的意见)
【基本的原理】
键盘过滤:
早期的版本是利用键盘钩子实现过滤,但是有些热键无法拦截,例如 Win 键。后来就改用低级钩子,低级钩子可以屏蔽这些 热键,但是也一样无法拦截 Ctrl+Alt+Delete 组合键。
鼠标锁定:
鼠标锁定就更简单了,使用SetWindowPos() 这个API,让它每100毫秒就移动到指定位置,人的速度不会有这么快,能在100毫秒内操作这个鼠标,时间完全足够了。
关键操作屏蔽:
例如防止打开任务管理器等,我是采用修改注册表的形式去屏蔽的,这个方式也不太好,需要改进,最好就不要动注册表。
屏幕界面:
这个也很简单,首先取得当前屏幕的大小,然后把自身的界面设置成和当前屏幕一样的大小就能铺满整个屏幕。然后将其置顶并激活,并把光标定位在密码框。
【键盘过滤 DLL源码】
// 动态链接库.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include <stdio.h>
#pragma comment(linker, "/OPT:NOWIN98")
#pragma comment(linker, "/export:DllMain=_DllMain@12")
#define WH_KEYBOARD_LL 13
//-------------------------------------------------------
// 共享数据区
// 共享数据区中的数据在DLL被映射的进程中都是共享的
//-------------------------------------------------------
#pragma data_seg (".shared")
HWNDhWnd = NULL;
#pragma data_seg ()
//#pragma comment(linker,"/SECTION:.shared,RWS")
/*
// 这个结构为低级键盘Hook 返回的结构 需要自定义
typedef struct tagKBDLLHOOKSTRUCT {
DWORD vkCode;
DWORD scanCode;
DWORD flags;
DWORD time;
DWORD dwExtraInfo;
}KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
*/
HHOOKHookKeyboard = NULL;
HINSTANCE hDll;
DWORD Pid;// 当前进程pid
DWORD WPid;// 激活窗口的pid
BOOL WINAPI APIENTRY DllMain(HINSTANCEhinstDll,
DWORD reason_for_call,
LPVOID lpReserved
)
{
hDll = hinstDll;
return TRUE;
}
LRESULT CALLBACK KeyboardHookProc( int nCode,
WPARAM wParam,
LPARAM lParam
)
{
/* VK_0 - VK_9 are the same as ASCII '0' - '9' (0x30 - 0x39)
* 0x40 : unassigned
* VK_A - VK_Z are the same as ASCII 'A' - 'Z' (0x41 - 0x5A)
*小键盘 0 - 9 (0x60 - 0x69)
*13 回车键 || 8 退格键 || 0x14 是大小写*/
return CallNextHookEx(HookKeyboard, nCode, wParam, lParam);
KBDLLHOOKSTRUCT* pKey = (KBDLLHOOKSTRUCT*)lParam;
int Key_vkCode = pKey->vkCode;
if (wParam==WM_KEYDOWN || WM_SYSKEYDOWN == wParam)
{
GetWindowThreadProcessId(GetActiveWindow(), &WPid); // 获取当前窗口的PID
if (WPid == Pid) // 如果当前属于窗口是本进程 则不屏蔽这些按键
{
//if ( pKey->vkCode >= 0x30 && pKey->vkCode <=0x39 || pKey->vkCode >= 0x61 && pKey->vkCode <= 0x7A || pKey->vkCode >= 0x41 && pKey->vkCode <= 0x5A || pKey->vkCode == 13 || pKey->vkCode == 8 || pKey->vkCode == 0x14)
if (Key_vkCode >= 0x30 && Key_vkCode <=0x5A ||
Key_vkCode >= 0x60 && Key_vkCode <=0x69 ||
Key_vkCode == 13 || Key_vkCode == 8 )// ||
//Key_vkCode == VK_CAPITAL)
{
if (pKey->vkCode != 0x40)
return CallNextHookEx(HookKeyboard, nCode, wParam, lParam);
}
}
}
return 1;
//return CallNextHookEx(HookKeyboard, nCode, wParam, lParam);
}
extern "C" __declspec(dllexport) BOOL SetHook(HWND hWnd)
{
GetWindowThreadProcessId(hWnd, &Pid);// 获取主界面的进程PID
HookKeyboard =SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyboardHookProc, hDll, 0);
if (HookKeyboard)
return TRUE;
else
return FALSE;
}
extern "C" __declspec(dllexport) BOOL UnHook()
{
if (UnhookWindowsHookEx(HookKeyboard))
return TRUE;
else
return FALSE;
}
【鼠标锁定 EXE】
void LockShuBiao()
{
RECT rect; //定义个矩形
/******鼠标只能在这个范围内移动******/
unsigned int w = ::GetSystemMetrics(SM_CXSCREEN);
unsigned int h = ::GetSystemMetrics(SM_CYSCREEN);
rect.bottom= h/3;
rect.top= h/3;
rect.right = w-9;
rect.left = w-9;
// 每隔100 毫秒锁定一次,看你吖的移动鼠标啦~~~~
while(1)
{
This->SetWindowPos(NULL,0,0,w,h,SWP_SHOWWINDOW);
ClipCursor(&rect);
Sleep(100);
}
}
【关键操作屏蔽 EXE】
int Reg(int i)
{
char Reg[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";
char Regoff[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer";
char Regz[] = "DisableTaskMgr";// 屏蔽任务管理器
char RegLock[] = "DisableLockWorkstation";// 屏蔽锁定计算机
char Regnooff[] = "NoLogOff";// 屏蔽注销
char Regnoexit[] = "NoClose";// 屏蔽关机
char RegnoKey[] = "NoWinKeys";// WIN+E、WIN+D、WIN+F、WIN+R等Windows快捷键
//char RegnoRun[] = "RestrictRun";// 禁止允许任何程序
char Nopassword[] = "DisableChangePassword";// 屏蔽更改密码
HKEY hkey,hkeyoff;
DWORD Zhi=1;
//if(RegCreateKeyEx(HKEY_CURRENT_USER,Reg,NULL,KEY_ALL_ACCESS ,&hkey))
if(RegCreateKeyEx(HKEY_CURRENT_USER,Reg,0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hkey,NULL))
{
RegCloseKey(hkey);
return 1;// 创建失败则 返回1 提示错误
}
//if(RegCreateKeyEx(HKEY_CURRENT_USER,Regoff,NULL,KEY_ALL_ACCESS ,&hkeyoff))
if(RegCreateKeyEx(HKEY_CURRENT_USER,Regoff,0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hkeyoff,NULL))
{
RegCloseKey(hkeyoff);
return 1;// 创建失败则 返回1 提示错误
}
if (i)
{
// 屏蔽任务管理器
if (RegSetValueEx(hkey,Regz,0,REG_DWORD,(CONST BYTE*)&Zhi,sizeof(Zhi)))
{
RegCloseKey(hkey);
return 1;//设置失败则返回1 提示错误
}
// 屏蔽锁定计算机
if (RegSetValueEx(hkey,RegLock,0,REG_DWORD,(CONST BYTE*)&Zhi,sizeof(Zhi)))
{
RegCloseKey(hkey);
return 1;//设置失败则返回1 提示错误
}
// 屏蔽注销
if (RegSetValueEx(hkeyoff,Regnooff,0,REG_DWORD,(CONST BYTE*)&Zhi,sizeof(Zhi)))
{
RegCloseKey(hkeyoff);
return 1;//设置失败则返回1 提示错误
}
// 屏蔽关机
if (RegSetValueEx(hkeyoff,Regnoexit,0,REG_DWORD,(CONST BYTE*)&Zhi,sizeof(Zhi)))
{
RegCloseKey(hkeyoff);
return 1;//设置失败则返回1 提示错误
}
// 屏蔽更改密码
if (RegSetValueEx(hkey,Nopassword,0,REG_DWORD,(CONST BYTE*)&Zhi,sizeof(Zhi)))
{
RegCloseKey(hkey);
return 1;//设置失败则返回1 提示错误
}
// 屏蔽系统快捷键
if (RegSetValueEx(hkeyoff,RegnoKey,0,REG_DWORD,(CONST BYTE*)&Zhi,sizeof(Zhi)))
{
RegCloseKey(hkeyoff);
return 1;//设置失败则返回1 提示错误
}
RegCloseKey(hkeyoff);
RegCloseKey(hkey);
/*// 只修改内存 重启后会失效 避免重启后锁屏程序无法运行
if(RegCreateKeyEx(HKEY_CURRENT_USER,Regoff,0,0,REG_OPTION_VOLATILE,KEY_ALL_ACCESS,NULL,&hkeyoff,NULL))
{
RegCloseKey(hkeyoff);
return 1;// 创建失败则 返回1 提示错误
}
if (RegSetValueEx(hkeyoff,RegnoRun,0,REG_DWORD,(CONST BYTE*)&Zhi,sizeof(Zhi)))
{
RegCloseKey(hkeyoff);
return 1;//设置失败则返回1 提示错误
}
RegCloseKey(hkeyoff);
*/return 0;// 如果找到则返回0 提示成功
}
else// 解除限制
{
// 解除任务管理器限制
if (RegDeleteValue(hkey,Regz))
return 1;
// 解除锁定计算机限制
if (RegDeleteValue(hkey,RegLock))
return 1;
// 解除锁定注销
if (RegDeleteValue(hkeyoff,Regnooff))
return 1;
// 解除锁定注销
if (RegDeleteValue(hkey,Nopassword))
return 1;
// 解除锁定关机
if (RegDeleteValue(hkeyoff,Regnoexit))
return 1;
// 解除系统快捷键限制
if (RegDeleteValue(hkeyoff,RegnoKey))
return 1;
/*// 解除允许程序的权限
if (RegDeleteValue(hkeyoff,RegnoRun))
return 1;
*/
return 0;
}
}
由于采用的是MFC框架,所以代码这里添加一些,那里添加一些,有些乱,我直接把整个工程的下载地址贴出来。
源码和生成的EXE都挺大,都是因为BMP图片给撑的。。。。
下面是完整的源码下载地址:
锁屏小工具 SP3.1 (源码).rar
(4.24 MB, 下载次数: 30)
|