|
有朋友說(shuō)希望這個(gè)程序開(kāi)源,那我就開(kāi)源吧,只是代碼寫(xiě)的有些亂,不太好意思拿出來(lái)。這是當(dāng)初剛剛接觸HOOK知識(shí)的時(shí)候?qū)懙囊粋(gè)練習(xí)作品,后來(lái)陸續(xù)接到網(wǎng)友的回饋就在該基礎(chǔ)上升級(jí)了這個(gè)程序,但由于時(shí)間關(guān)系,沒(méi)有徹底的測(cè)試過(guò),所以就出現(xiàn)了各種各樣的問(wèn)題。這次升級(jí),剛發(fā)布就又發(fā)現(xiàn)了兩個(gè)BUG(得去撞墻了我。。。)
[color=#3112ed,strength=3);DISPLAY:inline-block;COLOR:white;text-shadow:1px] 開(kāi)源了 我就只有一個(gè)要求,希望你們能把自己的心得都能寫(xiě)在本文的下面的回復(fù),讓大家都能學(xué)習(xí)學(xué)習(xí)。順便也能鼓勵(lì)鼓勵(lì)我繼續(xù)開(kāi)源。哈哈~~ 如果回復(fù)的不錯(cuò),那其他作品也會(huì)開(kāi)源。另外還有一個(gè)“神器級(jí)”源碼哦。。。那個(gè)作品因?yàn)橹煌瓿闪嘶镜墓δ芩詻](méi)有發(fā)出來(lái)。透露一下主要功能:能隨意提取網(wǎng)絡(luò)上某一個(gè)壓縮文件中里面的內(nèi)容。例如:有一個(gè)2G的RAR壓縮包的下載地址,但是你只需要其中的一個(gè)200K的小文件,那么就可以提起那200K的文件而不用下載整個(gè)壓縮包。是不是很省時(shí)很省流量呀?嘎嘎。。。 其實(shí)原理一樣很簡(jiǎn)單。。。 就看你們?cè)趺椿貜?fù)咯。。
先說(shuō)一下我當(dāng)時(shí)的大概思路。
首先鎖屏軟件:1、要有自我保護(hù)的能力,不能被輕易的被終結(jié)自身的進(jìn)程
2、限制用戶(hù)的按鍵與鼠標(biāo)以及攔截關(guān)鍵操作,這樣就能保護(hù)用戶(hù)的電腦受限操作,同時(shí)也能保護(hù)自身
3、鎖屏是由用戶(hù)選擇窗體界面是否透明,如用戶(hù)看電影時(shí)身邊有小孩,就可以把調(diào)成透明,這樣即能看電影又能防止小孩亂動(dòng)。
4、重啟后仍能直接鎖屏,所以需要設(shè)置開(kāi)機(jī)自啟動(dòng),避免有人直接重啟以繞過(guò)鎖屏的限制。
5、密碼可以記憶,修改時(shí)需要驗(yàn)證,避免其他人惡意修改。(修改密碼需要驗(yàn)證是一位網(wǎng)友提出的意見(jiàn))
【基本的原理】
鍵盤(pán)過(guò)濾:
早期的版本是利用鍵盤(pán)鉤子實(shí)現(xiàn)過(guò)濾,但是有些熱鍵無(wú)法攔截,例如 Win 鍵。后來(lái)就改用低級(jí)鉤子,低級(jí)鉤子可以屏蔽這些 熱鍵,但是也一樣無(wú)法攔截 Ctrl+Alt+Delete 組合鍵。
鼠標(biāo)鎖定:
鼠標(biāo)鎖定就更簡(jiǎn)單了,使用SetWindowPos() 這個(gè)API,讓它每100毫秒就移動(dòng)到指定位置,人的速度不會(huì)有這么快,能在100毫秒內(nèi)操作這個(gè)鼠標(biāo),時(shí)間完全足夠了。
關(guān)鍵操作屏蔽:
例如防止打開(kāi)任務(wù)管理器等,我是采用修改注冊(cè)表的形式去屏蔽的,這個(gè)方式也不太好,需要改進(jìn),最好就不要?jiǎng)幼?cè)表。
屏幕界面:
這個(gè)也很簡(jiǎn)單,首先取得當(dāng)前屏幕的大小,然后把自身的界面設(shè)置成和當(dāng)前屏幕一樣的大小就能鋪滿(mǎn)整個(gè)屏幕。然后將其置頂并激活,并把光標(biāo)定位在密碼框。
【鍵盤(pán)過(guò)濾 DLL源碼】
// 動(dòng)態(tài)鏈接庫(kù).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
//-------------------------------------------------------
// 共享數(shù)據(jù)區(qū)
// 共享數(shù)據(jù)區(qū)中的數(shù)據(jù)在DLL被映射的進(jìn)程中都是共享的
//-------------------------------------------------------
#pragma data_seg (".shared")
HWNDhWnd = NULL;
#pragma data_seg ()
//#pragma comment(linker,"/SECTION:.shared,RWS")
/*
// 這個(gè)結(jié)構(gòu)為低級(jí)鍵盤(pán)Hook 返回的結(jié)構(gòu) 需要自定義
typedef struct tagKBDLLHOOKSTRUCT {
DWORD vkCode;
DWORD scanCode;
DWORD flags;
DWORD time;
DWORD dwExtraInfo;
}KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
*/
HHOOKHookKeyboard = NULL;
HINSTANCE hDll;
DWORD Pid;// 當(dāng)前進(jìn)程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)
*小鍵盤(pán) 0 - 9 (0x60 - 0x69)
*13 回車(chē)鍵 || 8 退格鍵 || 0x14 是大小寫(xiě)*/
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); // 獲取當(dāng)前窗口的PID
if (WPid == Pid) // 如果當(dāng)前屬于窗口是本進(jìn)程 則不屏蔽這些按鍵
{
//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);// 獲取主界面的進(jìn)程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;
}
【鼠標(biāo)鎖定 EXE】
void LockShuBiao()
{
RECT rect; //定義個(gè)矩形
/******鼠標(biāo)只能在這個(gè)范圍內(nèi)移動(dòng)******/
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 毫秒鎖定一次,看你吖的移動(dòng)鼠標(biāo)啦~~~~
while(1)
{
This->SetWindowPos(NULL,0,0,w,h,SWP_SHOWWINDOW);
ClipCursor(&rect);
Sleep(100);
}
}
【關(guān)鍵操作屏蔽 EXE】
int Reg(int i)
{
char Reg[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";
char Regoff[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer";
char Regz[] = "DisableTaskMgr";// 屏蔽任務(wù)管理器
char RegLock[] = "DisableLockWorkstation";// 屏蔽鎖定計(jì)算機(jī)
char Regnooff[] = "NoLogOff";// 屏蔽注銷(xiāo)
char Regnoexit[] = "NoClose";// 屏蔽關(guān)機(jī)
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;// 創(chuàng)建失敗則 返回1 提示錯(cuò)誤
}
//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;// 創(chuàng)建失敗則 返回1 提示錯(cuò)誤
}
if (i)
{
// 屏蔽任務(wù)管理器
if (RegSetValueEx(hkey,Regz,0,REG_DWORD,(CONST BYTE*)&Zhi,sizeof(Zhi)))
{
RegCloseKey(hkey);
return 1;//設(shè)置失敗則返回1 提示錯(cuò)誤
}
// 屏蔽鎖定計(jì)算機(jī)
if (RegSetValueEx(hkey,RegLock,0,REG_DWORD,(CONST BYTE*)&Zhi,sizeof(Zhi)))
{
RegCloseKey(hkey);
return 1;//設(shè)置失敗則返回1 提示錯(cuò)誤
}
// 屏蔽注銷(xiāo)
if (RegSetValueEx(hkeyoff,Regnooff,0,REG_DWORD,(CONST BYTE*)&Zhi,sizeof(Zhi)))
{
RegCloseKey(hkeyoff);
return 1;//設(shè)置失敗則返回1 提示錯(cuò)誤
}
// 屏蔽關(guān)機(jī)
if (RegSetValueEx(hkeyoff,Regnoexit,0,REG_DWORD,(CONST BYTE*)&Zhi,sizeof(Zhi)))
{
RegCloseKey(hkeyoff);
return 1;//設(shè)置失敗則返回1 提示錯(cuò)誤
}
// 屏蔽更改密碼
if (RegSetValueEx(hkey,Nopassword,0,REG_DWORD,(CONST BYTE*)&Zhi,sizeof(Zhi)))
{
RegCloseKey(hkey);
return 1;//設(shè)置失敗則返回1 提示錯(cuò)誤
}
// 屏蔽系統(tǒng)快捷鍵
if (RegSetValueEx(hkeyoff,RegnoKey,0,REG_DWORD,(CONST BYTE*)&Zhi,sizeof(Zhi)))
{
RegCloseKey(hkeyoff);
return 1;//設(shè)置失敗則返回1 提示錯(cuò)誤
}
RegCloseKey(hkeyoff);
RegCloseKey(hkey);
/*// 只修改內(nèi)存 重啟后會(huì)失效 避免重啟后鎖屏程序無(wú)法運(yùn)行
if(RegCreateKeyEx(HKEY_CURRENT_USER,Regoff,0,0,REG_OPTION_VOLATILE,KEY_ALL_ACCESS,NULL,&hkeyoff,NULL))
{
RegCloseKey(hkeyoff);
return 1;// 創(chuàng)建失敗則 返回1 提示錯(cuò)誤
}
if (RegSetValueEx(hkeyoff,RegnoRun,0,REG_DWORD,(CONST BYTE*)&Zhi,sizeof(Zhi)))
{
RegCloseKey(hkeyoff);
return 1;//設(shè)置失敗則返回1 提示錯(cuò)誤
}
RegCloseKey(hkeyoff);
*/return 0;// 如果找到則返回0 提示成功
}
else// 解除限制
{
// 解除任務(wù)管理器限制
if (RegDeleteValue(hkey,Regz))
return 1;
// 解除鎖定計(jì)算機(jī)限制
if (RegDeleteValue(hkey,RegLock))
return 1;
// 解除鎖定注銷(xiāo)
if (RegDeleteValue(hkeyoff,Regnooff))
return 1;
// 解除鎖定注銷(xiāo)
if (RegDeleteValue(hkey,Nopassword))
return 1;
// 解除鎖定關(guān)機(jī)
if (RegDeleteValue(hkeyoff,Regnoexit))
return 1;
// 解除系統(tǒng)快捷鍵限制
if (RegDeleteValue(hkeyoff,RegnoKey))
return 1;
/*// 解除允許程序的權(quán)限
if (RegDeleteValue(hkeyoff,RegnoRun))
return 1;
*/
return 0;
}
}
由于采用的是MFC框架,所以代碼這里添加一些,那里添加一些,有些亂,我直接把整個(gè)工程的下載地址貼出來(lái)。
源碼和生成的EXE都挺大,都是因?yàn)锽MP圖片給撐的。。。。
下面是完整的源碼下載地址:
鎖屏小工具 SP3.1 (源碼).rar
(4.24 MB, 下載次數(shù): 30)
2015-1-10 23:03 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|