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

打开xuetr,正常情况下.winlogon.exe注册了三个热键。
ctrl+alt+del,win+u,win+l三个。

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

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

比如E盘根目录,就运行

  1. rundll32 E:\UnregisterSystemHotKey.dll,Hook

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

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

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

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

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

  1. 关于csrss.exe和winlogon.exe进程多、占用CPU高的解决办法,有人在暴力破解

    关于csrss.exe和winlogon.exe进程多.占用CPU高的解决办法 最近VPS的CPU一直处在100%左右,后台管理上去经常打不开,后来发现上远程都要好半天才反映过来,看到任务管理器有多个 ...

  2. 关于csrss.exe和winlogon.exe进程多、占用CPU高的解决办法

    原地址 http://blog.sina.com.cn/s/blog_912e77480101nuif.html   最近VPS的CPU一直处在100%左右,后台管理上去经常打不开,后来发现上远程都要 ...

  3. win7下禁用ctrl alt del +上下左右键

    1.控制面板 2.屏幕分辨率 3.高级设置 4.英特尔图形和媒体控制面板 5.图形属性 6.选项和支持 7.快捷键管理器 8.去掉启动前的勾

  4. Mac下通过远程桌面向Windows发送Ctrl+Alt+Delete

    今天在Mac中通过远程桌面给Windows安装Git Extensions,在安装程序自动关闭资源管理器时,Windows无响应,桌面显示黑屏.于是,想通过Ctrl+Alt+Delete快捷键调出对话 ...

  5. Ring3下干净的强行删除文件

    在某公司实习完,再次回到寝室.还是在学校好. 实习期间的给我的任务就是为项目添加一个强行删除的模块. 背景是硬盘上存储空间不够时,需要删掉老的文件,如果这时后,老的文件被打开了,没有关掉,就无法删除. ...

  6. 树莓派3b无驱动打印

    Linux系统下很少有对打印机做驱动支持,自己做起来又有非常麻烦,还好大多数打印机都能够支持escpos协议,因此我们可以做到无驱动打印. 1.安装python-usb库 git clone http ...

  7. winlogon.exe应用程序错误怎么办

    winlogon.exe应用程序错误 求解决办法,重装,还原一定能解决就不要说了,我要其他办法 最佳答案 winlogon.exe 是控制你的系统登陆的程序,是系统绝对核心进程,用来管理系统用户登陆! ...

  8. Ubuntu16.04下nvidia驱动+nvidia-docker+cuda9+cudnn7安装

    一.宿主机安装nvidia驱动 打开终端,先删除旧的驱动: sudo apt-get purge nvidia* 禁用自带的 nouveau nvidia驱动 sudo gedit /etc/modp ...

  9. Linux的.a、.so和.o文件 对比 window下的dll,lib,exe文件

    连续几天终于将一个又一个问题解决了,这里说其中一个问题 描述问题:使用多线程pthread的时候,(我用的IDE,CODEBOLCKS)编译后发现直接弹出窗口,程序还没有被Build..巴拉巴拉,然后 ...

随机推荐

  1. 【16.52%】【codeforces 733C】Epidemic in Monstropolis

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  2. Android Studio官方文档: 如何在你的设备上运行你的程序

    在实体设备上运行您的应用 设置您的设备,如下所示: 使用一根 USB 电缆将您的设备连接到您的开发机器. 如果您是在 Windows 上开发,可能需要为您的设备安装相应的 USB 驱动程序.如需帮助安 ...

  3. 【35.39%】【hdu 3333】Turing Tree

    Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

  4. JSP页面中taglib的uri设置

    今天遇到这样一个问题,使用JAVA做了个WEB应用,其中用到一个自定义标签.该标签的class文件与tld(tld文件中,uri定义为:http://wallimn.iteye.com/myfuncs ...

  5. Spring中的Interceptor 拦截器 专题

    spring-webmvc-4.3.14.RELEASE.jar org.springframework.web.servlet.DispatcherServlet#doDispatch /** * ...

  6. Android Studio:Grade 全局参数定义

    Grade 全局参数定义 实际开发中设置公共的编译依赖参数等. 方法一: 在项目外层的build.gradle文件中定义,格式如下: 文件名:build.gradle ext { sourceComp ...

  7. [MVVM Light]Messenger 的使用

    原文:[MVVM Light]Messenger 的使用 当我们使用MVVM开发模式进行开发时,ViewModel之间的通信常常是很头疼的事情,好在MVVM Light提供了Messenger类可以轻 ...

  8. 使用Adorner显示WPF控件的边界点

    原文:使用Adorner显示WPF控件的边界点 当我们拖动WPF控件时,我们为了更清楚地需要显示控件,一般我们会在WPF控件所围成的矩形区域的四个边界点上作一个特殊的记号(比如圆点).如下图: 在Wi ...

  9. 机器学习: Python with Recurrent Neural Network

    之前我们介绍了Recurrent neural network (RNN) 的原理: http://blog.csdn.net/matrix_space/article/details/5337404 ...

  10. JQuery在一个简单的表单验证的例子

    html代码例如以下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...