GNU/Linux >> Linux の 問題 >  >> Linux

スクリプト言語から Linux syscall を呼び出す

Perl は syscall でこれを許可します 関数:

$ perldoc -f syscall
    syscall NUMBER, LIST
            Calls the system call specified as the first element of the list,
            passing the remaining elements as arguments to the system call. If
⋮

ドキュメントには write(2) の呼び出し例も記載されています:

require 'syscall.ph';        # may need to run h2ph
my $s = "hi there\n";
syscall(SYS_write(), fileno(STDOUT), $s, length $s);

したことがない ただし、この機能を使用しました。さて、先ほどの例が実際に機能することを確認する前に.

これは getrandom で動作するようです :

$ perl -E 'require "syscall.ph"; $v = " "x8; syscall(SYS_getrandom(), $v, length $v, 0); print $v' | xxd
00000000: 5790 8a6d 714f 8dbe                      W..mqO..

また、syscall.ph に getrandom がない場合は、代わりに数値を使用できます。私のDebianテスト(amd64)ボックスでは318です。 Linux syscall 番号はアーキテクチャ固有のものであることに注意してください。


Python では、 ctypes を使用できます syscall() を含む動的ライブラリの任意の関数にアクセスするためのモジュール libc から:

import ctypes

SYS_getrandom = 318 # You need to check the syscall number for your target architecture

libc = ctypes.CDLL(None)
_getrandom_syscall = libc.syscall
_getrandom_syscall.restypes = ctypes.c_int
_getrandom_syscall.argtypes = ctypes.c_int, ctypes.POINTER(ctypes.c_char), ctypes.c_size_t, ctypes.c_uint

def getrandom(size, flags=0):
    buf = (ctypes.c_char * size)()
    result = _getrandom_syscall(SYS_getrandom, buf, size, flags)
    if result < 0:
        raise OSError(ctypes.get_errno(), 'getrandom() failed')
    return bytes(buf)

libc に getrandom() が含まれている場合 ラッパー関数、あなたもそれを呼び出すことができます:

import ctypes

libc = ctypes.CDLL(None)
_getrandom = libc.getrandom
_getrandom.restypes = ctypes.c_int
_getrandom.argtypes = ctypes.POINTER(ctypes.c_char), ctypes.c_size_t, ctypes.c_uint

def getrandom(size, flags=0):
    buf = (ctypes.c_char * size)()
    result = _getrandom(buf, size, flags)
    if result < 0:
        raise OSError(ctypes.get_errno(), 'getrandom() failed')
    return bytes(buf)

Ruby には syscall(num [, args...]) → integer があります 関数。

例:

irb(main):010:0> syscall 1, 1, "hello\n", 6
hello
=> 6

getrandom() で :

irb(main):001:0> a = "aaaaaaaa"
=> "aaaaaaaa"
irb(main):002:0> syscall 318,a,8,0
=> 8
irb(main):003:0> a
=> "\x9Cq\xBE\xD6|\x87\u0016\xC6"
irb(main):004:0> 

Linux
  1. Linux から Windows DLL を使用する

  2. x86_64 アセンブリ Linux システム コールの混乱

  3. Linux カーネル モジュール内からユーザー空間関数を呼び出す

  1. お気に入りのLinuxスクリプトまたはプログラミング言語は何ですか?

  2. Linux から .rbenv を削除する

  3. VHD から Linux を起動できますか?

  1. Linux – Linuxからブートローダーを実行する方法は?

  2. Linux にソースから Apache 2 をインストールする

  3. C 言語による Linux システム プログラミングのベスト コーディング プラクティス – パート 1