Linux程序集中的文件权限

Linux程序集中的文件权限,linux,assembly,permissions,system-calls,Linux,Assembly,Permissions,System Calls,我正在尝试获取有关文件权限的信息。我正在使用sys_访问系统调用。以下是我的代码片段: mov eax, 33 mov ebx, fileName mov ecx, 1 int 80h cmp eax, 0 jl .error 如果eax为-1,则会出现错误,并且我没有收到错误,但我需要检查文件的所有权限(所有者、组、其他人)。我该怎么做?您可以使用内核函数sys\u newstat(No.106-查看)来获取文件权限。结构stat是一个永无止境的恐怖,但以下示例至少适用于我的D

我正在尝试获取有关文件权限的信息。我正在使用sys_访问系统调用。以下是我的代码片段:

mov eax, 33 
mov ebx, fileName 
mov ecx, 1 
int 80h 

cmp eax, 0 
jl .error 

如果
eax
为-1,则会出现错误,并且我没有收到错误,但我需要检查文件的所有权限(所有者、组、其他人)。我该怎么做?

您可以使用内核函数
sys\u newstat
(No.106-查看)来获取文件权限。结构
stat
是一个永无止境的恐怖,但以下示例至少适用于我的Debian Wheezy 64位(NASM、32位和64位模式):


access(2)
不返回文件权限。它测试当前进程是否具有在第二个参数中指定的权限。若要获取权限,请使用
stat(2)
。它返回一个包含文件信息的结构,包括权限模式。谢谢,它解决了我的问题。现在我尝试使用chmod()来更改这些权限,但是当我使用我在这里找到的标记[link]()来设置这些权限时,它们并不是我想要的。当我将ecx设置为00400 | 00200时,它将所有者设置为读写,并且(不知道为什么)将guest设置为可以写。虽然当我使用00400 | 00200 | 00040时,它的集同时读取和写入。你能帮我解决这个问题吗?试着问一个新问题。好吧,基本上都是一样的(几乎就是标题),所以我认为这不是一个好的选择。谢谢你的回答,我已经设法让stat()正常工作了。现在我陷入了我在上面评论中提到的问题。现在我想更改该文件的权限(请查看评论)。@TreeZ:问一个新问题,告诉我们assembler、linker和Linux版本,并展示一个-也许我明天会处理;-)
SECTION .data

    filename        db '/root'          ; Just an example, can be replaced with any name
    filename_len    equ $ - filename    ; Length of filename
                    db 0                ; Terminator for `Int 80h / EAX = 106`
    perm_out        db 'Permissions: '
    perm            db 'drwxrwxrwx'
    perm_len        equ $ - perm        ; Index of last character in `perm`
    lf              db 10
    perm_out_len    equ $ - perm_out    ; Length of `Permissions: ...\n`

SECTION .bss
    stat resb 256               ; Way too much, but size is variable depending on OS

SECTION .text
global _start

_start:

    mov eax,4                   ; sys-out
    mov edx,filename_len        ; length of string to print
    mov ecx,filename            ; Pointer to string
    mov ebx,1                   ; StdOut
    int 0x80                    ; Call kernel

    mov eax,4                   ; sys-out
    mov edx,1                   ; Length of string to print
    mov ecx, lf                 ; Pointer to string
    mov ebx,1                   ; StdOut
    int 0x80                    ; Call kernel

    mov eax, 106                ; sys_newstat
    mov ebx, filename           ; Pointer to ASCIIZ file-name
    mov ecx, stat               ; Pointer to structure stat
    int 80h

    test eax, eax
    jz .noerr
    mov eax,1                   ; sys_exit
    mov ebx,1                   ; Exit code, 1=not normal
    int 0x80                    ; Call kernel
    .noerr:

    movzx eax, word [stat + 8]  ; st_mode (/usr/include/asm/stat.h)
    mov ebx, perm_len

    ; rwx bits
    mov ecx, 9
    .L1:
    sub ebx, 1
    shr eax, 1
    jc .J1
    mov byte [perm + ebx], '-'
    .J1:
    loop .L1

    ; directory bit
    sub ebx, 1
    shr eax, 6
    jc .J2
    mov byte [perm + ebx], '-'
    .J2:

    mov eax,4                   ; sys-out
    mov edx,perm_out_len        ; Length of string to print
    mov ecx,perm_out            ; Pointer to string
    mov ebx,1                   ; StdOut
    int 0x80                    ; Call kernel

    mov eax,1                   ; sys_exit
    mov ebx,0                   ; Exit code, 0=normal
    int 0x80                    ; Call kernel