首页
社区
课程
招聘
[求助]SE_SHUTDOWN_NAME这个参数有问题(已解决)
发表于: 2006-6-12 08:11 9265

[求助]SE_SHUTDOWN_NAME这个参数有问题(已解决)

2006-6-12 08:11
9265

我写了个函数,以下是VC版的可以编译通过:

// 函数作用:为当前进程取得系统特权的函数
VOID WINAPI MyGetPrivileges(VOID)
{
        HANDLE hToken;
        TOKEN_PRIVILEGES stTokenPrivilege;

        // 取得当前进程的[Token](标识)句柄,(TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY) == 0x0028
        if(!OpenProcessToken(GetCurrentProcess(), 0x0028, &hToken))
        {
                MyErrExit("OpenProcessToken");
        }
        // 取得关闭系统的[LUID](本地唯一的标识符)值
        if(!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &stTokenPrivilege.Privileges[0].Luid))
        {
                MyErrExit("LookupPrivilegeValue");
        }
        // 设置特权数组的元素个数
        stTokenPrivilege.PrivilegeCount = 1;
        // 设置[LUID]的属性值
        stTokenPrivilege.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        // 为当前进程取得关闭系统的特权
        if(!AdjustTokenPrivileges(hToken, FALSE, &stTokenPrivilege, 0, NULL, NULL))
        {
                MyErrExit("AdjustTokenPrivileges");
        }
        if(hToken != NULL)
        {
                CloseHandle(hToken);
        }
        return;
}

为何改成ASM版的,却编译不了
错误如下:
..\MyProc.asm(10) : error A2006: undefined symbol : OpenProcessToken
..\MyProc.asm(12) : error A2006: undefined symbol : LookupPrivilegeValue
..\MyProc.asm(18) : error A2006: undefined symbol : AdjustTokenPrivileges

.code

;函数作用:为当前进程取得系统特权的函数
MyGetPrivileges proc
LOCAL hToken:DWORD
LOCAL stTokenPrivilege:TOKEN_PRIVILEGES

        ;取得当前进程的 Token 标识 句柄
        invoke GetCurrentProcess
        invoke OpenProcessToken,eax,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,addr hToken
        ;取得关闭系统的 LUID 本地唯一的标识符 值
        invoke LookupPrivilegeValue,NULL,SE_SHUTDOWN_NAME,addr stTokenPrivilege.Privileges[0].Luid
        ;设置特权数组的元素个数
        mov stTokenPrivilege.PrivilegeCount,1
        ;设置[LUID]的属性值
        mov stTokenPrivilege.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED
        ;为当前进程取得关闭系统的特权
        invoke AdjustTokenPrivileges,hToken,FALSE,addr stTokenPrivilege,0,NULL,NULL
        invoke CloseHandle,hToken
        ret
MyGetPrivileges endp

请大侠们帮帮我!!!


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

收藏
免费 7
支持
分享
最新回复 (14)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
未定义的符号:
..\MyProc.asm(10) : error A2006: undefined symbol : OpenProcessToken
..\MyProc.asm(12) : error A2006: undefined symbol : LookupPrivilegeValue
..\MyProc.asm(18) : error A2006: undefined symbol : AdjustTokenPrivileges
,在ASM文件里将下面两个文件包含进去。
include advapi32.inc
includelib advapi32.lib
2006-6-12 08:46
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
最初由 小虾 发布
未定义的符号:
..\MyProc.asm(10) : error A2006: undefined symbol : OpenProcessToken
..\MyProc.asm(12) : error A2006: undefined symbol : LookupPrivilegeValue
..\MyProc.asm(18) : error A2006: undefined symbol : AdjustTokenPrivileges
,在ASM文件里将下面两个文件包含进去。
........


多谢了,我改了一下,还是通不过

..\MyProc.asm(14) : error A2084: constant value too large
..\MyProc.asm(14) : error A2114: INVOKE argument type mismatch : argument : 2
这个应该是说,第二的参数有问题,不知道要怎么改才对

.code

;函数作用:为当前进程取得系统特权的函数
MyGetPrivileges proc
LOCAL hToken:DWORD
LOCAL stTokenPrivilege:TOKEN_PRIVILEGES
LOCAL hProcess:DWORD

        ;取得当前进程的 Token 标识 句柄
        invoke GetCurrentProcess
        mov hProcess,eax
        invoke OpenProcessToken,hProcess,(TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY),addr hToken
        ;取得关闭系统的 LUID 本地唯一的标识符 值
        invoke LookupPrivilegeValue,NULL,SE_SHUTDOWN_NAME,addr stTokenPrivilege.Privileges[0].Luid
        ;设置特权数组的元素个数
        mov stTokenPrivilege.PrivilegeCount,1
        ;设置[LUID]的属性值
        mov stTokenPrivilege.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED
        ;为当前进程取得关闭系统的特权
        invoke AdjustTokenPrivileges,hToken,FALSE,addr stTokenPrivilege,0,NULL,NULL
        invoke CloseHandle,hToken
        ret
MyGetPrivileges endp
2006-6-12 08:57
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
4
你的源码第14行的内容有错误,你检查一下你的源码的第14行。
2006-6-12 09:40
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
最初由 小虾 发布
你的源码第14行的内容有错误,你检查一下你的源码的第14行。


第14行是这行:

invoke LookupPrivilegeValue,NULL,SE_SHUTDOWN_NAME,addr stTokenPrivilege.Privileges[0].Luid

SE_SHUTDOWN_NAME这个参数有问题,不知道怎么写才对

这个在WINDOWS.INC是这样定义的:
SE_SHUTDOWN_NAME equ ("SeShutdownPrivilege")
2006-6-12 09:49
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
顶一下,请各位大侠救救我
2006-6-13 15:09
0
雪    币: 236
活跃值: (26)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
HANDLE handle;
     TOKEN_PRIVILEGES tp;
       // 提升权限
     OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &handle);
     LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tp.Privileges[0].Luid);
     tp.PrivilegeCount = 1;
     tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
     AdjustTokenPrivileges(handle, FALSE, &tp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
2006-6-13 16:08
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
最初由 红火蚁 发布
HANDLE handle;
TOKEN_PRIVILEGES tp;
// 提升权限
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &handle);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tp.Privileges[0].Luid);
........


请问用汇编应该怎么写这一句?
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tp.Privileges[0].Luid);

上面我写的说是SE_SHUTDOWN_NAME参数有问题,可我怎么也找不出是什么问题
2006-6-13 16:38
0
雪    币: 236
活跃值: (26)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
9
以前做过一个定时关机程序就用到了提升权限

http://bbs.pediy.com/showthread.php?s=&threadid=27156
我现在还不回汇编
这个暑假学
2006-6-13 16:46
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
最初由 红火蚁 发布
以前做过一个定时关机程序就用到了提升权限

http://bbs.pediy.com/showthread.php?s=&threadid=27156
我现在还不回汇编
这个暑假学


谢了,我现在就是在学汇编,所以写了个小东东,写到这里就停了

搞不懂那个参数错在哪了
2006-6-13 16:51
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
再顶一下,请大家有空帮我看看,到底是哪出错了
2006-6-15 17:58
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
弄了几天也没弄懂问题在哪

请大家帮帮我吧
2006-6-19 12:14
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
13
;查看了一下C语言的SE_SECURITY_NAME的定义。只是将SE_SECURITY_NAME定义为一个字符串指针常量(指向字符串常量"SeSecurityPrivilege"的指针常量)
;#define SE_SECURITY_NAME                  TEXT("SeSecurityPrivilege")

;所以,在MASM32里直接改成这样就行了。
.data
  MY_SE_SHUTDOWN_NAME db "SeShutdownPrivilege",0

;使用的时候就这样使用。
mov stTokenPrivilege.Privileges[0].Attributes,offset MY_SE_PRIVILEGE_ENABLED
2006-6-19 14:01
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
最初由 小虾 发布
;查看了一下C语言的SE_SECURITY_NAME的定义。只是将SE_SECURITY_NAME定义为一个字符串指针常量(指向字符串常量"SeSecurityPrivilege"的指针常量)
;#define SE_SECURITY_NAME TEXT("SeSecurityPrivilege")

;所以,在MASM32里直接改成这样就行了。
.data
........


多谢版主!!!

按你的方法改了一下,终于解决了:)

不过还是有点不明白,在MASM32的windows.inc里面已经有这个样的定义了

SE_SHUTDOWN_NAME equ ("SeShutdownPrivilege")

为什么还有我们自己定义一个呢???
2006-6-19 14:43
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
15
这个定义充其量只是一个字符替换,任何引用这个定义的地方都会被替换成那个引号括起来的字符串
2006-6-19 18:37
0
游客
登录 | 注册 方可回帖
返回
//