Как использовать python для чтения и записи регистра через LLDB? - PullRequest
1 голос
/ 03 апреля 2019

Я пытаюсь использовать python для чтения / записи регистра, когда он достигает точки останова.

Мне удалось выполнить простой скрипт на Python при срабатывании точки останова.

У меня проблема с чтением и записью одного регистра. Я могу получить список регистров, но не регистр.

* thread #1, stop reason = signal SIGSTOP
    frame #0: 0x000000010521562c dyld` ImageLoaderMachO::usablePrebinding(ImageLoader::LinkContext const&) const  + 56
dyld`ImageLoaderMachO::usablePrebinding:
->  0x10521562c <+56>: ldrb   w8, [x19, #0x76]
    0x105215630 <+60>: ldrh   w9, [x19, #0x74]
    0x105215634 <+64>: bfi    w9, w8, #16, #8
    0x105215638 <+68>: tbz    w9, #0x9, 0x105215694     ; <+160>
    0x10521563c <+72>: ldr    x8, [x19]
    0x105215640 <+76>: ldr    x8, [x8, #0x378]
    0x105215644 <+80>: mov    x0, x19
    0x105215648 <+84>: blr    x8
Target 0: (BBM) stopped.
(lldb) script
Python Interactive Interpreter. To exit, type 'quit()', 'exit()' or Ctrl-D.
>>> print lldb.frame.registers

Кто-нибудь может мне помочь, какой Python API я могу использовать для изменения значения регистра x1?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

Свойство registers в SBFrames - это SBValueList, в котором хранятся наборы регистров (GPR и т. Д.).Каждый набор регистров является SBValue, а отдельные регистры представлены как дочерние элементы набора регистров, причем дочернее имя является именем регистра.x1 - это GPR, а GPR всегда являются первым регистром, установленным в registers.SBValueList также GetFirstValueByName, чтобы получить элемент по имени, так что вы также можете найти «Регистр общего назначения» программно.

Таким образом, вы бы сделали что-то вроде:

error = lldb.SBError()
did_change = lldb.frame.registers[0].GetChildMemberWithName('x1').SetValueFromCString("0x12345",error)

SetValueFromCString возвращает True, если ему удалось изменить значение, и если это не так, причина будетхранятся в параметре error.

Обратите внимание, что энергозависимые регистры, такие как x1, не сохраняются при вызове функций, поэтому вы можете получить доступ или изменить их значения только в текущем фрейме.

SBValues ​​описаны здесь:

https://lldb.llvm.org/python_reference/lldb.SBValue-class.html

, если вы хотите знать, что еще вы можете с ними сделать.

1 голос
/ 06 апреля 2019

Альтернативой свойству registers является свойство register. Это удобный доступ к регистрам по имени. Например:

(lldb) script print lldb.frame.register["x1"].value
(lldb) script lldb.frame.register["x1"].value = "0"
...