Общее решение этой проблемы состоит в том, чтобы фактически использовать две точки останова.
Сначала мы решаем проблему A, сохраняя нужные значения в переменных LLDB:
break set -G true -n generateMoreData
break command add 1
> expr long $destination = $rsi
> expr long $size = $rdi
> DONE
-G true
гарантируетчто программа продолжается автоматически после выполнения всех команд, и с помощью expr
можно сохранить содержимое регистра в переменных, которые мы называем $destination
и $size
.
. Для решения проблемы B нам нужна еще одна точка останова.по инструкции возврата generateMoreData
.В случае, если generateMoreData
имеет более одной инструкции возврата, нам понадобится точка останова для каждой из них, но давайте предположим, что это довольно простая функция и имеет только одну точку останова, как это часто бывает.
Сначаланам нужно взломать эту функцию, поэтому мы просто устанавливаем для нее нормальную точку останова и позволяем отладчику поразить ее.Затем мы можем разобрать функцию, используя dis
.Вывод может выглядеть примерно так, как показано ниже:
-> 0x7fff76be0bac <+0>: pushq %rbp
0x7fff76be0bad <+1>: movq %rsp, %rbp
0x7fff76be0bb0 <+4>: pushq %r14
0x7fff76be0bb2 <+6>: pushq %rbx
0x7fff76be0bb3 <+7>: subq $0x40, %rsp
:
0x7fff76be0c5f <+179>: popq %r14
0x7fff76be0c61 <+181>: popq %rbp
0x7fff76be0c62 <+182>: retq
0x7fff76be0c63 <+183>: nop
Абсолютные адреса часто бесполезны, так как они могут меняться между двумя запусками программы (например, из-за ASLR, рандомизации расположения адресного пространства), интересных адресовявляются относительными (<+...>
).Знание того, что есть возврат в +182
, позволяет нам установить точку останова, и таким образом мы можем решить проблему B:
break set -G true -n generateMoreData -R 182
break command add 2
> x -o generateMoreData.txt --append-outfile -c `$size` $destination
> DONE
-R
устанавливает относительное смещение в байтах.Захваченные данные записываются в generateMoreData.txt
для последующей проверки (-o
устанавливает выходной файл и --append-outfile
обеспечивает добавление новых данных вместо перезаписи существующих).
Теперь просто запустите программу и в конце вы можете проверить все сгенерированные данные в выходном файле.