Es gibt eine Funktion in diesem Programm, das zur Zeit ein 1. kehrt ziehe ich würde für sie ein 0.Wie Rückgabewert von Funktion ändern
uregs[R_PC]
is the program counter zurückzukehren.arg0
is the program counter offset from where we left the function (assembly, "ret").
Daraus ich ableiten: wir den Offset zu dem Programmzähler hinzufügen können, uregs[R_PC]+arg0
, die Adresse des Rückgabewertes zu finden.
Ich habe eine 32-Bit "0" zugewiesen, und ich versuche, 2 Bytes davon in die Adresse schreiben, wo der Rückgabewert lebt (unsere Funktion erwartet eine BOOL16 zurückgeben, so dass wir nur 2 Bytes von 0 benötigen) :
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);
}'
natürlich bekomme ich:
dtrace: Fehler auf aktivierten Sonde ID 2 (ID 320426: pid60498: gdi32.dll.so: TextOutA: return): ungültige Adresse (0x41f21c) in Aktion # 1 bei DIF-Offset 60
uregs[R_PC]
ist vermutlich eine Userspace-Adresse. Wahrscheinlich copyout()
will eine Kerneladresse.
Wie übersetze ich die Userspace-Adresse uregs[R_PC]
in kernel-space? Ich weiß, dass wir mit copyin()
Daten lesen können, die unter User-Space-Adresse in Kernel-Space gespeichert sind. Aber das gibt uns nicht die Kernadresse dieses Speichers.
Alternativ: Gibt es eine andere Möglichkeit, den Rückgabewert mithilfe von DTrace zu ändern?
Ich sehe nicht, wie 'arg0 + u_regs [R_PC];' bekommt Sie die Adresse des Rückgabewerts. Das sind zwei Adressen. Hinzufügen von ihnen scheint keinen Sinn zu machen. Woher kennen Sie die Adresse des Rückgabewerts? Es könnte sehr gut über Register weitergegeben werden. Der tatsächliche Rückgabewert * ist in "arg1". Siehe http://docs.oracle.com/cd/E19253-01/817-6223/chp-pid/index.html –
mein Verständnis aus der Dokumentation ist, dass 'u_regs [R_PC]' ist der Programmzähler, und das ' arg0' ist ein _offset vom Programmzähler_. "u_regs [R_PC]' ist also eine _absolute_ Adresse, und 'arg0' ist ein _relative offset_, das Sie zu dieser absoluten Adresse hinzufügen können, um zu einer anderen absoluten Adresse zu gelangen. – Birchlabs
wie für 'arg1': sicherlich hält dies den _value_, aber meine Absicht war es, den Wert zu modifizieren, bevor die Funktion it_ zurückgibt. Das einzige Werkzeug, das wir zum Ändern von Daten in DTrace ('copyout()') haben, erfordert, dass wir die Adresse der Daten kennen. – Birchlabs