• 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

  • 相关阅读:
    Basic GC Tuning
    程序员如何少走弯路,更好的提升技术。
    WPF 多线程
    IOC
    一句话概括WPF知识点
    WPF数据绑定 Binding
    WPF命令
    WPF依赖属性
    WPF路由事件
    WPF绘图和动画
  • 原文地址:https://www.cnblogs.com/findumars/p/6345003.html
Copyright © 2020-2023  润新知