Frage zu Funktionen
-
Hallo erstmal,
Ich will von einem Programm in die Funktion eines anderen Programmes springen, dazu folgendes erstmal innerhalb des selben Programmes:
#include <stdio.h> unsigned int defprog(){ printf("ich bin DRIN"); return defprog(); } //adresse von defprog() in adresse schreiben unsigned int adresse=(unsigned int)defprog; unsigned int chref(){ int a=0; *(&a+2)=adresse; //gebe dem befehlszeiger die adresse des programmes "defprog()" return 0; //programm fährt mit "defprog()" fort und nciht mit "main()" } int main(){ chref(); return 0; }man sieht hier also das ich dem programm manuel den ort von defprog() gebe und er es aufruft. Der Speicherort ist umgewandelt eine 7 stellige Int-Zahl.
#include <stdio.h> void expl(){ int a=0; *(&a+2)=4199120; } int main(){ expl(); return 0; }hier also ein anderes programm. Die zahl die dem befehlszeiger zugewiesen wird ist der ort des programmes defprog(). Hier wird aber nicht die Funktion aufgerufen, sondern das Programm stürzt unkontrolliert ab.
Ich vermute es hat was mit dem Offset Wert zu tun.
Also gibt es doch eine Möglichkeit von dem 2ten Prog in das erste zu springen?? Ich bin dankbar für Hinweis der mich verstehen lässt, was da genau passiert.
danke lg Aru
-
Nein, jedes Programm hat eigenen Speicher, auf den andere nicht zugreifen können. Vielleicht bietet das OS aber Funktionen für so etwas an.
-
Unter Windows:
ReadProcessMemory/WriteProcessMemory
-
aru schrieb:
Hallo erstmal,
Ich will von einem Programm in die Funktion eines anderen Programmes springen, dazu folgendes erstmal innerhalb des selben Programmes:
<snip>
man sieht hier also das ich dem programm manuel den ort von defprog() gebe und er es aufruft. Der Speicherort ist umgewandelt eine 7 stellige Int-Zahl.<snip>
hier also ein anderes programm. Die zahl die dem befehlszeiger zugewiesen wird ist der ort des programmes defprog(). Hier wird aber nicht die Funktion aufgerufen, sondern das Programm stürzt unkontrolliert ab.
Ich vermute es hat was mit dem Offset Wert zu tun.
Also gibt es doch eine Möglichkeit von dem 2ten Prog in das erste zu springen?? Ich bin dankbar für Hinweis der mich verstehen lässt, was da genau passiert.
danke lg Aru
Wenn du mir erklärst, was du vorhast, dann erkläre ich dir, warum das nicht funktioniert.
-
okay danke erstmal.
@DocShoe naja was hab ich vor... ich studiere Informatik und der Dozent meinte, das prinzipiel alles möglich ist. Wir sollen verschiedene Dinge ausprobieren und dann erklären was da passiert, warum das eine möglich ist und etwas anderes nicht. (Ist ein Seminar)
und jetzt klär mich auf, für was steht die zahl der adresse?

-
Alle modernen Betriebssysteme, die ich kenne, haben Speicherschutz und virtuelles Speichermanagement, das heißt, du hast im Programm keinen Zugriff mehr auf absolute physische Speicheradressen, sondern nur noch auf virtuelle, die vom OS auf physischen Speicher abgebildet werden. Das bedeutet unter anderem auch, dass jeder Prozess seinen eigenen virtuellen Adressraum hat, der normalerweise nur von ihm beschrieben werden kann. Wenn du also in einem Prozess in einen Speicherbereich schreibst, dann hat das keinen Einfluss auf den Speicherbereich anderer Prozesse. Und deshalb kannst du nicht in einem Prozess eine Speicheradresse auslesen und diese Adresse in einem anderen Prozess anspringen. Die Adressen sind zwar gleich für Prozess A und B, aber die Speicherinhalte unterscheiden sich. Für Prozess A ist er definiert, weil es der Beginn des Funktionscodes ist, für Prozess B ist er allerdings undefiniert, weil B einen anderen Adressraum besitzt, daher auch deine Abstürze. Windows bietet für solche Zwecke Funktionen an, die auf den Adressraum anderer Prozess zugreifen können, wenn der Aufrufer entsprechende Rechte besitzt (sprach EOutOfResources schon an).
-
Für Variablen würde sich evtl auch noch ein Shared-Memory anbieten. Boost ein ein ziemlich cooles Interface dafür.
-
@aru: Darf ich dich darauf aufmerksam machen, daß schon das erste Programm nicht standardkonform ist?
Erstens ist es schon undefiniert, einen Funktionszeiger in einen "normalen" Zeiger umzuwandeln, von einem int gar nicht zu reden.
Zweitens ist es nicht gesichert, daß du mit*(&a+2)wirklich die Rücksprungadresse der Funktion überschreibst.
Und drittens machst du den Stack vermutlich noch mehr kaputt, wenn die defprog()-Funktion endet.
-
jau danke, das ist mir bewusst, das Programm kehrt dannach auch nicht wieder in die main funktion zurück. Wie gesagt ich wollte nur erforschen, was die Sprache zulässt und wie sie auf bestimmte befehle reagiert, die außerhalb der Norm sind. danke für die Erläuterungen