プロセッサ内部のレジスタの状態を取得する可能性はありますか?たとえば、どのビットの組み合わせがAX、BXレジスタを占有していますか?PythonでCPUレジスタの状態を取得するには?
明らかに、アセンブラはこれらの情報にアクセスできましたが、Pythonを実行できますか?
プロセッサ内部のレジスタの状態を取得する可能性はありますか?たとえば、どのビットの組み合わせがAX、BXレジスタを占有していますか?PythonでCPUレジスタの状態を取得するには?
明らかに、アセンブラはこれらの情報にアクセスできましたが、Pythonを実行できますか?
Pythonは高水準言語です。マシンレベルのものは抽象化されているため、CPUのレジスタの状態に直接アクセスする手段はありません。私は必要な値にアクセスするためのアセンブリコードを書かずにこれを行う方法については知らない。
アプローチ1:ハックする!
あなた自身でアセンブラコードを書くことができますか?
ctypesライブラリは、C互換のデータ型を提供し、DLLまたは共有ライブラリの呼び出し関数を使用できます。
import ctypes
import sys
import os
# PROT_xxxx constants
PROT_NONE = 0x0
PROT_READ = 0x1
PROT_WRITE = 0x2
PROT_EXEC = 0x4
# Get the system page size
pagesize = os.sysconf('SC_PAGESIZE')
# Get a handle on the standard C library
libc = ctypes.CDLL('libc.so.6')
# You need to build your assembler code string
asm = "HEX CODES GO IN HERE"
# Create a string buffer with the assembler
buff = ctypes.create_string_buffer(asm)
# Get the address of the buffer
buff_addr = ctypes.addressof(buff)
buff_addr_rounded = (buff_addr/pagesize) * pagesize
# Mark the memory executable
result = libc.mprotect(buff_addr_rounded, 1*pagesize, PROT_READ | PROT_WRITE | PROT_EXEC)
# Turn the buffer contents into a callable function
f = ctypes.CFUNCTYPE(buff_addr)
# Call the function and pray that it doesn't explode!
f()
この方法の問題は、コードを自分でバッファに書き込む必要があることです。これを行うには、単純なCプログラムでインラインアセンブラとしてコードを記述し、実行可能ファイルを逆アセンブルして、バッファに入れる必要のある16進コードを正確に探します。
アプローチ2:あなたはinline assembler in Cので、あなたが拡張機能を作成するofficial Python documentationに従うことができることができますPythonの
用(C)拡張子を書きます。
アプローチ3:アセンブリコード
PyCCAは、実行時にあなたのためのアセンブリコードをコンパイルして実行することができますコンパイルすることができ、ライブラリを使用してください。
C /アセンブリコードを呼び出すという単純な行為は、あなたが興味を持っているレジスタをほぼ確実に変更しようとしているので、これらのアプローチは実際には何の役にも立たないことに注意してください。 - 唯一の真の答えは、 "私はあなたの質問に答えることを考えている"でしょう。 – jasonharper
レジスタの状態は? Pythonは翻訳された高水準言語なので、レジスタの状態はインタプリタ自身によって常に変更されており、現在実行されているPythonコードによって非常に間接的にしか変更されないため、IMO 。 – martineau