首页
社区
课程
招聘
[求助]win8下,高权限进程如何模仿普通权限执行exe?
发表于: 2015-6-23 17:56 6771

[求助]win8下,高权限进程如何模仿普通权限执行exe?

2015-6-23 17:56
6771
原因起自以下问题:
       主exe是安装包,它运行起来后权限较高,可能还有兼容性特性在里面,还可能带其它一些特性,安装包在启动的子进程权限应该是继承了安装包的特点,也与一般用户点击运行的exe不一样,导致了子进程里面hook某些函数不正常(hook ddraw.dll的DirectDrawCreate不到)

       所以我现在想在安装包起子进程时,以降权限/非兼容模式或其它特性等等模式来启,目标就是像用户在桌面上双击一样,以较低的,最常见的方式启exe

不知道应该怎么写?
CreateProcess或ShellExcute如何设置参数能达到效果?
而且不知道安装包除了权限高外还有多少其它特性?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 1392
活跃值: (5107)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
2
我觉得HOOK问题和权限的问题不是很大。应该是其他方面的问题
2015-6-23 18:03
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
分析过了,权限导致了windows里面有些行为有区别,apphelp这鬼东西,导致了getprocaddress得到的函数地址不是真实地址,使我hook目标不对了
桌面启动的exe行为完全正确
2015-6-23 18:06
0
雪    币: 1392
活跃值: (5107)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
4
这倒是有可能。换个方式获取地址呢。比如导出表。
2015-6-23 18:59
0
雪    币: 1443
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这样试试?

BOOL CreateProcessAsLogonUser(
                              LPCTSTR                 lpApplicationName,
                              LPTSTR                  lpCommandLine,
                              LPSECURITY_ATTRIBUTES   lpProcessAttributes,
                              LPSECURITY_ATTRIBUTES   lpThreadAttributes,
                              BOOL                    bInheritHandle,
                              DWORD                   dwCreateFlags,
                              LPCTSTR                 lpCurrentDirectory,
                              LPSTARTUPINFO           lpStartupInfo,
                              LPPROCESS_INFORMATION   lpProcessInformation
                              )
{
    BOOL        bRet = FALSE;
    HANDLE      hToken = NULL;
    HANDLE      hDuplicatedToken = NULL;
    LPVOID      lpEnvironment = NULL;
    __try
    {
        DWORD dwSessionId = WTSGetActiveConsoleSessionId();
        if (dwSessionId == 0xffffffff)
        {
            return FALSE;
        }

        bRet = WTSQueryUserToken(dwSessionId, &hToken);
        if (!bRet)
        {
            __leave;
        }

        bRet = DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hDuplicatedToken);
        if (!bRet)
        {
            __leave;
        }

        bRet = CreateEnvironmentBlock(&lpEnvironment, hDuplicatedToken, FALSE);
        if (!bRet)
        {
            __leave;
        }

        bRet = CreateProcessAsUser(
            hDuplicatedToken,
            lpApplicationName,
            lpCommandLine,
            lpProcessAttributes,
            lpThreadAttributes,
            bInheritHandle,
            dwCreateFlags | CREATE_UNICODE_ENVIRONMENT,
            lpEnvironment,
            lpCurrentDirectory,
            lpStartupInfo,
            lpProcessInformation
            );
        if (!bRet)
        {
            __leave;
        }

        bRet = TRUE;
    }
    __finally
    {
        if (lpEnvironment)
        {
            DestroyEnvironmentBlock(lpEnvironment);
            lpEnvironment = NULL;
        }
        if (hDuplicatedToken)
        {
            CloseHandle(hDuplicatedToken);
            hDuplicatedToken = NULL;
        }
        if (hToken)
        {
            CloseHandle(hToken);
            hToken = NULL;
        }
    }
    return bRet;
}
2015-6-23 18:59
0
雪    币: 97
活跃值: (225)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼上正解
2015-6-23 19:39
0
雪    币: 7
活跃值: (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
比较猥琐的方式是。。注入到低权限进程。
2015-6-23 22:01
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
自实己实现GetProcAddress就可以了
2015-6-24 08:04
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
我更倾向5楼的这种标准方式的哈,安全可靠 :)
2015-6-24 09:47
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
这个实现起来麻烦呀,各操作系统版本兼容,稳定性不能保证,还麻烦,我喜欢用标准API搞定
2015-6-24 09:49
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
我先试试你的代码,谢谢了
2015-6-24 09:52
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
刚试了你的代码,执行结果不正确呀
在第二个函数调用时:
WTSQueryUserToken
返回0,失败了

参数dwSessionId=1
2015-6-24 16:16
0
雪    币: 121
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
乱说.CreateProcessAsUser才是最好的办法,WTSQueryUserToken 这个API需要TCB权限,默认只有服务才有.
这个API CreateProcessWithLogonW 也可以解决问题.权限是MS非常麻烦的事情.
2015-6-26 16:05
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
CreateProcessAsUser的话如何简单的以当前用户权限进行运行呢?
2015-6-26 17:29
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
顶顶顶顶
2015-6-29 16:07
0
游客
登录 | 注册 方可回帖
返回
//