有這個程序的功能,目前返回我更希望它返回一個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