В этой программе есть функция, которая в настоящее время возвращает 1. Я бы предпочел, чтобы она возвращала 0.
Из этого я делаю вывод: мы можем добавить смещение к программному счетчику, uregs[R_PC]+arg0
, чтобы найти адрес возвращаемого значения.
Я выделил 32-битный «0» и пытаюсь записать 2 его байта по адресу, где находится возвращаемое значение (наша функция ожидает возврата BOOL16, поэтому нам нужно только 2 байта 0):
sudo dtrace -p "$(getpid)" -w -n '
int *zero;
BEGIN { zero=alloca(4); *zero=0; }
pid$target::TextOutA:return {
copyout(zero, uregs[R_PC]+arg0, 2);
}'
Конечно, я получаю:
dtrace: ошибка при включенном идентификаторе зонда 2 (ID 320426: pid60498:gdi32.dll.so:TextOutA:return): неверный адрес (0x41f21c) в действии №1 при смещении DIF 60
uregs[R_PC]
предположительно является адресом пользовательского пространства. Вероятно, copyout()
нужен адрес ядра.
Как преобразовать адрес пользовательского пространства uregs[R_PC]
в пространство ядра? Я знаю, что с помощью copyin()
мы можем считывать данные, хранящиеся по адресу пользовательского пространства, в пространство ядра. Но это не дает нам адрес ядра этой памяти.
В качестве альтернативы: есть ли другой способ изменить возвращаемое значение с помощью DTrace?
arg0 + u_regs[R_PC];
получает адрес возвращаемого значения. Это два адреса. Добавлять их смысла нет. Как узнать адрес возвращаемого значения? Это вполне может быть передано через реестр. Фактическое возвращаемое значение находится вarg1
. См. docs.oracle.com/cd/E19253. -01/817-6223/chp-pid/index.html - person Andrew Henle   schedule 30.07.2017u_regs[R_PC]
— это счетчик программ, аarg0
— это смещение от счетчика программ. таким образом,u_regs[R_PC]
будет абсолютным адресом, аarg0
будет относительным смещением, которое вы можете добавить к этому абсолютному адресу, чтобы получить другой абсолютный адрес. - person Birchlabs   schedule 31.07.2017arg1
: конечно, это содержит значение, но я намеревался изменить значение до того, как функция вернет его. единственный инструмент, который у нас есть для изменения данных в DTrace (copyout()
), требует, чтобы мы знали адрес данных. - person Birchlabs   schedule 31.07.2017