Win7 修改Winlogon.exe进程代码



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

演示程序是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<sizeof(uchReadCode)/sizeof(UCHAR); i++)     {       if(uchReadCode[i] != uchOrigCode[i])       {         CloseHandle(hProcess);         return FALSE;       }     }     //将Win+L的ID从5改成25     VirtualProtectEx(hProcess, lpReadAddress, sizeof(uchHookCode), PAGE_EXECUTE_WRITECOPY, &dwOldProtect);     WriteProcessMemory(hProcess, lpReadAddress, uchHookCode, sizeof(uchHookCode), &dwReturn);     VirtualProtectEx(hProcess, lpReadAddress, sizeof(uchHookCode), dwOldProtect, &dwOldProtect);   }   else   {     //读取原地址字节     if(!ReadProcessMemory(hProcess, lpReadAddress, uchReadCode, sizeof(uchReadCode), &dwReturn))     {       CloseHandle(hProcess);       return FALSE;     }     //判断是否是要修改的字节     for(i=0; i<sizeof(uchReadCode)/sizeof(UCHAR); i++)     {       if(uchReadCode[i] != uchHookCode[i])       {         CloseHandle(hProcess);         return FALSE;       }     }     //恢复     VirtualProtectEx(hProcess, lpReadAddress, sizeof(uchOrigCode), PAGE_EXECUTE_WRITECOPY, &dwOldProtect);     WriteProcessMemory(hProcess, lpReadAddress, uchOrigCode, sizeof(uchOrigCode), &dwReturn);     VirtualProtectEx(hProcess, lpReadAddress, sizeof(uchOrigCode), dwOldProtect, &dwOldProtect);   }   CloseHandle(hProcess);   return TRUE; }

代码完全远程。 可以在XP WIN7 WIN764 WIN2003 等操作系统上成功实现修改进程路径。 已经封装成类,使用及其方便。 部分代码: 头文件: #ifndef ModifyProcessPath_h__ #define ModifyProcessPath_h__ // 结构定义 typedef struct _PROCESS_BASIC_INFORMATION { DWORD ExitStatus; ULONG PebBaseAddress; ULONG AffinityMask; LONG BasePriority; ULONG UniqueProcessId; ULONG InheritedFromUniqueProcessId; } PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION; // API声明 typedef LONG (__stdcall *PZWQUERYINFORMATIONPROCESS) ( HANDLE ProcessHandle, ULONG ProcessInformationClass, PVOID ProcessInformation, ULONG ProcessInformationLength, PULONG ReturnLength ); class CModifyProcessPath { public: CModifyProcessPath(); BOOL Create(); BOOL ModifyProcessPath(LPCTSTR szPath); BOOL CamouflageExplorerPath(); }; #endif // ModifyProcessPath_h__ CPP部分代码: #include "StdAfx.h" #include "ModifyProcessPath.h" namespace MODIFY_PROCESS { wchar_t m_szModulePath[MAX_PATH]; DWORD dwGetModuleFileNameWAddress; DWORD dwModuleBaseAddress; //E9 (目标地址-当前地址 - 5) #pragma pack(1) typedef struct _JMPCODE { BYTE bJmp; DWORD dwAddr; }JMPCODE,*LPJMPCODE; #pragma pack() DWORD WINAPI MGetModuleFileNameW(HMODULE hModule,wchar_t * lpFilename,DWORD nSize); }; using namespace MODIFY_PROCESS; // 为了不影响在进程内使用 GetModuleFileNameW ,故hook之,返回正确的路径。 DWORD WINAPI MODIFY_PROCESS::MGetModuleFileNameW(HMODULE hModule,wchar_t * lpFilename,DWORD nSize) { typedef DWORD(WINAPI *MGetModuleFileNameWT)(HMODULE,LPWCH,DWORD); MGetModuleFileNameWT pMGetModuleFileNameW; pMGetModuleFileNameW = (MGetModuleFileNameWT)dwGetModuleFileNameWAddress; if(hModule == NULL || hModule ==(HMODULE)MODIFY_PROCESS::dwModuleBaseAddress) { StringCbCopyW(lpFilename,nSize,m_szModulePath); return wcslen(m_szModulePath); } return pMGetModuleFileNameW(hModule,lpFilename,nSize); } CModifyProcessPath::CModifyProcessPath() { } BOOL CModifyProcessPath::Create() { ZeroMemory(MODIFY_PROCESS::m_szModulePath,sizeof(MODIFY_PROCESS::m_szModulePath)); MODIFY_PROCESS::dwGet
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值