Ring3下无驱动移除winlogon.exe进程ctrl+alt+del,win+u,win+l三个系统热键,非屏蔽热键(子类化SAS 窗口)

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

打开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. }  

http://blog.csdn.net/zwfgdlc/article/details/6609591

我仔细看了看,突然想到。这不是传说很久的SAS子类化吗?居然忘记了
http://topic.csdn.net/u/20090402/11/d3e27441-cfcc-45d8-a0b2-1164fc3dd777.html

原文地址:https://www.cnblogs.com/findumars/p/6345003.html