web-dev-qa-db-ja.com

pythonでアセンブラコードを実行する

pythonスクリプト内でアセンブリコードを実行したいのですが、可能ですか?

Cプログラミングでは次のようになります

static inline getesp(){
        __asm__("mov %esp, %eax");
}

しかし、Pythonでそれを行う方法は?出来ますか?

20
Yuda Prawira

これを行う方法の1つは、Python用の(C)拡張を作成することです。その方法の詳細については、 this のドキュメントを参照してください。

CベースのPython拡張機能を開発する別の方法は、 ctypes モジュールを使用して外部ライブラリと直接インターフェースすることです。

いずれの場合も、ライブラリまたは拡張機能にコンパイルされたCコードと、Pythonからそれを呼び出す方法が必要です。明らかに、これを実現したい場合はおそらく最適ではありませんが、実際には、いくつかの関数を公開するのにそれほど多くの作業はありません。

13
jkp

Pythonプログラム内に直接アセンブリを埋め込むことができます:

これらは、アセンブリをコンパイルし、実行時にそれを実行可能メモリにロードすることによって機能します。最初の3つのプロジェクトはPythonでx86-64またはx86アセンブラを実装しますが、最後のプロジェクトは外部コンパイラを呼び出します。

12
Luke

ネクロポスティングには申し訳ありませんが、asmを使用して独自のDLLを記述し、Python内から関数を呼び出すことができると思います。

5
Крайст

具体的な例として、ここでは、intを取り、1ずつ増加する関数を呼び出す方法を示します。

実行可能フラグを設定してメモリを取得するには、mmapモジュールを使用します。

関数を呼び出すには、ctypesモジュールを使用します。

マシンコードをメモリに配置するために、ハードコードされたバイト文字列があります。

コードは43を出力します。

import ctypes
import mmap

buf = mmap.mmap(-1, mmap.PAGESIZE, prot=mmap.PROT_READ | mmap.PROT_WRITE | mmap.PROT_EXEC)

ftype = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int)
fpointer = ctypes.c_void_p.from_buffer(buf)

f = ftype(ctypes.addressof(fpointer))

buf.write(
    b'\x8b\xc7'  # mov eax, edi
    b'\x83\xc0\x01'  # add eax, 1
    b'\xc3'  # ret
)

r = f(42)
print(r)

del fpointer
buf.close()
1
user7610

理論的には、次のことができます。

  1. アセンブリを呼び出す簡単な関数をCで記述します。
  2. Cython または Pyrex を使用して、Pythonからその関数を呼び出します

私はPyrexとCythonのどちらも使用していないことを認めなければなりませんが、本格的なC拡張を作成する手間をかけずに、必要なことを実行できる場合があります。

0
detly

Pythonは、このタイプの低レベルのハードウェア相互作用をサポートしていません。

0
bradley.ayers

Pythonで小さなアセンブラを作成した可能性が高いです。使用したライブラリの一部はCtypesをサポートしている可能性がありますが、純粋なPythonを使用しました。ほとんどの言語は実際には低レベルでインターフェースします。HLLランゲージ機能を使用しているだけで、料金は支払っていませんコードの処理方法に適切な注意を払い、ASM x86コードを使用するVisual Basicで小さなPOC画像編集アプリも作成しました。これを編集して自分の言おうとしている方法に実際に確信が持てません。ただし、asmコードを読み取り、スクリプト自体から機能する関数は除きます。私の考えは間違っていると指摘されたと思います。 ASMコードは、コードのその領域を読み取ってコンパイルするスクリプト関数を使用して実行できます。まるでそれがその場で組み込まれたアセンブラであるかのように。私はそれほど優れたスピーカーではないように努めますが(この場合は筆者)、このページはここで私が言おうとしていることをよりよく説明できると思います http://code.activestate.com/レシピ/ 579037-how-to-execute-x86-64-bit-Assembly-code-directly-f /

0
TomFoolery