有这个程序的功能,目前返回我更希望它返回一个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:无效的地址(0x41f21c)中:上启用探头ID 2(:pid60498:gdi32.dll.so:TextOutA:返回ID 320426)错误在DIF偏移60的动作#1
uregs[R_PC]
可能是一个用户空间地址。可能copyout()
想要一个内核地址。
如何将用户空间地址uregs[R_PC]
转换为内核空间?我知道用copyin()
我们可以将存储在用户空间地址的数据读入内核空间。但是这并没有给我们该内存的内核地址。
或者:是否有其他方法可以使用DTrace更改返回值?
我看不到'arg0 + u_regs [R_PC];'得到你返回值的地址。那是两个地址。添加它们似乎没有意义。你怎么知道返回值的地址?它很可能通过寄存器传递。实际的返回值*在'arg1'中。请参阅http://docs.oracle.com/cd/E19253-01/817-6223/chp-pid/index.html –
我从文档中了解到'u_regs [R_PC]'是程序计数器,而' arg0'是程序counter_的一个_offset。所以,'u_regs [R_PC]'将是一个_absolute_地址,'arg0'是一个_relative_offset_,你可以添加到该绝对地址,以获得不同的绝对地址。对于'arg1', – Birchlabs
:当然这是_value_,但我的意图是在函数返回it_之前修改该值。我们在DTrace中修改数据的唯一工具('copyout()')要求我们知道数据的地址。 – Birchlabs