如何在python中获取CPU寄存器的状态?

时间:2017-05-20 13:19:31

标签: python cpu-registers

是否有可能获得处理器内的寄存器状态?例如:哪个位组合占用AX,BX寄存器?

显然汇编程序可以访问这些信息,但是可以做python吗?

1 个答案:

答案 0 :(得分:2)

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程序中将代码编写为内联汇编程序,并反汇编可执行文件以准确找到需要放入缓冲区的十六进制代码。

方法2:为Python编写(C)扩展

您可以inline assembler in C,以便按照official Python documentation创建扩展程序。

方法3:使用可编译汇编代码的库

PyCCA可以在运行时为您编译和执行汇编代码。