【问题标题】:How can I get a list of Linux system calls and number of args they take automatically?如何获取 Linux 系统调用列表和它们自动获取的参数数量?
【发布时间】:2011-09-30 01:07:24
【问题描述】:

我为radare2 调试器编写了一个Linux 系统调用映射。这意味着提供一个巨大的静态数组映射系统调用号到系统调用名称名称和它所采用的参数数量。这对 OpenBSD 来说很容易,因为系统调用号在 sys/syscall.h 中定义,并且在上面的注释中每个都是 args 的数量。只需编写一个脚本来解析它并抛出数组的 C 代码。

然而,在 linux 上,我们没有这种奢侈。从内核头文件中获取系统调用号很容易,但是我应该如何获取 args 的数量?我唯一的想法是:

1) 手动输入。对于每个拱门(它们在 linux 中的拱门之间有所不同)。所有 300 多种该死的东西。没办法!

2) 解析手册页。

3) 编写一个脚本,尝试使用 0、1、2... args 调用每个系统调用,直到程序构建。不适用于可变参数,但系统调用支持吗?

必须有更好的方法。请帮忙!

【问题讨论】:

  • 有关可变参数的示例,请参阅open()
  • @OliverCharlesworth 你这是什么意思? sys_open() 正好有 3 个参数。
  • 有一个great table in the Chromium OS docs。我建议找出他们是如何做到的。

标签: c system-calls


【解决方案1】:

strace (home page) 的表格中包含所有这些内容(请参阅linux/<platform>/syscallent.h)。在GitHub/straceGitLab/strace 中提供源代码。例如,x86_64 架构中的系统调用列表位于this link

【讨论】:

    【解决方案2】:

    我知道的唯一列表是内核源代码,位于include/linux/syscalls.h。但这只是名称,而不是数量;我认为您需要使用特定平台的 syscall.h 标头来获取数字。该文件中有一些#ifdefs...

    【讨论】:

    • 这是我需要的每个系统调用的参数数量
    • @vext01:我假设您还需要这些类型?我相信,因为有些参数可以是 32 位的,而有些参数可以是 64 位的。无论如何,如果您单击指向我提供的标头源的链接,您将看到每个系统调用的完整签名都在那里。
    • 我暂时不需要类型,所以我可以解析 systrace 实现。
    【解决方案3】:

    This 的帖子值得一读。 希望这会有所帮助:)

    【讨论】:

      【解决方案4】:

      【讨论】:

        【解决方案5】:

        ausyscall - 一个允许映射系统调用名称和数字的程序

        【讨论】:

          【解决方案6】:

          存在参数数量可变的系统调用 - 在 C 级别见证 open() 调用,其中第三个参数是可选的(在汇编程序级别可能不是可选的)。

          您最好的选择可能是在其他系统标头的(预处理)源中找到由名称标识的系统调用 syscalls.h。从中,您可以计算参数的数量。仅仅获得正确的标头可能会很棘手,并且可能会出现从未直接公开为 C 函数的系统调用(我还没有看到;不过这不太可能)。

          您可能会看看其他调试器(例如 GDB)如何完成相同的工作。

          【讨论】:

          • @vext01:也许——但不是在没有 DWARF 的平台上,所以那里可能有一些可以使用的想法。 DWARF 的信息必须来自某个地方。
          【解决方案7】:

          (对不起)不知道 number of args 除了手册页,但对于 系统调用号

          在 Unix 和 Linux Stack Exchange 上查看 this post

          This 可能是内核仓库中的一段代码,不确定。

          我确定我的机器上有以下内容:)

          /usr/include/asm/unistd_64.h

          #ifndef _ASM_X86_UNISTD_64_H
          #define _ASM_X86_UNISTD_64_H 1
          
          #define __NR_read 0
          #define __NR_write 1
          #define __NR_open 2
          #define __NR_close 3
          #define __NR_stat 4
          #define __NR_fstat 5
          #define __NR_lstat 6
          #define __NR_poll 7
          #define __NR_lseek 8
          #define __NR_mmap 9
          #define __NR_mprotect 10
          #define __NR_munmap 11
          #define __NR_brk 12
          #define __NR_rt_sigaction 13
          #define __NR_rt_sigprocmask 14
          #define __NR_rt_sigreturn 15
          #define __NR_ioctl 16
          #define __NR_pread64 17
          #define __NR_pwrite64 18
          #define __NR_readv 19
          #define __NR_writev 20
          #define __NR_access 21
          #define __NR_pipe 22
          #define __NR_select 23
          #define __NR_sched_yield 24
          #define __NR_mremap 25
          #define __NR_msync 26
          #define __NR_mincore 27
          #define __NR_madvise 28
          #define __NR_shmget 29
          #define __NR_shmat 30
          #define __NR_shmctl 31
          #define __NR_dup 32
          #define __NR_dup2 33
          #define __NR_pause 34
          #define __NR_nanosleep 35
          #define __NR_getitimer 36
          #define __NR_alarm 37
          #define __NR_setitimer 38
          #define __NR_getpid 39
          #define __NR_sendfile 40
          #define __NR_socket 41
          #define __NR_connect 42
          #define __NR_accept 43
          #define __NR_sendto 44
          #define __NR_recvfrom 45
          #define __NR_sendmsg 46
          #define __NR_recvmsg 47
          #define __NR_shutdown 48
          #define __NR_bind 49
          #define __NR_listen 50
          #define __NR_getsockname 51
          #define __NR_getpeername 52
          #define __NR_socketpair 53
          #define __NR_setsockopt 54
          #define __NR_getsockopt 55
          #define __NR_clone 56
          #define __NR_fork 57
          #define __NR_vfork 58
          #define __NR_execve 59
          #define __NR_exit 60
          #define __NR_wait4 61
          #define __NR_kill 62
          #define __NR_uname 63
          #define __NR_semget 64
          #define __NR_semop 65
          #define __NR_semctl 66
          #define __NR_shmdt 67
          #define __NR_msgget 68
          #define __NR_msgsnd 69
          #define __NR_msgrcv 70
          #define __NR_msgctl 71
          #define __NR_fcntl 72
          #define __NR_flock 73
          #define __NR_fsync 74
          #define __NR_fdatasync 75
          #define __NR_truncate 76
          #define __NR_ftruncate 77
          #define __NR_getdents 78
          #define __NR_getcwd 79
          #define __NR_chdir 80
          #define __NR_fchdir 81
          #define __NR_rename 82
          #define __NR_mkdir 83
          #define __NR_rmdir 84
          #define __NR_creat 85
          #define __NR_link 86
          #define __NR_unlink 87
          #define __NR_symlink 88
          #define __NR_readlink 89
          #define __NR_chmod 90
          #define __NR_fchmod 91
          #define __NR_chown 92
          #define __NR_fchown 93
          #define __NR_lchown 94
          #define __NR_umask 95
          #define __NR_gettimeofday 96
          #define __NR_getrlimit 97
          #define __NR_getrusage 98
          #define __NR_sysinfo 99
          #define __NR_times 100
          #define __NR_ptrace 101
          #define __NR_getuid 102
          #define __NR_syslog 103
          #define __NR_getgid 104
          #define __NR_setuid 105
          #define __NR_setgid 106
          #define __NR_geteuid 107
          #define __NR_getegid 108
          #define __NR_setpgid 109
          #define __NR_getppid 110
          #define __NR_getpgrp 111
          #define __NR_setsid 112
          #define __NR_setreuid 113
          #define __NR_setregid 114
          #define __NR_getgroups 115
          #define __NR_setgroups 116
          #define __NR_setresuid 117
          #define __NR_getresuid 118
          #define __NR_setresgid 119
          #define __NR_getresgid 120
          #define __NR_getpgid 121
          #define __NR_setfsuid 122
          #define __NR_setfsgid 123
          #define __NR_getsid 124
          #define __NR_capget 125
          #define __NR_capset 126
          #define __NR_rt_sigpending 127
          #define __NR_rt_sigtimedwait 128
          #define __NR_rt_sigqueueinfo 129
          #define __NR_rt_sigsuspend 130
          #define __NR_sigaltstack 131
          #define __NR_utime 132
          #define __NR_mknod 133
          #define __NR_uselib 134
          #define __NR_personality 135
          #define __NR_ustat 136
          #define __NR_statfs 137
          #define __NR_fstatfs 138
          #define __NR_sysfs 139
          #define __NR_getpriority 140
          #define __NR_setpriority 141
          #define __NR_sched_setparam 142
          #define __NR_sched_getparam 143
          #define __NR_sched_setscheduler 144
          #define __NR_sched_getscheduler 145
          #define __NR_sched_get_priority_max 146
          #define __NR_sched_get_priority_min 147
          #define __NR_sched_rr_get_interval 148
          #define __NR_mlock 149
          #define __NR_munlock 150
          #define __NR_mlockall 151
          #define __NR_munlockall 152
          #define __NR_vhangup 153
          #define __NR_modify_ldt 154
          #define __NR_pivot_root 155
          #define __NR__sysctl 156
          #define __NR_prctl 157
          #define __NR_arch_prctl 158
          #define __NR_adjtimex 159
          #define __NR_setrlimit 160
          #define __NR_chroot 161
          #define __NR_sync 162
          #define __NR_acct 163
          #define __NR_settimeofday 164
          #define __NR_mount 165
          #define __NR_umount2 166
          #define __NR_swapon 167
          #define __NR_swapoff 168
          #define __NR_reboot 169
          #define __NR_sethostname 170
          #define __NR_setdomainname 171
          #define __NR_iopl 172
          #define __NR_ioperm 173
          #define __NR_create_module 174
          #define __NR_init_module 175
          #define __NR_delete_module 176
          #define __NR_get_kernel_syms 177
          #define __NR_query_module 178
          #define __NR_quotactl 179
          #define __NR_nfsservctl 180
          #define __NR_getpmsg 181
          #define __NR_putpmsg 182
          #define __NR_afs_syscall 183
          #define __NR_tuxcall 184
          #define __NR_security 185
          #define __NR_gettid 186
          #define __NR_readahead 187
          #define __NR_setxattr 188
          #define __NR_lsetxattr 189
          #define __NR_fsetxattr 190
          #define __NR_getxattr 191
          #define __NR_lgetxattr 192
          #define __NR_fgetxattr 193
          #define __NR_listxattr 194
          #define __NR_llistxattr 195
          #define __NR_flistxattr 196
          #define __NR_removexattr 197
          #define __NR_lremovexattr 198
          #define __NR_fremovexattr 199
          #define __NR_tkill 200
          #define __NR_time 201
          #define __NR_futex 202
          #define __NR_sched_setaffinity 203
          #define __NR_sched_getaffinity 204
          #define __NR_set_thread_area 205
          #define __NR_io_setup 206
          #define __NR_io_destroy 207
          #define __NR_io_getevents 208
          #define __NR_io_submit 209
          #define __NR_io_cancel 210
          #define __NR_get_thread_area 211
          #define __NR_lookup_dcookie 212
          #define __NR_epoll_create 213
          #define __NR_epoll_ctl_old 214
          #define __NR_epoll_wait_old 215
          #define __NR_remap_file_pages 216
          #define __NR_getdents64 217
          #define __NR_set_tid_address 218
          #define __NR_restart_syscall 219
          #define __NR_semtimedop 220
          #define __NR_fadvise64 221
          #define __NR_timer_create 222
          #define __NR_timer_settime 223
          #define __NR_timer_gettime 224
          #define __NR_timer_getoverrun 225
          #define __NR_timer_delete 226
          #define __NR_clock_settime 227
          #define __NR_clock_gettime 228
          #define __NR_clock_getres 229
          #define __NR_clock_nanosleep 230
          #define __NR_exit_group 231
          #define __NR_epoll_wait 232
          #define __NR_epoll_ctl 233
          #define __NR_tgkill 234
          #define __NR_utimes 235
          #define __NR_vserver 236
          #define __NR_mbind 237
          #define __NR_set_mempolicy 238
          #define __NR_get_mempolicy 239
          #define __NR_mq_open 240
          #define __NR_mq_unlink 241
          #define __NR_mq_timedsend 242
          #define __NR_mq_timedreceive 243
          #define __NR_mq_notify 244
          #define __NR_mq_getsetattr 245
          #define __NR_kexec_load 246
          #define __NR_waitid 247
          #define __NR_add_key 248
          #define __NR_request_key 249
          #define __NR_keyctl 250
          #define __NR_ioprio_set 251
          #define __NR_ioprio_get 252
          #define __NR_inotify_init 253
          #define __NR_inotify_add_watch 254
          #define __NR_inotify_rm_watch 255
          #define __NR_migrate_pages 256
          #define __NR_openat 257
          #define __NR_mkdirat 258
          #define __NR_mknodat 259
          #define __NR_fchownat 260
          #define __NR_futimesat 261
          #define __NR_newfstatat 262
          #define __NR_unlinkat 263
          #define __NR_renameat 264
          #define __NR_linkat 265
          #define __NR_symlinkat 266
          #define __NR_readlinkat 267
          #define __NR_fchmodat 268
          #define __NR_faccessat 269
          #define __NR_pselect6 270
          #define __NR_ppoll 271
          #define __NR_unshare 272
          #define __NR_set_robust_list 273
          #define __NR_get_robust_list 274
          #define __NR_splice 275
          #define __NR_tee 276
          #define __NR_sync_file_range 277
          #define __NR_vmsplice 278
          #define __NR_move_pages 279
          #define __NR_utimensat 280
          #define __NR_epoll_pwait 281
          #define __NR_signalfd 282
          #define __NR_timerfd_create 283
          #define __NR_eventfd 284
          #define __NR_fallocate 285
          #define __NR_timerfd_settime 286
          #define __NR_timerfd_gettime 287
          #define __NR_accept4 288
          #define __NR_signalfd4 289
          #define __NR_eventfd2 290
          #define __NR_epoll_create1 291
          #define __NR_dup3 292
          #define __NR_pipe2 293
          #define __NR_inotify_init1 294
          #define __NR_preadv 295
          #define __NR_pwritev 296
          #define __NR_rt_tgsigqueueinfo 297
          #define __NR_perf_event_open 298
          #define __NR_recvmmsg 299
          #define __NR_fanotify_init 300
          #define __NR_fanotify_mark 301
          #define __NR_prlimit64 302
          #define __NR_name_to_handle_at 303
          #define __NR_open_by_handle_at 304
          #define __NR_clock_adjtime 305
          #define __NR_syncfs 306
          #define __NR_sendmmsg 307
          #define __NR_setns 308
          #define __NR_getcpu 309
          #define __NR_process_vm_readv 310
          #define __NR_process_vm_writev 311
          #define __NR_kcmp 312
          #define __NR_finit_module 313
          #define __NR_sched_setattr 314
          #define __NR_sched_getattr 315
          #define __NR_renameat2 316
          #define __NR_seccomp 317
          #define __NR_getrandom 318
          #define __NR_memfd_create 319
          #define __NR_kexec_file_load 320
          #define __NR_bpf 321
          #define __NR_execveat 322
          #define __NR_userfaultfd 323
          #define __NR_membarrier 324
          #define __NR_mlock2 325
          #define __NR_copy_file_range 326
          #define __NR_preadv2 327
          #define __NR_pwritev2 328
          #define __NR_pkey_mprotect 329
          #define __NR_pkey_alloc 330
          #define __NR_pkey_free 331
          #define __NR_statx 332
          #define __NR_io_pgetevents 333
          #define __NR_rseq 334
          #define __NR_pidfd_send_signal 424
          #define __NR_io_uring_setup 425
          #define __NR_io_uring_enter 426
          #define __NR_io_uring_register 427
          #define __NR_open_tree 428
          #define __NR_move_mount 429
          #define __NR_fsopen 430
          #define __NR_fsconfig 431
          #define __NR_fsmount 432
          #define __NR_fspick 433
          #define __NR_pidfd_open 434
          #define __NR_clone3 435
          
          #endif /* _ASM_X86_UNISTD_64_H */
          

          【讨论】:

            猜你喜欢
            • 2016-01-14
            • 1970-01-01
            • 2018-01-28
            • 2015-08-05
            • 2014-06-08
            • 1970-01-01
            • 1970-01-01
            • 2018-10-26
            • 2022-10-31
            相关资源
            最近更新 更多