<?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[Speicherbereich ausführen]]></title><description><![CDATA[<p>Guten Abend ich wollte mal Fragen wieso der folgende Quelltext eine Access Violation hervorruft. Da dieser Quelltext eigentlich aus meiner sich Einwandfrei klappen müsste. Achtung es wird inline Assembler benutzt!</p>
<pre><code class="language-cpp">void TheCallingFunction(void)
{
 cout&lt;&lt;&quot;Funktion wurde aufgerufen&quot;&lt;&lt;endl;
}
unsigned long BerechneOffset(unsigned long absprungaddr,unsigned long Zieladdr)
{
 unsigned long sprungweite=0;
 absprungaddr+=5;//Da der Assembler jump Befhel von bytes groß ist 
//und der Compiler erst nach diesen 5 bytes springt
sprungweite=Zieladdr-absprungaddr;
 return sprungweite;
}
int main(int argumentvalue,char **arguments)
{
unsigned char *Saveplace=new unsigned char[5];
//5 Bytes reservieren
//1 byte = jump binär ist 0xE9 =1 Byte
//4 Byte für unsigned long Sprungweg
unsigned long sprungweg=BerechneOffset((unsigned long)Saveplace,(unsigned long)&amp;TheCallingFunction);
//Sprungweite berechnen
unsigned char JmpByte=0xE9;
_asm
 {
[asm]
 mov ebx,Saveplace ; In Register ebx die Addresse vom reservierten Speicher schreiben
 mov al,[JmpByte] ; In das low byte von eax den Inhalt von JmpByte schreiben =0xE9
 mov [ebx],al ; Das Low Byte kopieren und den Wert welcher an der Addresse von ebx steht ersetzen
 add ebx,1 ; die Addresse welche auf die ebx zeigt um eins erhöhen
 mov eax,[sprungweg] ; Inhalt von Sprungweg nach eax kopieren
 mov [ebx],eax ; eax in den Inhalt von ebx kopieren
 jmp Saveplace ; Springe zur Addresse an der der geschriebene Code steht
[/asm]
 }

system(&quot;Pause&quot;);
return 0;
}
Sofort nach jmp stützt das Programm ab die Funktion wird nicht aufgerufen
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/302292/speicherbereich-ausführen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 10:55:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/302292.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 15 Apr 2012 17:45:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherbereich ausführen on Sun, 15 Apr 2012 17:45:09 GMT]]></title><description><![CDATA[<p>Guten Abend ich wollte mal Fragen wieso der folgende Quelltext eine Access Violation hervorruft. Da dieser Quelltext eigentlich aus meiner sich Einwandfrei klappen müsste. Achtung es wird inline Assembler benutzt!</p>
<pre><code class="language-cpp">void TheCallingFunction(void)
{
 cout&lt;&lt;&quot;Funktion wurde aufgerufen&quot;&lt;&lt;endl;
}
unsigned long BerechneOffset(unsigned long absprungaddr,unsigned long Zieladdr)
{
 unsigned long sprungweite=0;
 absprungaddr+=5;//Da der Assembler jump Befhel von bytes groß ist 
//und der Compiler erst nach diesen 5 bytes springt
sprungweite=Zieladdr-absprungaddr;
 return sprungweite;
}
int main(int argumentvalue,char **arguments)
{
unsigned char *Saveplace=new unsigned char[5];
//5 Bytes reservieren
//1 byte = jump binär ist 0xE9 =1 Byte
//4 Byte für unsigned long Sprungweg
unsigned long sprungweg=BerechneOffset((unsigned long)Saveplace,(unsigned long)&amp;TheCallingFunction);
//Sprungweite berechnen
unsigned char JmpByte=0xE9;
_asm
 {
[asm]
 mov ebx,Saveplace ; In Register ebx die Addresse vom reservierten Speicher schreiben
 mov al,[JmpByte] ; In das low byte von eax den Inhalt von JmpByte schreiben =0xE9
 mov [ebx],al ; Das Low Byte kopieren und den Wert welcher an der Addresse von ebx steht ersetzen
 add ebx,1 ; die Addresse welche auf die ebx zeigt um eins erhöhen
 mov eax,[sprungweg] ; Inhalt von Sprungweg nach eax kopieren
 mov [ebx],eax ; eax in den Inhalt von ebx kopieren
 jmp Saveplace ; Springe zur Addresse an der der geschriebene Code steht
[/asm]
 }

system(&quot;Pause&quot;);
return 0;
}
Sofort nach jmp stützt das Programm ab die Funktion wird nicht aufgerufen
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2202272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202272</guid><dc:creator><![CDATA[SpR]]></dc:creator><pubDate>Sun, 15 Apr 2012 17:45:09 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherbereich ausführen on Mon, 16 Apr 2012 16:14:05 GMT]]></title><description><![CDATA[<p>1. Es fehlt ein delete.<br />
2. System( &quot;Pause&quot; ); sollte man nicht verwenden.<br />
3. Entweder du erstellst dir eine Heap oder du gibst dir mit VirtualProtect die nötigen Rechte.<br />
4. Das sind C-Casts.<br />
5. Du hast den flaschen OP-Code genommen es muss 0xE8 sein, desweitern fehlt ein Byte, da du ja noch ein RET brauchst.</p>
<p>MfG</p>
<p>Edit: Hab mal bei meinen alten Sachen gesucht und etwas Vergleichbares gefunden:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;windows.h&gt;

#pragma optimize( &quot;&quot;, off )

#pragma pack( push, 1 )
typedef struct myMessageBoxA
{
	BYTE push_address_1;
	BYTE arg_1;

	BYTE push_address_2;
	DWORD address_2;

	BYTE push_address_3;
	DWORD address_3;

	BYTE push_address_4;
	BYTE arg_4;

	BYTE call;
	DWORD _MessageBox;

	BYTE ret;
}myMessageBoxA;
#pragma pack( pop )

int main( char* arg, char* arvg[ ] )
{
	char* Text = &quot;Hallo&quot;;
	char* Title = &quot;Test&quot;;
	DWORD addr = reinterpret_cast&lt; DWORD &gt;( &amp;MessageBoxA );

	myMessageBoxA* MyBox;
	ZeroMemory( MyBox, sizeof( myMessageBoxA ) );

	HANDLE m_pHeap = HeapCreate( HEAP_CREATE_ENABLE_EXECUTE, NULL, NULL );
MyBox = reinterpret_cast&lt; myMessageBoxA* &gt;( HeapAlloc( m_pHeap, NULL, sizeof( myMessageBoxA ) ) );

	addr = addr - reinterpret_cast&lt; DWORD &gt;( MyBox ) - 0x13; //Relativ Call!

	MyBox-&gt;push_address_1 = 0x6A;
	MyBox-&gt;push_address_2 = 0x68;
	MyBox-&gt;push_address_3 = 0x68;
	MyBox-&gt;push_address_4 = 0x6A;
	MyBox-&gt;arg_1 = NULL;
	MyBox-&gt;arg_4 = NULL;
	MyBox-&gt;address_2 = reinterpret_cast&lt; DWORD &gt;( Text );
	MyBox-&gt;address_3 = reinterpret_cast&lt; DWORD &gt;( Title );
	MyBox-&gt;call = 0xE8;

	MyBox-&gt;_MessageBox = addr;
	MyBox-&gt;ret = 0xC3;

	__asm call MyBox;

	HeapFree( m_pHeap, NULL, MyBox );
	HeapDestroy( m_pHeap );

	std::cout &lt;&lt; &quot;Alles hat funktioniert !&quot; &lt;&lt; std::endl;

	return 0;
}

#pragma optimize( &quot;&quot;, on )
</code></pre>
<p>Ich hoffe das hilft dir etwas.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202556</guid><dc:creator><![CDATA[yihaaa]]></dc:creator><pubDate>Mon, 16 Apr 2012 16:14:05 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherbereich ausführen on Mon, 16 Apr 2012 18:24:43 GMT]]></title><description><![CDATA[<p>Vielen Dank für die Antwort werde mich gleich mal in deinen Code reinarbeiten^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202609</guid><dc:creator><![CDATA[SpR]]></dc:creator><pubDate>Mon, 16 Apr 2012 18:24:43 GMT</pubDate></item></channel></rss>