找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3785|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

編程練習(xí)作品 -> 鎖屏小工具 V3.1 【開源】

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:71922 發(fā)表于 2015-1-10 23:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
        有朋友說希望這個程序開源,那我就開源吧,只是代碼寫的有些亂,不太好意思拿出來。這是當(dāng)初剛剛接觸HOOK知識的時候?qū)懙囊粋練習(xí)作品,后來陸續(xù)接到網(wǎng)友的回饋就在該基礎(chǔ)上升級了這個程序,但由于時間關(guān)系,沒有徹底的測試過,所以就出現(xiàn)了各種各樣的問題。這次升級,剛發(fā)布就又發(fā)現(xiàn)了兩個BUG(得去撞墻了我。。。)  

[color=#3112ed,strength=3);DISPLAY:inline-block;COLOR:white;text-shadow:1px]      開源了 我就只有一個要求,希望你們能把自己的心得都能寫在本文的下面的回復(fù),讓大家都能學(xué)習(xí)學(xué)習(xí)。順便也能鼓勵鼓勵我繼續(xù)開源。哈哈~~ 如果回復(fù)的不錯,那其他作品也會開源。另外還有一個“神器級”源碼哦。。。那個作品因為只完成了基本的功能所以沒有發(fā)出來。透露一下主要功能:能隨意提取網(wǎng)絡(luò)上某一個壓縮文件中里面的內(nèi)容。例如:有一個2G的RAR壓縮包的下載地址,但是你只需要其中的一個200K的小文件,那么就可以提起那200K的文件而不用下載整個壓縮包。是不是很省時很省流量呀?嘎嘎。。。 其實原理一樣很簡單。。。 就看你們怎么回復(fù)咯。。

    先說一下我當(dāng)時的大概思路。
    首先鎖屏軟件:1、要有自我保護(hù)的能力,不能被輕易的被終結(jié)自身的進(jìn)程
                            2、限制用戶的按鍵與鼠標(biāo)以及攔截關(guān)鍵操作,這樣就能保護(hù)用戶的電腦受限操作,同時也能保護(hù)自身
                            3、鎖屏是由用戶選擇窗體界面是否透明,如用戶看電影時身邊有小孩,就可以把調(diào)成透明,這樣即能看電影又能防止小孩亂動。
                            4、重啟后仍能直接鎖屏,所以需要設(shè)置開機(jī)自啟動,避免有人直接重啟以繞過鎖屏的限制。
                            5、密碼可以記憶,修改時需要驗證,避免其他人惡意修改。(修改密碼需要驗證是一位網(wǎng)友提出的意見)

【基本的原理】
    鍵盤過濾:
                   早期的版本是利用鍵盤鉤子實現(xiàn)過濾,但是有些熱鍵無法攔截,例如 Win 鍵。后來就改用低級鉤子,低級鉤子可以屏蔽這些 熱鍵,但是也一樣無法攔截 Ctrl+Alt+Delete 組合鍵。
   
    鼠標(biāo)鎖定:
                    鼠標(biāo)鎖定就更簡單了,使用SetWindowPos() 這個API,讓它每100毫秒就移動到指定位置,人的速度不會有這么快,能在100毫秒內(nèi)操作這個鼠標(biāo),時間完全足夠了。

    關(guān)鍵操作屏蔽:
                    例如防止打開任務(wù)管理器等,我是采用修改注冊表的形式去屏蔽的,這個方式也不太好,需要改進(jìn),最好就不要動注冊表。

    屏幕界面:
                    這個也很簡單,首先取得當(dāng)前屏幕的大小,然后把自身的界面設(shè)置成和當(dāng)前屏幕一樣的大小就能鋪滿整個屏幕。然后將其置頂并激活,并把光標(biāo)定位在密碼框。


【鍵盤過濾 DLL源碼】
// 動態(tài)鏈接庫.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")

/*
// 這個結(jié)構(gòu)為低級鍵盤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)
*小鍵盤 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);  // 獲取當(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; //定義個矩形

/******鼠標(biāo)只能在這個范圍內(nèi)移動******/
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 毫秒鎖定一次,看你吖的移動鼠標(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ī)
char Regnooff[] = "NoLogOff";// 屏蔽注銷
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 提示錯誤
}

//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 提示錯誤
}

if (i)
{
// 屏蔽任務(wù)管理器
if (RegSetValueEx(hkey,Regz,0,REG_DWORD,(CONST BYTE*)&Zhi,sizeof(Zhi)))
{
RegCloseKey(hkey);
return 1;//設(shè)置失敗則返回1 提示錯誤
}

// 屏蔽鎖定計算機(jī)
if (RegSetValueEx(hkey,RegLock,0,REG_DWORD,(CONST BYTE*)&Zhi,sizeof(Zhi)))
{
RegCloseKey(hkey);
return 1;//設(shè)置失敗則返回1 提示錯誤
}
// 屏蔽注銷
if (RegSetValueEx(hkeyoff,Regnooff,0,REG_DWORD,(CONST BYTE*)&Zhi,sizeof(Zhi)))
{
RegCloseKey(hkeyoff);
return 1;//設(shè)置失敗則返回1 提示錯誤
}

// 屏蔽關(guān)機(jī)
if (RegSetValueEx(hkeyoff,Regnoexit,0,REG_DWORD,(CONST BYTE*)&Zhi,sizeof(Zhi)))
{
RegCloseKey(hkeyoff);
return 1;//設(shè)置失敗則返回1 提示錯誤
}

// 屏蔽更改密碼
if (RegSetValueEx(hkey,Nopassword,0,REG_DWORD,(CONST BYTE*)&Zhi,sizeof(Zhi)))
{
RegCloseKey(hkey);
return 1;//設(shè)置失敗則返回1 提示錯誤
}

// 屏蔽系統(tǒng)快捷鍵
if (RegSetValueEx(hkeyoff,RegnoKey,0,REG_DWORD,(CONST BYTE*)&Zhi,sizeof(Zhi)))
{
RegCloseKey(hkeyoff);
return 1;//設(shè)置失敗則返回1 提示錯誤
}

RegCloseKey(hkeyoff);
RegCloseKey(hkey);
/*// 只修改內(nèi)存 重啟后會失效 避免重啟后鎖屏程序無法運(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 提示錯誤
}

if (RegSetValueEx(hkeyoff,RegnoRun,0,REG_DWORD,(CONST BYTE*)&Zhi,sizeof(Zhi)))
{
RegCloseKey(hkeyoff);
return 1;//設(shè)置失敗則返回1 提示錯誤
}

RegCloseKey(hkeyoff);
*/return 0;// 如果找到則返回0 提示成功
}
else// 解除限制
{
// 解除任務(wù)管理器限制
if (RegDeleteValue(hkey,Regz))
return 1;

// 解除鎖定計算機(jī)限制
if (RegDeleteValue(hkey,RegLock))
return 1;

// 解除鎖定注銷
if (RegDeleteValue(hkeyoff,Regnooff))
return 1;

// 解除鎖定注銷
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框架,所以代碼這里添加一些,那里添加一些,有些亂,我直接把整個工程的下載地址貼出來。
源碼和生成的EXE都挺大,都是因為BMP圖片給撐的。。。。
下面是完整的源碼下載地址: 鎖屏小工具 SP3.1 (源碼).rar (4.24 MB, 下載次數(shù): 30)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:71922 發(fā)表于 2015-1-10 23:05 | 只看該作者
       自V2.0\V3.0發(fā)布以來,收到很多熱心網(wǎng)友的回饋,發(fā)現(xiàn)了幾個重大的BUG,現(xiàn)在已經(jīng)修復(fù)。我沒想到那么多人會喜歡這個程序,感動啊。。。因為那些BGU給大家?guī)砹四敲炊嗬_,每思及此、心里便涌現(xiàn)出深深罪惡感。由于工作和學(xué)習(xí)的關(guān)系一直沒有修復(fù)這個幾個BUG,現(xiàn)在特地抽出些時間來修復(fù)這幾個BGU。
   
【V3.1 修復(fù)記錄】
1、在禁止密碼錯誤次數(shù)過多禁止用戶輸入密碼時,鍵盤屏蔽失效,導(dǎo)致可以用快捷鍵將本程序強(qiáng)制關(guān)閉。
2、設(shè)置鎖屏密碼時可以用大寫,但在解鎖時 Caps Lock 按鍵被屏蔽,導(dǎo)致無法切換大小寫輸入密碼。
3、解鎖是,在開始菜單中【關(guān)閉計算機(jī)】按鈕沒有恢復(fù),導(dǎo)致該按鈕消失不見。
4、鎖屏?xí)r,核心 DLL 被殺軟攔截導(dǎo)致無法鎖屏?xí)r,卻屏蔽了系統(tǒng)的一些功能,導(dǎo)致用戶系統(tǒng)異常。
5、當(dāng)透明度被調(diào)整為0時,由于其他的程序的影響,鎖屏界面沒有被激活或光標(biāo)不在密碼框?qū)е聼o法輸入密碼解鎖。
(現(xiàn)在密碼不區(qū)分大小寫。修改密碼時需要輸入舊密碼才能修改,避免被其他人惡意修改)
(為方便用戶拷貝,已經(jīng)將必要的文件整合到一起,即這個程序只有單文件。o(︶︿︶)o 唉 BMP圖太大,把程序也撐大了,什么時候改成JPG的比較方便。)
回復(fù)

使用道具 舉報

板凳
ID:73255 發(fā)表于 2015-2-4 14:22 | 只看該作者
那請問我鎖屏已經(jīng)寫好,那輸入密碼退出鎖屏怎么寫?
回復(fù)

使用道具 舉報

地板
ID:90380 發(fā)表于 2015-9-18 23:41 | 只看該作者
挺不錯的鎖屏
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表