2017-05-20 12 views
-2

プロセッサ内部のレジスタの状態を取得する可能性はありますか?たとえば、どのビットの組み合わせがAX、BXレジスタを占有していますか?PythonでCPUレジスタの状態を取得するには?

明らかに、アセンブラはこれらの情報にアクセスできましたが、Pythonを実行できますか?

+0

レジスタの状態は? Pythonは翻訳された高水準言語なので、レジスタの状態はインタプリタ自身によって常に変更されており、現在実行されているPythonコードによって非常に間接的にしか変更されないため、IMO 。 – martineau

答えて

1

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は、実行時にあなたのためのアセンブリコードをコンパイルして実行することができますコンパイルすることができ、ライブラリを使用してください。

+2

C /アセンブリコードを呼び出すという単純な行為は、あなたが興味を持っているレジスタをほぼ確実に変更しようとしているので、これらのアプローチは実際には何の役にも立たないことに注意してください。 - 唯一の真の答えは、 "私はあなたの質問に答えることを考えている"でしょう。 – jasonharper

関連する問題