<?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[Überschreiben von Funktionen im eigenen Prozess]]></title><description><![CDATA[<p>Ich suche schon seit längerem nach einer Möglichkeit eine Funktion zu überschreiben z.b. die Funktion send steht an der Addresse 0x752CC4C8, nun hatte ich vor genau an diese Stelle eine andere Funktion zu schreiben mit den selben Parametern. So eine Art Funktions hooking nur ohne Detour. Warum ohne Detour? aus dem grund ,dass eig. jeder eine Library benutzen kann ich würde aber lieber das Prinzip verstehen.Möglich wäre auch die Funktion per WriteProcessMemory in den Speicher zu schreiben allerdings gibts da immer das Problem , die Funktionsgröße zu berechnen etc außerdem soll es ja nur im eigenen Prozess funktionieren.Daher war der erste Ansatz mit Funktionszeigern. Erster Ansatz:</p>
<pre><code class="language-cpp">//Die Basis Funktion welche später überschrieben werden soll
void NormalFunction(void)
{

std::cout&lt;&lt;&quot;Basic Funktion with Address: &quot;&lt;&lt;&amp;NormalFunction&lt;&lt;std::endl;

}

//Die Funktion ,mit welcher später die Basis Funktion überschrieben werden soll
void OverwritingFunction(void)
{

std::cout&lt;&lt;&quot;Overwrite Funktion with Address: &quot;&lt;&lt;&amp;OverwritingFunction&lt;&lt;std::endl;

}

//Funktionszeiger
typedef void(*pFunc)(void);

int main(int argvalue,char **arguments)
{
unsigned long *FuncAddr=reinterpret_cast&lt;unsigned long*&gt;(&amp;NormalFunction);
//überprüfen ob die richtige Addresse in FuncAddr steht
cout&lt;&lt;&amp;NormalFunction&lt;&lt;endl;
cout&lt;&lt;FuncAddr&lt;&lt;endl;
//Funktionszeiger erstellen
pFunc MyFunc=reinterpret_cast&lt;pFunc&gt;(FuncAddr);
//Funktion aufrufen um zu schauen ob die konvertierung erfolgreich war
MyFunc();
//Versuchen die Funktion zu überschreiben durch einen Funktionszeiger auf die //Funktionsaddresse sowie deferenzierung und Zuweisung
//Hier passiert der Fehler ( Zugriffsverletzung beim Schreiben an Position //[FuncAddr])
(*reinterpret_cast&lt;pFunc*&gt;(FuncAddr))=OverwritingFunction;
system(&quot;Pause&quot;);
return 0;
}
</code></pre>
<p>Falls jemand eine Idee hat , wie man es stattdessen lösen kann wäre ich immer offen für Kritik sowie Kreativität.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/302199/überschreiben-von-funktionen-im-eigenen-prozess</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 18:55:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/302199.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 13 Apr 2012 09:26:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Überschreiben von Funktionen im eigenen Prozess on Fri, 13 Apr 2012 09:35:38 GMT]]></title><description><![CDATA[<p>Ich suche schon seit längerem nach einer Möglichkeit eine Funktion zu überschreiben z.b. die Funktion send steht an der Addresse 0x752CC4C8, nun hatte ich vor genau an diese Stelle eine andere Funktion zu schreiben mit den selben Parametern. So eine Art Funktions hooking nur ohne Detour. Warum ohne Detour? aus dem grund ,dass eig. jeder eine Library benutzen kann ich würde aber lieber das Prinzip verstehen.Möglich wäre auch die Funktion per WriteProcessMemory in den Speicher zu schreiben allerdings gibts da immer das Problem , die Funktionsgröße zu berechnen etc außerdem soll es ja nur im eigenen Prozess funktionieren.Daher war der erste Ansatz mit Funktionszeigern. Erster Ansatz:</p>
<pre><code class="language-cpp">//Die Basis Funktion welche später überschrieben werden soll
void NormalFunction(void)
{

std::cout&lt;&lt;&quot;Basic Funktion with Address: &quot;&lt;&lt;&amp;NormalFunction&lt;&lt;std::endl;

}

//Die Funktion ,mit welcher später die Basis Funktion überschrieben werden soll
void OverwritingFunction(void)
{

std::cout&lt;&lt;&quot;Overwrite Funktion with Address: &quot;&lt;&lt;&amp;OverwritingFunction&lt;&lt;std::endl;

}

//Funktionszeiger
typedef void(*pFunc)(void);

int main(int argvalue,char **arguments)
{
unsigned long *FuncAddr=reinterpret_cast&lt;unsigned long*&gt;(&amp;NormalFunction);
//überprüfen ob die richtige Addresse in FuncAddr steht
cout&lt;&lt;&amp;NormalFunction&lt;&lt;endl;
cout&lt;&lt;FuncAddr&lt;&lt;endl;
//Funktionszeiger erstellen
pFunc MyFunc=reinterpret_cast&lt;pFunc&gt;(FuncAddr);
//Funktion aufrufen um zu schauen ob die konvertierung erfolgreich war
MyFunc();
//Versuchen die Funktion zu überschreiben durch einen Funktionszeiger auf die //Funktionsaddresse sowie deferenzierung und Zuweisung
//Hier passiert der Fehler ( Zugriffsverletzung beim Schreiben an Position //[FuncAddr])
(*reinterpret_cast&lt;pFunc*&gt;(FuncAddr))=OverwritingFunction;
system(&quot;Pause&quot;);
return 0;
}
</code></pre>
<p>Falls jemand eine Idee hat , wie man es stattdessen lösen kann wäre ich immer offen für Kritik sowie Kreativität.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201508</guid><dc:creator><![CDATA[Dezimiert]]></dc:creator><pubDate>Fri, 13 Apr 2012 09:35:38 GMT</pubDate></item><item><title><![CDATA[Reply to Überschreiben von Funktionen im eigenen Prozess on Fri, 13 Apr 2012 09:37:20 GMT]]></title><description><![CDATA[<p>Der Funktionszeiger <strong>IST</strong> Dein API-Hook. Den lässt Du auf die andere Funktion zeigen, und fertig ist die Brause. Direkt kannst Du das auf jeden Fall nicht nachbilden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201511</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201511</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 13 Apr 2012 09:37:20 GMT</pubDate></item><item><title><![CDATA[Reply to Überschreiben von Funktionen im eigenen Prozess on Fri, 13 Apr 2012 09:47:58 GMT]]></title><description><![CDATA[<p>Hmm ich glaube ich hab mich falsch ausgedrückt , soviel ist mir klar aber mir geht es darum nun die NormaleFunction aufzurufen sodass automatisch meine OverwritingFunction aufgerufen wird.</p>
<pre><code class="language-cpp">//Sobald die Funktion überschrieben ist soll die nächste Zeile die Funktion //OverwritingFunction aufrufen,dasss heißt das die NormalFunction eigentlich //nicht mehr existiert
NormalFunction();
</code></pre>
<p>Das ist der Zweck mir ist klar das ich mit einem Funktionszeiger auf alle void(void) Funktionen zeigen kann</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201521</guid><dc:creator><![CDATA[Dezimiert]]></dc:creator><pubDate>Fri, 13 Apr 2012 09:47:58 GMT</pubDate></item><item><title><![CDATA[Reply to Überschreiben von Funktionen im eigenen Prozess on Fri, 13 Apr 2012 09:49:15 GMT]]></title><description><![CDATA[<p>Damit meine ich das der Speicherbereich der alten Funktion komplett überschrieben wurde , sodass NormalFunction() dasselbe ist wie OverwritingFunction()</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201522</guid><dc:creator><![CDATA[Dezimiert]]></dc:creator><pubDate>Fri, 13 Apr 2012 09:49:15 GMT</pubDate></item><item><title><![CDATA[Reply to Überschreiben von Funktionen im eigenen Prozess on Fri, 13 Apr 2012 10:32:18 GMT]]></title><description><![CDATA[<p>Dezimiert schrieb:</p>
<blockquote>
<p>Damit meine ich das der Speicherbereich der alten Funktion komplett überschrieben wurde , sodass NormalFunction() dasselbe ist wie OverwritingFunction()</p>
</blockquote>
<p>Warum sollte das gehen? Das ist auch bei Detours nicht so. Da wird nur ein Zeiger in der Symboltabelle umgebogen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201534</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 13 Apr 2012 10:32:18 GMT</pubDate></item><item><title><![CDATA[Reply to Überschreiben von Funktionen im eigenen Prozess on Fri, 13 Apr 2012 10:43:48 GMT]]></title><description><![CDATA[<p>Ok ich kenne mich mit der Funktionsweise von Detour leider nicht gut, da ich vorhatte es lieber selbst zu schreiben, dass einzige was ich brauche ist eine Nachricht, welche geschickt wird sobald die eigentliche Funktion aufgerufen wird.<br />
Ich hatte vor in diesem Fall z.b. eine vordefinierte Funktion von Windows zu hooken und somit zusätzliche Fehlerabfragen einzubauen, oder anderweitige Sachen. Also habe ich mir überlegt , dasss eine Funktion immer aufgerufen wird , wenn der IP(Instruction Pointer) auf die Addresse zeigt an welcher die Funktion steht.Ich dachte nun es wäre das einfachste die orginale Funktion zu überschreiben, sodass meine eigene Funktion an der Stelle steht , an welche der Instruction Poingter beim Aufruf der Original Funktion zeigt. Aber ich danke dir Tachyon. Leider kann ich mit deinem Post nicht ganz so viel anfangen , da ich jetzt trotzdem nicht weiß wie ich meine Funktion hooken soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201545</guid><dc:creator><![CDATA[Dezimiert]]></dc:creator><pubDate>Fri, 13 Apr 2012 10:43:48 GMT</pubDate></item><item><title><![CDATA[Reply to Überschreiben von Funktionen im eigenen Prozess on Fri, 13 Apr 2012 10:52:58 GMT]]></title><description><![CDATA[<p>Du musst mal etwas konkreter beschreiben, was Du machen willst. Wo sind z.B. die Funktionen definiert? Hast Du zwei Prozesse, von denen einer, in einem anderen irgendwie irgendwelche Funktionsaufrufe abfangen soll? Befindet sich das alles im gleichen Prozess? Sind da irgendwelche APIs und Libs im Spiel? Kommt alles von Dir, oder ist da irgendwelchen 3rd-Party Zeugs im Spiel, auf das Du keinen Einfluss hast? Fragen über Fragen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201551</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 13 Apr 2012 10:52:58 GMT</pubDate></item><item><title><![CDATA[Reply to Überschreiben von Funktionen im eigenen Prozess on Fri, 13 Apr 2012 11:06:21 GMT]]></title><description><![CDATA[<p>Ich habe selbst einen UDP Server geschrieben , welcher mit 10 clienten gleichzeitig arbeiten, da über den Server bis zu 512 mb geschickt werden hat jeder Client einen Thread. Dieser Thread bearbeitet sämtliche Messages, er fängt außerdem disconnects eines Clienten ab.Da ich nur auf großen Umwegen sozusagen in den Thread reinkomme , hatte ich vor eine Art Debug Programm zu schreiben. Dieses fängt durch das hooken der Funktion sendto alle Dateien ab welche gesendet werden sollen überprüft den Inhalt auf Fehler und schickt sie weiter. Da der Server schon geschrieben ist und ich nicht mehr an den Quellcode rankomme um den Code zu ändern und Fehler abzufangen, muss ich ein Programm schreiben , welches sich in den Server einklinkt und alle gesendeten Daten erstmal abfängt. Da bei dem Server ungefähr jedes 1000 Paket verlorengeht muss ich an die Pakete rankommen. Mein Betriebssystem ist Windows 7 sodass RAW-Sockets auch nicht der Bringer sind.<br />
Ich hoffe das waren genug Infos.Ich wollte damit anfangen erstmal selbstgeschriebene Funktionen zu hooken und dann später zu WINAPI Funktionen überzugehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201556</guid><dc:creator><![CDATA[Dezimiert]]></dc:creator><pubDate>Fri, 13 Apr 2012 11:06:21 GMT</pubDate></item><item><title><![CDATA[Reply to Überschreiben von Funktionen im eigenen Prozess on Fri, 13 Apr 2012 11:07:40 GMT]]></title><description><![CDATA[<p>Ich habe die Addresse von sendto logischerweise da der Prozess die ws2_32.dll geladen hat und die dll denselben speicherbereich nutzt wie die exe kann ich durch den &amp; operator abfragen wo sendto steht.Das Einklinken mit der Dll ist kein Problem allerdings die Funktion zu hooken schon , und da ich gerne auch was dabei lernen würde wollte ich das selbstschreiben. Der Server ist von mir.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201559</guid><dc:creator><![CDATA[Dezimiert]]></dc:creator><pubDate>Fri, 13 Apr 2012 11:07:40 GMT</pubDate></item><item><title><![CDATA[Reply to Überschreiben von Funktionen im eigenen Prozess on Fri, 13 Apr 2012 11:12:59 GMT]]></title><description><![CDATA[<p>Dezimiert schrieb:</p>
<blockquote>
<p>Ich habe die Addresse von sendto logischerweise da der Prozess die ws2_32.dll geladen hat und die dll denselben speicherbereich nutzt wie die exe kann ich durch den &amp; operator abfragen wo sendto steht[...]</p>
</blockquote>
<p>Verstehe ich nicht. Ich denke, Du hast keinen Quellcode. Ansonsten: Ist die Adresse den wirklich immer gleich? Address space layout randomization und so?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201563</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 13 Apr 2012 11:12:59 GMT</pubDate></item><item><title><![CDATA[Reply to Überschreiben von Funktionen im eigenen Prozess on Fri, 13 Apr 2012 11:35:32 GMT]]></title><description><![CDATA[<p>Ja aber ich habe den Server ja geschrieben,deswegen habe ich nen großteil des Quellcodes noch im Kopf,aber für gezielte Fehlersuche im Programm reicht es nicht.Ich lade die ws2_32.dll von hand im sever, da ich nur wenige Funktionen brauche. Die Addresse ist egal da die Dll wie gesagt den selben Speicherbereich hat, include ich in die Dll &quot;winsock2.h&quot;<br />
und bekomme so immer die Addresse der send Funktion raus:<br />
unsigned long addr=reinterpret_cast&lt;unsigned long&gt;(&amp;send);<br />
Da mein Server ja aufjeden Fall ws2_32.dll geladen hat steht die Funktion send auch auf jedenfall im Speicher</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201571</guid><dc:creator><![CDATA[Dezimiert]]></dc:creator><pubDate>Fri, 13 Apr 2012 11:35:32 GMT</pubDate></item><item><title><![CDATA[Reply to Überschreiben von Funktionen im eigenen Prozess on Fri, 13 Apr 2012 12:19:22 GMT]]></title><description><![CDATA[<p>So habe mittlerweile eine Lösung gefunden geht leider nur mit WriteProcessMemory sonst gibts ne AccessViolation. Die Lösung war an den anfang der zu hokkenden Funktion den assemblerbefehl _asm jmp ziel zu setzen vielen Dank für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201602</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201602</guid><dc:creator><![CDATA[Dezimiert]]></dc:creator><pubDate>Fri, 13 Apr 2012 12:19:22 GMT</pubDate></item></channel></rss>