<?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[Die Addresse 0x40000000 im Arbeitsspeicher]]></title><description><![CDATA[<p>Nun da ich mich etwas intensiver mit dem Arbeitsspeicher geschäftigt habe stellt sich die Frage warum sich die Funktionen im Arbeitsspeicher wiederholen, das heißt der eig. Code der Funktion steht in einer Addresse welche kleiner als 0x40000000 ist und der Ausführbare Code steht in einer Addresse welche größer ist als 0x40000000. Da wollte ich fragen ob das immer so ist nicht das ,dass 1000 mal klappt und beim 1001 mal fehlschlägt. Ich suche nach der Funktion , indem ich sie bitweise in ein unsigned char array kopiere un den Arbeitsspeicher durchsuche , ob nocheinmal genau das gleiche muster , wie das was ich aufgezeichnet habe vorkommt. So finde ich 2 Addresse raus eine ist kleiner als 0x40000000 und eine ist größer als 0x40000000. Die Addresse welche größer als 0x40000000 ist ist die Addresse , mit welcher ich die Funktion aufrufe per inline assembler jmp oder call. Seitdem ich das herausgefunden habe suche ich immer nur den Bereich größer als 0x40000000 ab. Wäre nur blöd wenn dann auf einmal der ausführbare Code in einer Addresse kleiner als 0x40000000 steht. Daher bezieht es sich nur auf die Wissensfrage ob es ausführbaren Code gibt , welcher an einer addresse kleiner als 0x40000000 steht.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/302228/die-addresse-0x40000000-im-arbeitsspeicher</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 10:12:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/302228.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 13 Apr 2012 19:16:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Die Addresse 0x40000000 im Arbeitsspeicher on Fri, 13 Apr 2012 19:16:35 GMT]]></title><description><![CDATA[<p>Nun da ich mich etwas intensiver mit dem Arbeitsspeicher geschäftigt habe stellt sich die Frage warum sich die Funktionen im Arbeitsspeicher wiederholen, das heißt der eig. Code der Funktion steht in einer Addresse welche kleiner als 0x40000000 ist und der Ausführbare Code steht in einer Addresse welche größer ist als 0x40000000. Da wollte ich fragen ob das immer so ist nicht das ,dass 1000 mal klappt und beim 1001 mal fehlschlägt. Ich suche nach der Funktion , indem ich sie bitweise in ein unsigned char array kopiere un den Arbeitsspeicher durchsuche , ob nocheinmal genau das gleiche muster , wie das was ich aufgezeichnet habe vorkommt. So finde ich 2 Addresse raus eine ist kleiner als 0x40000000 und eine ist größer als 0x40000000. Die Addresse welche größer als 0x40000000 ist ist die Addresse , mit welcher ich die Funktion aufrufe per inline assembler jmp oder call. Seitdem ich das herausgefunden habe suche ich immer nur den Bereich größer als 0x40000000 ab. Wäre nur blöd wenn dann auf einmal der ausführbare Code in einer Addresse kleiner als 0x40000000 steht. Daher bezieht es sich nur auf die Wissensfrage ob es ausführbaren Code gibt , welcher an einer addresse kleiner als 0x40000000 steht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201760</guid><dc:creator><![CDATA[Dezimiert]]></dc:creator><pubDate>Fri, 13 Apr 2012 19:16:35 GMT</pubDate></item><item><title><![CDATA[Reply to Die Addresse 0x40000000 im Arbeitsspeicher on Fri, 13 Apr 2012 19:39:31 GMT]]></title><description><![CDATA[<p>Das ist sowas von compiler- und systemabhängig, wie es nur sein kann. Ein paar Stichworte, die du nicht zu kennen scheinst, die aber wichtig sind:<br />
Für die Grundlagen, wie Speicher überhaupt funktioniert:<br />
<a href="http://en.wikipedia.org/wiki/Virtual_memory" rel="nofollow">http://en.wikipedia.org/wiki/Virtual_memory</a></p>
<p>Was zum Beispiel passieren könnte, so dass deine Annahmen komplett falsch sind:<br />
<a href="http://en.wikipedia.org/wiki/Address_space_layout_randomization" rel="nofollow">http://en.wikipedia.org/wiki/Address_space_layout_randomization</a></p>
<p>Wie durchsuchst du eigentlich den Speicher? Ich hätte erwartet, dass das sofort abstürzt, denn deine Annahmen und Erklärungen klingen wild. was ist zum Beispiel der unterschied zwischen dem Code der Funktion und dem ausführbaren Code? Und bitweise Kopien? Ojeh! Irgendwie kann ich nicht glauben, dass du Assembler kannst und trotzdem so etwas schreibst. Verkackerst du uns?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201773</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 13 Apr 2012 19:39:31 GMT</pubDate></item><item><title><![CDATA[Reply to Die Addresse 0x40000000 im Arbeitsspeicher on Fri, 13 Apr 2012 19:50:15 GMT]]></title><description><![CDATA[<p>xD ganz sicher nicht und Assembler kann ich auch nicht, ich kenne nur ein paar Basics , da ich mich ein wenig mit dem Instruction Pointer beschäftigt habe. Ich lese die ersten X Bytes von dem Speicherbereich aus an welchem die Funktion steht und speichere diese Bytes in ein Array. Nun lese ich mit VirtualQuery den Arbeitsspeicher ab der Application Base Address aus. Mit Virtual Query hole ich mir wie gesagt einen Teil des Arbeitsspeichers ab. Diesen vergleiche ich dan Byte für Byte mit dem , was ich mir vorher abgeholt habe. Ich poste einfach mal den Code.Der Code ist nicht kommentiert!</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;winsock2.h&gt;
#include &lt;windows.h&gt;
#include &lt;string&gt;
#include &quot;C:\\Users\\HA_0xFF\\Desktop\\C++\\Memory\\Memory\\WMemory.h&quot;
#pragma comment(lib,&quot;ws2_32.lib&quot;)
using namespace std;
const bool cmpbits(unsigned char b,unsigned char bb)
	{
		unsigned long x1=0;
		x1=x1|b;
		unsigned long x2=0;
		x2=x2|bb;
		if(x1==x2)
			return true;
		return false;
	}
const bool SearchFunktionWithBitmask(const unsigned long startaddr, MemStr t_cpy_bitmask, unsigned long *ULAddress)
{
	*ULAddress=0;
	unsigned long startaddress;
	unsigned long tempaddr;
	unsigned long endaddress;
	if(startaddr==0)
	{
		SYSTEM_INFO sys;
		GetSystemInfo(&amp;sys);
		tempaddr=0x40000000;
		startaddress=reinterpret_cast&lt;unsigned long&gt;(sys.lpMinimumApplicationAddress);
		endaddress=reinterpret_cast&lt;unsigned long&gt;(sys.lpMaximumApplicationAddress);
	}
	else
	{
        SYSTEM_INFO sys;
		GetSystemInfo(&amp;sys);
		startaddress=startaddr;
		endaddress=reinterpret_cast&lt;unsigned long&gt;(sys.lpMaximumApplicationAddress);
		tempaddr=startaddress;
	}
	MEMORY_BASIC_INFORMATION mbi;
	unsigned char *readptr;
	do
	{
		VirtualQuery(reinterpret_cast&lt;void*&gt;(tempaddr),&amp;mbi,sizeof(MEMORY_BASIC_INFORMATION));
		unsigned long start=reinterpret_cast&lt;unsigned long&gt;(mbi.BaseAddress);

		unsigned long end=reinterpret_cast&lt;unsigned long&gt;(mbi.BaseAddress)+mbi.RegionSize;
if(mbi.State==MEM_COMMIT)
{
        for(unsigned long x=start;x&lt;end;x++)
		{
			unsigned long fail=0;
			readptr=reinterpret_cast&lt;unsigned char*&gt;(x);
			for(unsigned long n=0;n&lt;t_cpy_bitmask.GetLength();n++)
			{
				if(cmpbits(*readptr,t_cpy_bitmask[n])==false)
				{
					fail++;
					break;
				}
				readptr++;
			}
			if(fail==0)
			{

				*ULAddress=x;
				return true;

			}

		}
}
tempaddr+=mbi.RegionSize;
	}while((tempaddr&lt;endaddress)&amp;&amp;(*ULAddress==0));

}
const MemStr CreateFunctionBitmask(const unsigned long addroffunc, unsigned long SizeOfByteWritesToBitmask)
{
	MemStr mem;
	mem=&quot;&quot;;

	unsigned char *Func=(unsigned char*)addroffunc;
	for(unsigned long x=0;x&lt;SizeOfByteWritesToBitmask;x++)
	{
		mem[x]=0;
		mem[x]=mem[x]|(*Func&amp;1);
		mem[x]=mem[x]|(*Func&amp;2);
		mem[x]=mem[x]|(*Func&amp;4);
		mem[x]=mem[x]|(*Func&amp;8);
		mem[x]=mem[x]|(*Func&amp;16);
		mem[x]=mem[x]|(*Func&amp;32);
		mem[x]=mem[x]|(*Func&amp;64);
		mem[x]=mem[x]|(*Func&amp;128);
        Func++;
	}
	mem.SetLength(SizeOfByteWritesToBitmask-1);
	return mem;
}
void ShowBits(unsigned char bit)
{
	cout&lt;&lt;((bit&amp;1)==1?1:0);
    cout&lt;&lt;((bit&amp;2)==2?1:0);
	cout&lt;&lt;((bit&amp;4)==4?1:0);
	cout&lt;&lt;((bit&amp;8)==8?1:0);
	cout&lt;&lt;&quot; &quot;&lt;&lt;((bit&amp;16)==16?1:0);
	cout&lt;&lt;((bit&amp;32)==32?1:0);
	cout&lt;&lt;((bit&amp;64)==64?1:0);
	cout&lt;&lt;((bit&amp;128)==128?1:0)&lt;&lt;endl;
}
typedef int (_stdcall *Proc)(SOCKET s,const char *send,int len,int flag);
int main()
{     
	    //Erstelle Bitmask von der Funktion WSAStartup
	MemStr ss=CreateFunctionBitmask((unsigned long)&amp;WSAStartup,4000);
   unsigned long addr;
   //Durchsuche den Ram nach WSAStartup
   SearchFunktionWithBitmask(0x40000000,ss,&amp;addr);
   cout&lt;&lt;&quot;0x&quot;&lt;&lt;(unsigned*)addr&lt;&lt;endl;
   cout&lt;&lt;&quot;0x&quot;&lt;&lt;&amp;WSAStartup&lt;&lt;endl;

	system(&quot;Pause&quot;);
	return 0;
}
</code></pre>
<p>Falls ich die Addresse ab der ich Anfange nach der Funktion zu suchen selbst setze finde ich immer mehrere Ergebnisse</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201777</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201777</guid><dc:creator><![CDATA[Dezimiert]]></dc:creator><pubDate>Fri, 13 Apr 2012 19:50:15 GMT</pubDate></item><item><title><![CDATA[Reply to Die Addresse 0x40000000 im Arbeitsspeicher on Fri, 13 Apr 2012 19:56:57 GMT]]></title><description><![CDATA[<p>Danke für die hilfreichen Links und ich hatte keineswegs vor euch zu &quot;verkackern&quot; allerdings wie du sicher siehst habe ich noch nicht viel gepostet und habe scheinbar auch kein talent zu posten^^<br />
Trotzdem Danke ich dir. Außerdem arbeite ich sehr an meinen posts vielleicht sind sie ja in ein paar Wochen halbwegs verständlich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201781</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201781</guid><dc:creator><![CDATA[Dezimiert]]></dc:creator><pubDate>Fri, 13 Apr 2012 19:56:57 GMT</pubDate></item></channel></rss>