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

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

2006-6-12 08:11
8703
我写了个函数,以下是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

请大侠们帮帮我!!!

[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞7
打赏
分享
最新回复 (14)
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2006-6-12 08:46
2
0
未定义的符号:
..\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
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
0cat0 2006-6-12 08:57
3
0
最初由 小虾 发布
未定义的符号:
..\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
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2006-6-12 09:40
4
0
你的源码第14行的内容有错误,你检查一下你的源码的第14行。
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
0cat0 2006-6-12 09:49
5
0
最初由 小虾 发布
你的源码第14行的内容有错误,你检查一下你的源码的第14行。


第14行是这行:

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

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

这个在WINDOWS.INC是这样定义的:
SE_SHUTDOWN_NAME equ ("SeShutdownPrivilege")
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
0cat0 2006-6-13 15:09
6
0
顶一下,请各位大侠救救我
雪    币: 236
活跃值: (26)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
红火蚁 3 2006-6-13 16:08
7
0
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);
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
0cat0 2006-6-13 16:38
8
0
最初由 红火蚁 发布
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参数有问题,可我怎么也找不出是什么问题
雪    币: 236
活跃值: (26)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
红火蚁 3 2006-6-13 16:46
9
0
以前做过一个定时关机程序就用到了提升权限

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

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


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

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

请大家帮帮我吧
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2006-6-19 14:01
13
0
;查看了一下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
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
0cat0 2006-6-19 14:43
14
0
最初由 小虾 发布
;查看了一下C语言的SE_SECURITY_NAME的定义。只是将SE_SECURITY_NAME定义为一个字符串指针常量(指向字符串常量"SeSecurityPrivilege"的指针常量)
;#define SE_SECURITY_NAME TEXT("SeSecurityPrivilege")

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


多谢版主!!!

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

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

SE_SHUTDOWN_NAME equ ("SeShutdownPrivilege")

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