我正在尝试使用python自动化Trace32函数。我正试图使用T32 WriteMemory()函数将值写入内存地址。有人能帮我做这个功能吗?
以下是来自T32 Api pdf(Api_remote.pdf)的参考:

int T32_WriteMemory(
   uint32_t  byteAddress
   int       access,
   uint8_t  *buffer,
   int       byteSize
);

byteAddress:开始写入的目标内存地址
访问:内存访问说明符
缓冲区:输出
byteSize:要读取的字节数

最佳答案

要通过TRACE32从python脚本中写入内存,请执行以下操作:
在TRACE32启用远程控制端口
获取用于TRACE32远程访问的已编译共享库(t32api.dll/.so)
在python脚本中加载t32api库(使用cytypes)
通过t32api库连接到TRACE32图形用户界面
声明T32\u WriteMemory的参数类型
使用要写入目标端的数据创建字节缓冲区
从t32api库调用T32_WriteMemory(使用cytypes)
在结束脚本之前关闭到TRACE32的连接
详细说明:
一。在TRACE32启用远程控制端口
将以下行添加到TRACE32配置文件(config.t32)中:

RCL=NETASSIST
PORT=20000

那个街区前后一定有空行。当然,您也可以为端口选择其他号码。使用这些设置启动的TRACE32 GUI打开UDP/IP端口,以侦听对远程控制TRACE32的可能请求。
2。获取用于TRACE32远程访问的已编译共享库
在TRACE32安装中,您可以在<T32>/demo/api/capi/dll找到所需的共享库(在Windows上,通常是C:\t32\demo\api\capi\dll),也可以在http://www.lauterbach.com/scripts.html下载(在那里搜索“capi”或“python”)
对于Windows,有t32api.dll和t32api64.dll。对于Linux,有t32api.so或t32api64.so。(t32api 64.*用于64位python解释器,而t32api.*用于32位python解释器。)
在下面的代码中,我假设您将t32api库放在与python脚本相同的目录中。
三。在python脚本中加载t32api库
import platform
import ctypes

ostype = ctypes.sizeof(ctypes.c_voidp) * 8
if (platform.system()=='Windows') or (platform.system()[0:6]=='CYGWIN') :
    # WINDOWS
    t32api = ctypes.CDLL("./t32api64.dll" if ostype==64 else "./t32api.dll")
elif platform.system()=='Darwin' :
    # Mac OS X
    t32api = ctypes.CDLL("./t32api.dylib")
else :
    # Linux
    t32api = ctypes.CDLL("./t32api64.so" if ostype==64 else  "./t32api.so")

在t32api库与python脚本不在同一目录下的情况下,您当然必须调整路径。
四。通过t32api库连接到TRACE32图形用户界面
# Declare UDP/IP socket of the TRACE32 instance to access
t32api.T32_Config(b"NODE=",b"localhost")
t32api.T32_Config(b"PORT=",b"20000")

# Connect to TRACE32
error = t32api.T32_Init()
if error != 0 :
    sys.exit("Can't connect to TRACE32!")

# Select to debugger component of TRACE32 (B:: prompt)
t32api.T32_Attach(1)

如果在步骤1中选择了另一个端口,则必须相应地更改行t32api.T32_Config(b"PORT=",b"20000")
5个。声明T32\u WriteMemory的参数类型
t32api.T32_WriteMemory.argtypes = [ctypes.c_uint32, ctypes.c_int, ctypes.c_char_p, ctypes.c_int]
t32api.T32_WriteMemory.restype  = ctypes.c_int

第一行告诉python T32_WriteMemory是一个C函数,它有四个参数,类型是uint32_t、int、char*和int。
第二行告诉python返回值的类型是int。
6。使用要写入目标端的数据创建字节缓冲区
wdata = 0x12345678  # <- Your own value here !
wbuffer = wdata.to_bytes(4, byteorder='little')

这里,0x12345678是我选择要写入的值。我的目标CPU,我通过TRACE32进行调试,它的内存按小字节顺序组织。所以我在创建字节缓冲区的第二行选择了“byteorder=”little“。
7号。从t32api库调用T32_WriteMemory
# Set parameters for the memory access
byteAddress = 0x46c8  # <- Your address here !
access      = 0x20
byteSize    = 4  # amount of bytes to write (e.g. 4 bytes)

# Write data to memory via TRACE32
error = t32api.T32_WriteMemory(byteAddress, access, wbuffer, byteSize)
if error != 0 :
    print("write failed")

access = 0x20在CPU运行时启用内存访问(如果在TRACE32中启用了SYStem.MemAccess并且CPU支持运行时访问),否则将其设置为0,或参阅TRACE32 API文档(API_remote.pdf)以获取其他值。
8个。结束脚本前关闭与TRACE32的连接
t32api.T32_Exit()

阅读记忆是这样的:
# Declare argument types of T32_T32_ReadMemory
t32api.T32_T32_ReadMemory.argtypes = [ctypes.c_uint32,ctypes.c_int, ctypes.c_char_p,ctypes.c_int]
t32api.T32_T32_ReadMemory.restype  = ctypes.c_int

# Create a buffer for the result
rbuffer = ctypes.create_string_buffer(byteSize)

# Request memory content via TRACE32
error = t32api.T32_ReadMemory(byteAddress, access, rbuffer, byteSize)
if error == 0 :
  # Extract 32-bit value in little endian order from the buffer
  data32 = int.from_bytes(rbuffer[0:4], byteorder='little')
  print("read  0x%08X from D:0x%08X" % (data32, byteAddress))
else:
  print("read failed")

关于python - 如何使用T32_WriteMemory函数将值写入python中的内存地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47687150/

10-13 07:32