随手而作,纯粹技术研究,没什么实际意义。

 

打开xuetr,正常情况下.winlogon.exe注册了三个热键。

ctrl+alt+del,win+u,win+l三个。

这三个键用SetWindowsHookEx()函数,使用键盘钩子也屏蔽不了。

 

我们先把UnregisterSystemHotKey.dll解压出来,放到任意目录.

比如E盘根目录,就运行




[html] ​​view plain​​ ​​copy​

 


  1. rundll32 E:\UnregisterSystemHotKey.dll,Hook  


再打开xuetr看下,Winlogo.exe进程注册的热键都没有了.

 

 

 




[cpp] ​​view plain​​ ​​copy​

 


  1. #include <windows.h>  
  2. #include <process.h>   
  3. #include <tchar.h>  
  4. #include <stdio.h>  
  5. #include <shlwapi.h>  
  6. #include <psapi.h>  
  7.   
  8. #pragma comment(lib, "psapi.lib")  
  9. #pragma comment(lib, "shlwapi.lib")  
  10.   
  11. TCHAR ModuleFile[MAX_PATH];  
  12. TCHAR szText[128] = {0};  
  13. WNDPROC OldWindowProc;  
  14. HWND hWinLogon;  
  15. HMODULE hDll;  
  16.   
  17.   
  18. LRESULT CALLBACK NewWindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)  
  19. {  
  20.     if (message == WM_NULL)  
  21.     {  
  22.         ::UnregisterHotKey(hWnd, 0); //Ctrl+Alt+delete  
  23.         ::UnregisterHotKey(hWnd, 4); //Ctrl+Shift+Esc  
  24.         ::UnregisterHotKey(hWnd, 5); //Win+L  
  25.         ::UnregisterHotKey(hWnd, 6); //Win+U  
  26.         ::SetWindowLongPtr(hWnd, GWL_WNDPROC, (LONG)OldWindowProc);  
  27.         return 1;  
  28.     }  
  29.       
  30.     return CallWindowProc(OldWindowProc, hWnd, message, wParam, lParam);  
  31. }  
  32.   
  33. BOOL WINAPI EnablePrivileges()  
  34. {  
  35.     HANDLE hToken;   
  36.     TOKEN_PRIVILEGES tkp;   
  37.   
  38.     if (!OpenProcessToken(GetCurrentProcess(),   
  39.         TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))   
  40.         return( FALSE );   
  41.   
  42.     LookupPrivilegeValue(NULL, SE_DEBUG_NAME,   
  43.         &tkp.Privileges[0].Luid);   
  44.   
  45.     tkp.PrivilegeCount = 1;   
  46.     tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;   
  47.   
  48.     AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,   
  49.         (PTOKEN_PRIVILEGES)NULL, 0);   
  50.   
  51.     if (GetLastError() != ERROR_SUCCESS)   
  52.         return FALSE;   
  53.   
  54.     return TRUE;  
  55. }  
  56.   
  57. BOOL CALLBACK lpEnumWindowsProc(HWND hwnd, LPARAM lParam)  
  58. {  
  59.     if (IsWindow(hwnd))  
  60.     {  
  61.         ::GetWindowText(hwnd, szText, _countof(szText));  
  62.   
  63.         if (!_tcscmp(szText, TEXT("SAS window")))  
  64.         {  
  65.             hWinLogon = hwnd;  
  66.             OldWindowProc = (WNDPROC)::SetWindowLongPtr(hwnd, GWL_WNDPROC, (LONG)NewWindowProc);  
  67.             PostMessage(hwnd, WM_NULL, 0, 0);  
  68.             return FALSE;  
  69.         }  
  70.     }  
  71.   
  72.     return TRUE;  
  73. }  
  74.   
  75. UINT _stdcall FreeSelfProc(void *Arg)  
  76. {  
  77.     FreeLibraryAndExitThread(hDll, 0);  
  78.     return 1;  
  79. }  
  80.   
  81. BOOL WINAPI DllMain(HINSTANCE hDllHandle, DWORD nReason, LPVOID Reserved)  
  82. {  
  83.     switch ( nReason )  
  84.     {  
  85.     case DLL_PROCESS_ATTACH:  
  86.         hDll = hDllHandle;  
  87.         GetModuleFileName(NULL, ModuleFile, _countof(ModuleFile));  
  88.         EnablePrivileges();  
  89.           
  90.         if (StrStrI(ModuleFile, TEXT("winlogon.exe")))  
  91.         {  
  92.             HANDLE hThread;  
  93.             UINT ThreadId;  
  94.   
  95.             HDESK hWinLogon = OpenDesktop(TEXT("Winlogon"), 0, FALSE, GENERIC_ALL);  
  96.             ::EnumDesktopWindows(hWinLogon, lpEnumWindowsProc, NULL);  
  97.             CloseDesktop(hWinLogon);  
  98.   
  99.             hThread = (HANDLE)_beginthreadex(NULL, NULL, &FreeSelfProc, 0, 0, &ThreadId);  
  100.             WaitForSingleObject(hThread, INFINITE);  
  101.             CloseHandle(hThread);             
  102.         }  
  103.         else  
  104.         {  
  105.             DWORD dwProcessId = 0;  
  106.             HANDLE hProcess = 0;    
  107.             DWORD ProcessList[512], cbNeeded, cProcess;  
  108.             TCHAR szFileName[256];  
  109.   
  110.             EnumProcesses(ProcessList, sizeof(ProcessList), &cbNeeded);  
  111.             cProcess = cbNeeded/sizeof(DWORD);  
  112.   
  113.             for (UINT i=0; i<cProcess; i++)  
  114.             {  
  115.                 if (ProcessList[i] != 0)  
  116.                 {  
  117.                     hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessList[i]);  
  118.                     if (hProcess)  
  119.                     {  
  120.                         GetModuleBaseName(hProcess, NULL, szFileName, _countof(szFileName));  
  121.                         if (!_tcsicmp(szFileName, TEXT("winlogon.exe")))  
  122.                         {  
  123.                             dwProcessId = ProcessList[i];  
  124.                             break;  
  125.                         }  
  126.                     }  
  127.                 }  
  128.             }  
  129.   
  130.             if (dwProcessId)  
  131.             {  
  132.                 hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);  
  133.             }  
  134.   
  135.             if (!hProcess)  
  136.             {  
  137.                 return 0;  
  138.             }  
  139.           
  140.             LPVOID Param = VirtualAllocEx(hProcess, 0, 512, MEM_COMMIT, PAGE_READWRITE);  
  141.             if (!Param)  
  142.             {  
  143.                 MessageBox(NULL, TEXT("申请内存失败"), TEXT("申请内存失败"), MB_ICONWARNING);  
  144.                 return 0;  
  145.             }  
  146.   
  147.             GetModuleFileName(hDllHandle, ModuleFile, _countof(ModuleFile));  
  148.   
  149.             if (!WriteProcessMemory(hProcess, Param, (LPVOID)ModuleFile, 256, NULL))  
  150.             {  
  151.                 MessageBox(NULL, TEXT("写入内存失败"), TEXT("写入内存失败"), MB_ICONWARNING);  
  152.                 return 0;  
  153.             }  
  154.               
  155.             HANDLE hThread = CreateRemoteThread(hProcess,   
  156.                     NULL,   
  157.                     NULL,   
  158.                     (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "LoadLibraryW"),  
  159.                     Param,   
  160.                     NULL,   
  161.                     NULL);  
  162.             if (hThread)  
  163.             {  
  164.                 WaitForSingleObject(hThread, INFINITE);  
  165.             }  
  166.             else  
  167.             {  
  168.                 TCHAR sztmp[1024];  
  169.                 _stprintf_s(sztmp, _countof(sztmp), TEXT("创建远程线程失败, 错误代码:%d, dll=%s"), GetLastError(), ModuleFile);  
  170.                 MessageBox(NULL, sztmp, TEXT("创建远程线程失败"), MB_ICONWARNING);  
  171.                 return 0;                 
  172.             }  
  173.   
  174.             VirtualFreeEx(hProcess, Param , 0, MEM_RELEASE);  
  175.             CloseHandle(hThread);  
  176.             CloseHandle(hProcess);  
  177.         }  
  178.         break;  
  179.     case DLL_THREAD_ATTACH:  
  180.         break;  
  181.     case DLL_THREAD_DETACH:  
  182.         break;  
  183.     case DLL_PROCESS_DETACH:  
  184.         ::SetWindowLongPtr(hWinLogon, GWL_WNDPROC, (LONG)OldWindowProc);  
  185.         break;  
  186.     default:  
  187.         break;  
  188.     }  
  189.   
  190.     return 1;  
  191. }  
  192.   
  193. EXTERN_C __declspec(dllexport) int Hook(void)  
  194. {  
  195.     return 1;  
  196. }