Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1680672
  • 博文数量: 584
  • 博客积分: 13857
  • 博客等级: 上将
  • 技术积分: 11883
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-16 09:34

分类: Windows平台

2013-01-28 17:36:04

首先要说的我用的方法不一定是最好的,但是可能是最简单的,并且是可恢复的一种方法,程序向winlogon.exe进程具体位置写入一个字节,屏蔽了Win+L。当然Ctrl+Alt+Del、Ctrl+Shift+Esc、Win+P等等都可以屏蔽,前提是你知道原理

原理不多说了,不明白的直接看

该程序演示了在Win7如何禁止快捷键,程序中有一处硬编码,但估计win7都差不多,如果不行的话请大家按照自己的真实情况修改相应偏移,反正我是测试成功了。

贴张屏蔽Win+L演示程序截图
名称:  QQ截图20121202214231.png
查看次数: 0
文件大小:  11.0 KB

演示程序是64位,由于没32位 win7系统做测试,所有不知道具体偏移
发一下具体代码,Win+L的ID为5、Ctrl+Shift+Esc的ID为4、Ctrl+Alt+Del的ID为0

代码:
/*
由进程名获取PID
*/
DWORD GetPidByProcessName(LPCTSTR pszName)
{
  PROCESSENTRY32    pe32;
  HANDLE        hSnapshot;

  hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (hSnapshot == INVALID_HANDLE_VALUE)
    return -1;
  
  pe32.dwSize = sizeof(PROCESSENTRY32);
  if( !Process32First( hSnapshot, &pe32 ) )
  {
    CloseHandle(hSnapshot);
    return -1;
  }

  do
  {
    if(lstrcmpi(pe32.szExeFile, pszName) == 0)
    {
      CloseHandle(hSnapshot);
      return pe32.th32ProcessID;
    }
  }
  while ( Process32Next(hSnapshot, &pe32) );

  CloseHandle(hSnapshot);

  return -1;
}

/*
禁止Win+L热键,参数bDisable表示是否禁止
*/
BOOL DisableHotKey(BOOL bDisable)
{
  UCHAR      uchOrigCode[] = {0x05};
  UCHAR      uchHookCode[] = {0x25};
  UCHAR      uchReadCode[] = {0x00};
  LPVOID      lpReadAddress;
  DWORD      dwPID;
  HANDLE      hProcess;
  HMODULE      lphModule[512];
  DWORD_PTR    dwReturn;
  DWORD      dwOldProtect;
  INT        i;

  //查找winlogon.exe进程PID
  if(!(dwPID = GetPidByProcessName(_T("winlogon.exe"))))
    return FALSE;
  
  //打开进程
  if(!(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)))
    return FALSE;

  //枚举进程模块
  if(!EnumProcessModules(hProcess, lphModule, sizeof(lphModule), (LPDWORD)&dwReturn))
  {
    CloseHandle(hProcess);
    return FALSE;
  }
  
  //进程加载基址加上偏移
  lpReadAddress = (LPVOID)((LPSTR)lphModule[0] + 0x1710D);
  if(bDisable)
  {
    //读取原地址字节
    if(!ReadProcessMemory(hProcess, lpReadAddress, uchReadCode, sizeof(uchReadCode), &dwReturn))
    {
      CloseHandle(hProcess);
      return FALSE;
    }

    //判断是否是要修改的字节
    for(i=0; i
本演示程序只有64位,请务必在win7 64位运行,32位的想必也差不多
阅读(2070) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~