找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3821|回复: 3
收起左侧

编程练习作品 -> 锁屏小工具 V3.1 【开源】

[复制链接]
ID:71922 发表于 2015-1-10 23:04 | 显示全部楼层 |阅读模式
        有朋友说希望这个程序开源,那我就开源吧,只是代码写的有些乱,不太好意思拿出来。这是当初刚刚接触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)
回复

使用道具 举报

ID:71922 发表于 2015-1-10 23:05 | 显示全部楼层
       自V2.0\V3.0发布以来,收到很多热心网友的回馈,发现了几个重大的BUG,现在已经修复。我没想到那么多人会喜欢这个程序,感动啊。。。因为那些BGU给大家带来了那么多困扰,每思及此、心里便涌现出深深罪恶感。由于工作和学习的关系一直没有修复这个几个BUG,现在特地抽出些时间来修复这几个BGU。
   
【V3.1 修复记录】
1、在禁止密码错误次数过多禁止用户输入密码时,键盘屏蔽失效,导致可以用快捷键将本程序强制关闭。
2、设置锁屏密码时可以用大写,但在解锁时 Caps Lock 按键被屏蔽,导致无法切换大小写输入密码。
3、解锁是,在开始菜单中【关闭计算机】按钮没有恢复,导致该按钮消失不见。
4、锁屏时,核心 DLL 被杀软拦截导致无法锁屏时,却屏蔽了系统的一些功能,导致用户系统异常。
5、当透明度被调整为0时,由于其他的程序的影响,锁屏界面没有被激活或光标不在密码框导致无法输入密码解锁。
(现在密码不区分大小写。修改密码时需要输入旧密码才能修改,避免被其他人恶意修改)
(为方便用户拷贝,已经将必要的文件整合到一起,即这个程序只有单文件。o(︶︿︶)o 唉 BMP图太大,把程序也撑大了,什么时候改成JPG的比较方便。)
回复

使用道具 举报

ID:73255 发表于 2015-2-4 14:22 | 显示全部楼层
那请问我锁屏已经写好,那输入密码退出锁屏怎么写?
回复

使用道具 举报

ID:90380 发表于 2015-9-18 23:41 | 显示全部楼层
挺不错的锁屏
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表