<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Funktion in Stack Array aufrufen]]></title><description><![CDATA[<p>Hallo ihr.</p>
<p>Ich versuche den Code einer Funktion sozusagen &quot;dynamisch&quot; nachzuladen. Zurzeit is das noch nebensächlich und ich kopiere lediglich eine Schon vorhandene Funktion an eine Andere Stelle.</p>
<p>Wenn man diese aber aufrufen will stürtzt das Programm ab...</p>
<p>erstmal mein Programm:</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

using namespace std;

typedef void (*pFunc)();

void Func1()
{
    system(&quot;PAUSE&quot;);
    return;
}

int main()
{
    char codedata[512];                                 // Feld für Kopie von Func1

 // char * codedata = (char *) malloc(512);             // Funktionier ebenso wenig, gleicher Fehler

    void * src = (void *) &amp;Func1;                       // Zeiger auf Func1
    void * dst = (void *) &amp;codedata;                    // Zeiger auf codedata

    memcpy(dst,src,30);                                 // Code von Func1 in codedata kopieren
                                                        // Laut gdb sind es 19 Bytes, mehr schadet ja nicht

    printf(&quot;Original Address: %i\n&quot;,&amp;Func1);            // Nur zum testen drinne
    printf(&quot;Will now jump to  %i\n&quot;,&amp;codedata);         // s.o.

    system(&quot;PAUSE&quot;);                                    // Bis hier funktionierts

    ((pFunc)&amp;codedata)();                               // Code in codedata ausführen (Kopie von Func1)
                                                        // SEGMENTION FAULT

    system(&quot;PAUSE&quot;);

    return 0;
}
</code></pre>
<p>und die ausgabe des gdb beim ausführen:</p>
<pre><code>(gdb) run
Starting program: C:\bin\code\cpp\memcode\Output\MingW\Project1.exe
[New thread 4712.0x1350]
Error: dll starting at 0x77680000 not found.
Error: dll starting at 0x76fc0000 not found.
Error: dll starting at 0x77680000 not found.
Error: dll starting at 0x777a0000 not found.
Original Address: 4199374
Will now jump to  2682656
Error: dll starting at 0x4ab50000 not found.
Drücken Sie eine beliebige Taste . . .

Program received signal SIGSEGV, Segmentation fault.
0x002a40ca in ?? ()
</code></pre>
<p>jemand eine Idee sowas zum laufen zu bekommen?</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/264080/funktion-in-stack-array-aufrufen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 10:33:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/264080.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 01 Apr 2010 14:54:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktion in Stack Array aufrufen on Thu, 01 Apr 2010 14:54:36 GMT]]></title><description><![CDATA[<p>Hallo ihr.</p>
<p>Ich versuche den Code einer Funktion sozusagen &quot;dynamisch&quot; nachzuladen. Zurzeit is das noch nebensächlich und ich kopiere lediglich eine Schon vorhandene Funktion an eine Andere Stelle.</p>
<p>Wenn man diese aber aufrufen will stürtzt das Programm ab...</p>
<p>erstmal mein Programm:</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

using namespace std;

typedef void (*pFunc)();

void Func1()
{
    system(&quot;PAUSE&quot;);
    return;
}

int main()
{
    char codedata[512];                                 // Feld für Kopie von Func1

 // char * codedata = (char *) malloc(512);             // Funktionier ebenso wenig, gleicher Fehler

    void * src = (void *) &amp;Func1;                       // Zeiger auf Func1
    void * dst = (void *) &amp;codedata;                    // Zeiger auf codedata

    memcpy(dst,src,30);                                 // Code von Func1 in codedata kopieren
                                                        // Laut gdb sind es 19 Bytes, mehr schadet ja nicht

    printf(&quot;Original Address: %i\n&quot;,&amp;Func1);            // Nur zum testen drinne
    printf(&quot;Will now jump to  %i\n&quot;,&amp;codedata);         // s.o.

    system(&quot;PAUSE&quot;);                                    // Bis hier funktionierts

    ((pFunc)&amp;codedata)();                               // Code in codedata ausführen (Kopie von Func1)
                                                        // SEGMENTION FAULT

    system(&quot;PAUSE&quot;);

    return 0;
}
</code></pre>
<p>und die ausgabe des gdb beim ausführen:</p>
<pre><code>(gdb) run
Starting program: C:\bin\code\cpp\memcode\Output\MingW\Project1.exe
[New thread 4712.0x1350]
Error: dll starting at 0x77680000 not found.
Error: dll starting at 0x76fc0000 not found.
Error: dll starting at 0x77680000 not found.
Error: dll starting at 0x777a0000 not found.
Original Address: 4199374
Will now jump to  2682656
Error: dll starting at 0x4ab50000 not found.
Drücken Sie eine beliebige Taste . . .

Program received signal SIGSEGV, Segmentation fault.
0x002a40ca in ?? ()
</code></pre>
<p>jemand eine Idee sowas zum laufen zu bekommen?</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1876445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1876445</guid><dc:creator><![CDATA[Phype]]></dc:creator><pubDate>Thu, 01 Apr 2010 14:54:36 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion in Stack Array aufrufen on Thu, 01 Apr 2010 15:11:30 GMT]]></title><description><![CDATA[<p>Das ist schwarze Magie... für sowas sollte man Leute *zensiert*<br />
Wird so nicht funktionieren, da in einer Funktion nicht nur relative Sprünge vorkommen können, sondern auch Sprünge an absolute Adressen. Wenn du nur einfach den Funktionscode an eine andere Adresse kopierst änderst du die Sprungadressen nicht und springst an die alte Adresse.<br />
Ausserdem (so genau kenn ich mich da jetzt nicht aus) besitzen moderne Prozessoren ein No Execution Bit für bestimmte Speicherbereiche, die das Ausnutzen von Buffer Overflows verhindern sollen. In genau diese Kategorie fällt aber auch dein Vorhaben, sodass selbst das OS etwas dagegen haben könnte, Funktionen im Datensegment auszuführen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1876451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1876451</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Thu, 01 Apr 2010 15:11:30 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion in Stack Array aufrufen on Thu, 01 Apr 2010 15:12:05 GMT]]></title><description><![CDATA[<p>Pfui!</p>
<p>Code &quot;dynamisch&quot; nachladen macht man mit Hilfe des Betriebssystems. Unter Windows mit LoadLibrary und unter Linux mit dlopen.</p>
<p>Phype schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void * src = (void *) &amp;Func1;      // Zeiger auf Func1
  void * dst = (void *) &amp;codedata;   // Zeiger auf codedata
  memcpy(dst,src,30);                // Code von Func1 in codedata kopieren
</code></pre>
</blockquote>
<p>Zugriff auf die Bytes bei *src: Undefiniertes Verhalten, da die Addresse in src kein richtiger Objekt-Zeiger sondern nur ein reinterpretierter Funktionszeiger ist.</p>
<p>Phype schrieb:</p>
<blockquote>
<pre><code class="language-cpp">((pFunc)&amp;codedata)();            // Code in codedata ausführen
                                   // SEGMENTION FAULT
</code></pre>
</blockquote>
<p>Kein Wunder. Du hast einen Reinterpret-Cast auf einen Funktionpointer-Typen und willst die &quot;Funktion&quot; aufrufen, die keine ist. Du kannst nicht einfach Daten und Code vermischen oder das eine wie das andere behandeln -- nicht ohne die Hilfe des Betriebssystems. Siehe <a href="http://de.wikipedia.org/wiki/Schutzmodus" rel="nofollow">http://de.wikipedia.org/wiki/Schutzmodus</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1876452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1876452</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 01 Apr 2010 15:12:05 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion in Stack Array aufrufen on Thu, 01 Apr 2010 15:43:03 GMT]]></title><description><![CDATA[<p>Stimmt an Dll's / Libraries hab ich garnicht geadcht.</p>
<p>dankeschön, für den hinweis</p>
<p>mfg</p>
<p>*gelöst, bzw als nicht lösbar geklärt*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1876458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1876458</guid><dc:creator><![CDATA[Phype]]></dc:creator><pubDate>Thu, 01 Apr 2010 15:43:03 GMT</pubDate></item></channel></rss>