<?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[ReadProcessMemory - Speicheradressen eingeben]]></title><description><![CDATA[<p>Hi,<br />
ich würde gerne den Wert einer Variable eines anderen Programms, von der ich die Speicheradresse weiß, mit Hilfe der Funktion WriteProcessMemory verändern.<br />
Wenn ich die Adresse in der Konsolenanwendung als int-Variable speichere, funktioniert das ja auch gut.<br />
Allerdings ist die Speicheradresse ja auf jedem PC anders, deshalb würde ich diese gerne in das Programm, das die Variable verändern soll, eingeben.<br />
Das Problem dabei ist, dass die Adresse Zahlen und Buhstaben enthält. Deshalb kann ich den Eingabewert im Programm weder als int- noch als char-Variable speichern.</p>
<p>Deshalb habe ich es jetzt mit einem string gelöst. Nur wenn ich diesen String jetzt an WriteProcessMemory als Speicheradresse übergebe (alle anderen erforderlichen Parameter wie ProcessID habe ich natürlich bereits), gibt der Kompiler (Microsoft Visual C++ 2008 Express Edition (unter Windows XP)) folgende Fehlermeldung aus:</p>
<p>'Typumwandlung': 'std::string' kann nicht in 'LPVOID' konvertiert werden;</p>
<p>Kann man die eingegebene Adresse irgendwie so im Programm speichern, dass man sie auch an WriteProcessMemory übergeben kann?</p>
<p>Hier mal der Code für das Programm, das die Variable ändern soll:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
#include&lt;windows.h&gt;
#include&lt;conio.h&gt;
#include&lt;stdio.h&gt;
#include&lt;string&gt;
#include&lt;fstream&gt;
#include&lt;sstream&gt;
#include&lt;cstdio&gt;
using namespace std;

int main() 
{ 
    HWND hWnd; 
    HANDLE hproc; 
    DWORD procid; 
    DWORD rw = 0; 

	SetConsoleTitle(TEXT(&quot;Memory-Tool&quot;));

    unsigned adress = 0x77DCA2;
    unsigned adress2= 0x7804B4;
	string adress3;
	string adress4;
	int buffer = 0;

    cout&lt;&lt;&quot;Verwenden Sie den Ursprungs-PC des Tools(1)\n oder einen anderen(2)?\n&quot;;
    int eingabe;
    cin&gt;&gt;eingabe;
    if(eingabe==1)
    {
    cout&lt;&lt;&quot;Bitte oeffnen Sie das Opferprogramm und druecken Sie\n&quot;;
    cout&lt;&lt;&quot;eine beliebige Taste\n&quot;;
    getch();

    cout&lt;&lt;&quot;Bitte geben Sie den gewuenschten Wert der Variable ein\n&quot;;
    cin&gt;&gt;buffer; 

    hWnd = FindWindow(0,TEXT(&quot;Opfer&quot;)); 
    if(!hWnd) 
        return 0; 

    GetWindowThreadProcessId(hWnd, &amp;procid);

    hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procid);

    if(WriteProcessMemory(hproc,(LPVOID)adress,&amp;buffer, 
                    sizeof(buffer),&amp;rw)) 
    { 
        cout &lt;&lt; &quot;Schreiben erfolgreich\n&quot;; 
    } 

     if(WriteProcessMemory(hproc,(LPVOID)adress2,&amp;buffer, 
                    sizeof(buffer),&amp;rw)) 
    { 
        cout &lt;&lt; &quot;Schreiben erfolgreich\n&quot;; 
    } 

    CloseHandle(hproc); 
	getch();
    }
    else
    {
        cout&lt;&lt;&quot;Bitte geben Sie die erste der beiden Speicheradressen\n&quot;;
        cout&lt;&lt;&quot;der Variablen ein\n&quot;;
        cin&gt;&gt;adress3;//wird richtig im string gespeichert
		cin&gt;&gt;adress4;//nur konvertierung unmöglich

    cout&lt;&lt;&quot;Bitte oeffnen Sie die Opferanwendung und druecken Sie\n&quot;;
    cout&lt;&lt;&quot;eine beliebige Taste\n&quot;;
    getch();

    cout&lt;&lt;&quot;Bitte geben Sie den gewuenschten Wert ein\n&quot;;
    cin&gt;&gt;buffer; 

    hWnd = FindWindow(0,TEXT(&quot;Opfer&quot;)); 
    if(!hWnd) 
        return 0; 

    GetWindowThreadProcessId(hWnd, &amp;procid);

    hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procid);

    if(WriteProcessMemory(hproc,(LPVOID)adress3,&amp;buffer, 
                    sizeof(buffer),&amp;rw)) 
    { 
        cout &lt;&lt; &quot;Schreiben erfolgreich\n&quot;; 
    } 

     if(WriteProcessMemory(hproc,(LPVOID)adress4,&amp;buffer, 
                    sizeof(buffer),&amp;rw)) 
    { 
        cout &lt;&lt; &quot;Schreiben erfolgreich\n&quot;; 
    } 

    CloseHandle(hproc); 
	getch();
}
}
</code></pre>
<p>und hier der fürs Opferprogramm:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 
#include &lt;windows.h&gt; 

using namespace std; 

int i = 15; 
int main(void) 
{ 
	HWND hWnd=GetForegroundWindow();
	SetWindowText(hWnd, TEXT(&quot;Opfer&quot;));
	Sleep(500);
    cout &lt;&lt; i &lt;&lt; &quot;\t&quot; &lt;&lt; &amp;i &lt;&lt; endl; 
    Sleep(10000); 
    cout &lt;&lt; i &lt;&lt; &quot;\t&quot; &lt;&lt; &amp;i &lt;&lt; endl; 
    Sleep(10000); 
    return 0; 
}
</code></pre>
<p>Das Opferprogramm erstellt eine globale Integer-Variable und gibt diese aus. Dann wartet es 10sec, in dieser Zeit soll das Änderungstool den Wert verändern. Dann wird der wert vom Opferprogramm erneut zur Kontrolle ausgegeben.</p>
<p>Nur leider funktioniert das Speichern der Adresse der zu ändernden Variablen im Änderungstool nicht.</p>
<p>Schonmal danke für die Hilfe,<br />
Andreas.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/240196/readprocessmemory-speicheradressen-eingeben</link><generator>RSS for Node</generator><lastBuildDate>Mon, 06 Apr 2026 08:35:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/240196.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 03 May 2009 13:23:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to ReadProcessMemory - Speicheradressen eingeben on Sun, 03 May 2009 13:23:55 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich würde gerne den Wert einer Variable eines anderen Programms, von der ich die Speicheradresse weiß, mit Hilfe der Funktion WriteProcessMemory verändern.<br />
Wenn ich die Adresse in der Konsolenanwendung als int-Variable speichere, funktioniert das ja auch gut.<br />
Allerdings ist die Speicheradresse ja auf jedem PC anders, deshalb würde ich diese gerne in das Programm, das die Variable verändern soll, eingeben.<br />
Das Problem dabei ist, dass die Adresse Zahlen und Buhstaben enthält. Deshalb kann ich den Eingabewert im Programm weder als int- noch als char-Variable speichern.</p>
<p>Deshalb habe ich es jetzt mit einem string gelöst. Nur wenn ich diesen String jetzt an WriteProcessMemory als Speicheradresse übergebe (alle anderen erforderlichen Parameter wie ProcessID habe ich natürlich bereits), gibt der Kompiler (Microsoft Visual C++ 2008 Express Edition (unter Windows XP)) folgende Fehlermeldung aus:</p>
<p>'Typumwandlung': 'std::string' kann nicht in 'LPVOID' konvertiert werden;</p>
<p>Kann man die eingegebene Adresse irgendwie so im Programm speichern, dass man sie auch an WriteProcessMemory übergeben kann?</p>
<p>Hier mal der Code für das Programm, das die Variable ändern soll:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
#include&lt;windows.h&gt;
#include&lt;conio.h&gt;
#include&lt;stdio.h&gt;
#include&lt;string&gt;
#include&lt;fstream&gt;
#include&lt;sstream&gt;
#include&lt;cstdio&gt;
using namespace std;

int main() 
{ 
    HWND hWnd; 
    HANDLE hproc; 
    DWORD procid; 
    DWORD rw = 0; 

	SetConsoleTitle(TEXT(&quot;Memory-Tool&quot;));

    unsigned adress = 0x77DCA2;
    unsigned adress2= 0x7804B4;
	string adress3;
	string adress4;
	int buffer = 0;

    cout&lt;&lt;&quot;Verwenden Sie den Ursprungs-PC des Tools(1)\n oder einen anderen(2)?\n&quot;;
    int eingabe;
    cin&gt;&gt;eingabe;
    if(eingabe==1)
    {
    cout&lt;&lt;&quot;Bitte oeffnen Sie das Opferprogramm und druecken Sie\n&quot;;
    cout&lt;&lt;&quot;eine beliebige Taste\n&quot;;
    getch();

    cout&lt;&lt;&quot;Bitte geben Sie den gewuenschten Wert der Variable ein\n&quot;;
    cin&gt;&gt;buffer; 

    hWnd = FindWindow(0,TEXT(&quot;Opfer&quot;)); 
    if(!hWnd) 
        return 0; 

    GetWindowThreadProcessId(hWnd, &amp;procid);

    hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procid);

    if(WriteProcessMemory(hproc,(LPVOID)adress,&amp;buffer, 
                    sizeof(buffer),&amp;rw)) 
    { 
        cout &lt;&lt; &quot;Schreiben erfolgreich\n&quot;; 
    } 

     if(WriteProcessMemory(hproc,(LPVOID)adress2,&amp;buffer, 
                    sizeof(buffer),&amp;rw)) 
    { 
        cout &lt;&lt; &quot;Schreiben erfolgreich\n&quot;; 
    } 

    CloseHandle(hproc); 
	getch();
    }
    else
    {
        cout&lt;&lt;&quot;Bitte geben Sie die erste der beiden Speicheradressen\n&quot;;
        cout&lt;&lt;&quot;der Variablen ein\n&quot;;
        cin&gt;&gt;adress3;//wird richtig im string gespeichert
		cin&gt;&gt;adress4;//nur konvertierung unmöglich

    cout&lt;&lt;&quot;Bitte oeffnen Sie die Opferanwendung und druecken Sie\n&quot;;
    cout&lt;&lt;&quot;eine beliebige Taste\n&quot;;
    getch();

    cout&lt;&lt;&quot;Bitte geben Sie den gewuenschten Wert ein\n&quot;;
    cin&gt;&gt;buffer; 

    hWnd = FindWindow(0,TEXT(&quot;Opfer&quot;)); 
    if(!hWnd) 
        return 0; 

    GetWindowThreadProcessId(hWnd, &amp;procid);

    hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procid);

    if(WriteProcessMemory(hproc,(LPVOID)adress3,&amp;buffer, 
                    sizeof(buffer),&amp;rw)) 
    { 
        cout &lt;&lt; &quot;Schreiben erfolgreich\n&quot;; 
    } 

     if(WriteProcessMemory(hproc,(LPVOID)adress4,&amp;buffer, 
                    sizeof(buffer),&amp;rw)) 
    { 
        cout &lt;&lt; &quot;Schreiben erfolgreich\n&quot;; 
    } 

    CloseHandle(hproc); 
	getch();
}
}
</code></pre>
<p>und hier der fürs Opferprogramm:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 
#include &lt;windows.h&gt; 

using namespace std; 

int i = 15; 
int main(void) 
{ 
	HWND hWnd=GetForegroundWindow();
	SetWindowText(hWnd, TEXT(&quot;Opfer&quot;));
	Sleep(500);
    cout &lt;&lt; i &lt;&lt; &quot;\t&quot; &lt;&lt; &amp;i &lt;&lt; endl; 
    Sleep(10000); 
    cout &lt;&lt; i &lt;&lt; &quot;\t&quot; &lt;&lt; &amp;i &lt;&lt; endl; 
    Sleep(10000); 
    return 0; 
}
</code></pre>
<p>Das Opferprogramm erstellt eine globale Integer-Variable und gibt diese aus. Dann wartet es 10sec, in dieser Zeit soll das Änderungstool den Wert verändern. Dann wird der wert vom Opferprogramm erneut zur Kontrolle ausgegeben.</p>
<p>Nur leider funktioniert das Speichern der Adresse der zu ändernden Variablen im Änderungstool nicht.</p>
<p>Schonmal danke für die Hilfe,<br />
Andreas.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704824</guid><dc:creator><![CDATA[andi01]]></dc:creator><pubDate>Sun, 03 May 2009 13:23:55 GMT</pubDate></item><item><title><![CDATA[Reply to ReadProcessMemory - Speicheradressen eingeben on Sun, 03 May 2009 13:49:20 GMT]]></title><description><![CDATA[<p>Du musst die Adresse, die als String vorliegt noch ein einen Pointer umwandeln.</p>
<p>Bsp:</p>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#include &lt;string&gt;
#include &lt;sstream&gt;

int main()
{
	std::string str = &quot;0xffeeffee&quot;;
	std::stringstream ss(str);
	void* p = 0;
	ss &gt;&gt; p;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1704831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704831</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sun, 03 May 2009 13:49:20 GMT</pubDate></item><item><title><![CDATA[Reply to ReadProcessMemory - Speicheradressen eingeben on Sun, 03 May 2009 14:06:02 GMT]]></title><description><![CDATA[<p>Erstmal danke für die schnell Antwort =).<br />
Das mit dem Pointer funktioniert schon prima.</p>
<p>Bleiben nur noch 2 kleine Fragen:</p>
<p>1.Wenn ich die Adresse eingebe, muss ich das 0x mit eingeben?<br />
(z.B. bei 0x1g1l1b, muss ich da 1g111b oder 0x1g111b eingeben?)</p>
<p>2. Wenn ich das an WriteProcessMemory übergebe, muss ich dan beim pointer als parameter einen Stern schreiben um den Inhalt anzusprechen?</p>
<p>ohne Stern:</p>
<pre><code class="language-cpp">if(WriteProcessMemory(hproc,(LPVOID)p1,&amp;buffer, 
                    sizeof(buffer),&amp;rw)) 
    { 
        cout &lt;&lt; &quot;Schreiben erfolgreich\n&quot;; 
    }
</code></pre>
<p>mit Stern:</p>
<pre><code class="language-cpp">if(WriteProcessMemory(hproc,(LPVOID)*p1,&amp;buffer, 
                    sizeof(buffer),&amp;rw)) 
    { 
        cout &lt;&lt; &quot;Schreiben erfolgreich\n&quot;; 
    }
</code></pre>
<p>was davon ist richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704838</guid><dc:creator><![CDATA[andi01]]></dc:creator><pubDate>Sun, 03 May 2009 14:06:02 GMT</pubDate></item><item><title><![CDATA[Reply to ReadProcessMemory - Speicheradressen eingeben on Sun, 03 May 2009 14:15:42 GMT]]></title><description><![CDATA[<p>1. Probier es aus.<br />
2. Nein, kein Stern.</p>
<p>BTW: den cast nach LPVOID brauchst Du nicht mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704840</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sun, 03 May 2009 14:15:42 GMT</pubDate></item><item><title><![CDATA[Reply to ReadProcessMemory - Speicheradressen eingeben on Sun, 03 May 2009 15:06:21 GMT]]></title><description><![CDATA[<p>ich habe es jetzt ausprobiert, und immerhin, der Komplier bringt keine Fehlermeldungen mehr =).</p>
<p>aber: keine der beiden Varianten scheint zu funktionieren, da der Wert der Variable hinterher iimernoch gleich ist.</p>
<p>An den benötigten Rechten kann das jedoch nicht liegen, denn:<br />
1.wenn ich nach OpenProcess GetLastError() aufrufe, liefert das den Wert 0 --&gt; keine Fehler, Process all access hat geklappt.<br />
2. Wenn ich die Adresse als Integer-Variable direkt im Programm speichere funktioniert es ja auch.</p>
<p>--&gt; an den Rechten für den Prozess kann es schonmal nicht liegen.</p>
<p>Aber woran liegt es dann?</p>
<p>edit: ich habe den Cast (LPVOID) jetzt entfernt, geht aber immernoch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704847</guid><dc:creator><![CDATA[andi01]]></dc:creator><pubDate>Sun, 03 May 2009 15:06:21 GMT</pubDate></item><item><title><![CDATA[Reply to ReadProcessMemory - Speicheradressen eingeben on Sun, 03 May 2009 15:30:23 GMT]]></title><description><![CDATA[<p>wenn ich mich recht entsinne, brauch das Programm doch Debug-Privilegien,<br />
um im SPeicher anderer Anwendung rumzupfuschen, oder? ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704868</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Sun, 03 May 2009 15:30:23 GMT</pubDate></item><item><title><![CDATA[Reply to ReadProcessMemory - Speicheradressen eingeben on Sun, 03 May 2009 15:33:52 GMT]]></title><description><![CDATA[<p>Aber wenn ich ich die Adresse direkt im Code speichere geht's doch auch, das heißt das Programm hat doch eigentlich alle nötigen Rechte, oder???</p>
<p>Aber falls du Recht hast: Wie bekomme ich diese Privilegien für das Programm?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704870</guid><dc:creator><![CDATA[andi01]]></dc:creator><pubDate>Sun, 03 May 2009 15:33:52 GMT</pubDate></item><item><title><![CDATA[Reply to ReadProcessMemory - Speicheradressen eingeben on Sun, 03 May 2009 15:38:13 GMT]]></title><description><![CDATA[<p>also, wenn es funktioniert, wenn du die Adresse fest hast,<br />
dann muss es auch so funktionieren...</p>
<p>der einzige plausible Fehler, der mir einfällt<br />
(abgesehen von einer falschen Adresse^^) wäre, dass der &gt;&gt; operator von stringstream<br />
dir ein falsches (unerwartetes) Ergebnis liefert.</p>
<p>btw: was ist 0x1g111b denn für ein hex-wert?<br />
es gibt KEIN g bzw. G bei Hexadezimalen Zahlen, nur 0-9 und a/A-f/F</p>
<p>ansonsten müsste ich selber erstmal nachschauen, wie das mit den Privilegien ging.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704871</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Sun, 03 May 2009 15:38:13 GMT</pubDate></item><item><title><![CDATA[Reply to ReadProcessMemory - Speicheradressen eingeben on Sun, 03 May 2009 15:56:52 GMT]]></title><description><![CDATA[<p>das mit der Adresse mit dem g war nur ein beliebiges Beispiel weil ich nicht extra die originaladresse suchen wollte;</p>
<p>aber es funktioniert immernoch nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title="=("
      alt="😞"
    /> .</p>
<p>wenn es wirklich an diesem Operator liegt, gibt es dann noch eine andere Möglichkeit den string so zu konvertieren dass er für WriteProcesssMemory brauchbar ist?</p>
<p>und da es mit fest eingespeicherter Adresse ja funktioniert kann es nicht an den Rechten liegen.</p>
<p>aber das mit dem unerwarteten Ergebnis werde ich mal schnell überprüfen indem ich den Wert des Zeigers am Bildschirm ausgeben lasse und ihn mmit der Eingabe vergleiche.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704885</guid><dc:creator><![CDATA[andi01]]></dc:creator><pubDate>Sun, 03 May 2009 15:56:52 GMT</pubDate></item><item><title><![CDATA[Reply to ReadProcessMemory - Speicheradressen eingeben on Sun, 03 May 2009 16:00:35 GMT]]></title><description><![CDATA[<p>zur Not könntest du auch selber eine Funktion dafür schreiben,<br />
die eine Hex-Zeichenkette in eine Zahl umwandelt.</p>
<p>vorher solltest du aber überprüfen, ob das Ergebnis wirklich nicht stimmt.<br />
also gib einfach mal den Zeiger p über printf mit %X oder per std::cout aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704887</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Sun, 03 May 2009 16:00:35 GMT</pubDate></item><item><title><![CDATA[Reply to ReadProcessMemory - Speicheradressen eingeben on Sun, 03 May 2009 20:34:29 GMT]]></title><description><![CDATA[<p>einfachste lösung:</p>
<p>dein kompiler denkt sich bei der variable &quot;i&quot; der wert wird nie verändert also<br />
kann ich die in ein register packen. gut für die performance, schlecht für<br />
dein vorhaben</p>
<pre><code class="language-cpp">volatile int i;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1705014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1705014</guid><dc:creator><![CDATA[tipp]]></dc:creator><pubDate>Sun, 03 May 2009 20:34:29 GMT</pubDate></item><item><title><![CDATA[Reply to ReadProcessMemory - Speicheradressen eingeben on Mon, 04 May 2009 07:52:54 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile-var-mode-is-viewprofile-and-u-is-10455.html" rel="nofollow">evilissimo</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-15.html" rel="nofollow">C++</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-4.html" rel="nofollow">WinAPI</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39405.html" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1705124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1705124</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Mon, 04 May 2009 07:52:54 GMT</pubDate></item><item><title><![CDATA[Reply to ReadProcessMemory - Speicheradressen eingeben on Mon, 04 May 2009 14:46:29 GMT]]></title><description><![CDATA[<p>ihr hattet Recht, wenn ich den Wert der Pointer über std::cout ausgeben lasse, sind beide Ausgabewerte 0;</p>
<p>Aber wie kann man das Problem mit der Konvertierung beheben?</p>
<p>vielleicht irgendwie direkt nach int konvertieren? denn wenn die Adresse als int im Programm gespeichert ist funktioniert es ja.</p>
<p>da ich an meinem Code inzwischen einiges verändert habe, hier nochmal der komplette Code für das Änderungstool:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
#include&lt;windows.h&gt;
#include&lt;conio.h&gt;
#include&lt;stdio.h&gt;
#include&lt;string&gt;
#include&lt;fstream&gt;
#include&lt;sstream&gt;
#include&lt;cstdio&gt;
using namespace std;

int main() 
{ 
    HWND hWnd; 
    HANDLE hproc; 
    DWORD procid; 
    DWORD rw = 0; 

	SetConsoleTitle(TEXT(&quot;Aenderungstool&quot;));

    unsigned adress = 0x77DCA2;
    unsigned adress2= 0x7804B4;
	string adress3;
	string adress4;
	stringstream adress3_neu(adress3);
	stringstream adress4_neu(adress4);
	void* p1=0;
	void* p2=0;
	int buffer = 0;

    cout&lt;&lt;&quot;Verwenden Sie den Ursprungs-PC der Tools(1)\n oder einen anderen(2)?\n&quot;;
    int eingabe;
    cin&gt;&gt;eingabe;
    if(eingabe==1)
    {
    cout&lt;&lt;&quot;Bitte oeffnen Sie das Opferprogramm und druecken Sie\n&quot;;
    cout&lt;&lt;&quot;eine beliebige Taste\n&quot;;
    getch();

    cout&lt;&lt;&quot;Bitte geben Sie den gewuenschten Wert ein\n&quot;;
    cin&gt;&gt;buffer; 

    hWnd = FindWindow(0,TEXT(&quot;Opfer&quot;)); 
    if(!hWnd) 
        return 0; 

    GetWindowThreadProcessId(hWnd, &amp;procid);

    hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procid);

    if(WriteProcessMemory(hproc,(LPVOID)adress,&amp;buffer, 
                    sizeof(buffer),&amp;rw)) 
    { 
        cout &lt;&lt; &quot;Schreiben erfolgreich\n&quot;; 
    } 

     if(WriteProcessMemory(hproc,(LPVOID)adress2,&amp;buffer, 
                    sizeof(buffer),&amp;rw)) 
    { 
        cout &lt;&lt; &quot;Schreiben erfolgreich\n&quot;; 
    } 

    CloseHandle(hproc);
	getch();
    }
    else
    {
        cout&lt;&lt;&quot;Bitte geben Sie die erste der beiden Speicheradressen\n&quot;;
        cout&lt;&lt;&quot;der Variablen ein\n&quot;;
        cin&gt;&gt;adress3;//wird richtig im string gespeichert
		cin&gt;&gt;adress4;//nur konvertierung unmöglich
		adress3_neu &gt;&gt;p1;
		adress4_neu &gt;&gt;p2;

    cout&lt;&lt;&quot;Bitte oeffnen Sie das Opferprogramm und druecken Sie\n&quot;;
    cout&lt;&lt;&quot;eine beliebige Taste\n&quot;;
    getch();

    cout&lt;&lt;&quot;Bitte geben Sie den gewuenschten Wert ein\n&quot;;
    cin&gt;&gt;buffer; 

    hWnd = FindWindow(0,TEXT(&quot;Opfer&quot;)); 
    if(!hWnd) 
        return 0; 

    GetWindowThreadProcessId(hWnd, &amp;procid);

    hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procid);

    if(WriteProcessMemory(hproc,p1,&amp;buffer, 
                    sizeof(buffer),&amp;rw)) 
    { 
        cout &lt;&lt; &quot;Schreiben erfolgreich\n&quot;; 
    } 

     if(WriteProcessMemory(hproc,p2,&amp;buffer, 
                    sizeof(buffer),&amp;rw)) 
    { 
        cout &lt;&lt; &quot;Schreiben erfolgreich\n&quot;; 
    } 

    CloseHandle(hproc); 
	getch();
}
}
</code></pre>
<p>Allerdings habe ich den Vorschlag von tipp noch nicht ganz verstanden: soll ich die Pointer also einfach von void* noch volataitle int* &quot;umbenennen&quot;?</p>
<p>leider funktioniert es immernoch nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f622.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--crying_face"
      title=";("
      alt="😢"
    /> .</p>
<p>Da diese Art der Konvertierung aus irgendwelchen Gründen nicht zu funktionieren scheint, kann man den string noch irgendwie anders so konvertieren, dass er für WriteProcessMemory verwertbar ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1705362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1705362</guid><dc:creator><![CDATA[andi01]]></dc:creator><pubDate>Mon, 04 May 2009 14:46:29 GMT</pubDate></item><item><title><![CDATA[Reply to ReadProcessMemory - Speicheradressen eingeben on Mon, 04 May 2009 14:47:12 GMT]]></title><description><![CDATA[<p>nein, das mti dem volatile geht nur, wenn das Programm, dass du manipulieren willst,<br />
ebenfalls von dir stammt.</p>
<p>dann könntest du die Variable, die du ändern möchtest, volatile deklarieren</p>
<p>aber der Fehler liegt offenbar sowieso wo anders.</p>
<p>einfachste Möglichkeit: nimm beim Windows-Taschenrechner die Wissenschaftliche Ansicht, gib die Adresse in Hex ein und wandel sie in Dezimal um.<br />
den Dezimal-Wert sollte der Stringstream richtig verarbeiten <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>
<p>wenn der Stringstream ein Hex-Wert in eine Zahl übersetzen soll, könnte es passieren,<br />
dass er bei dem x (&quot;0x...&quot; abbricht, weil x ja keine Ziffer ist.<br />
deshalb wird die adresse immer 0.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1705382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1705382</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Mon, 04 May 2009 14:47:12 GMT</pubDate></item><item><title><![CDATA[Reply to ReadProcessMemory - Speicheradressen eingeben on Mon, 04 May 2009 15:00:02 GMT]]></title><description><![CDATA[<p>also: die Originaladresse der zu verändernden Variable lautet: 0x77DCA2 ;<br />
Aber das 0x kässt sich nicht eingeben; ich habe es jetzt einfach mal weggelassen.</p>
<p>Bei der Umrechnung kommt 7855266 heraus; Ich werde gleich mal probieren mit diesem Wert zu arbeiten.</p>
<p>Aber: Wenn ich bei der Eingabe in das Programm mit dem obigen Quellcode das 0x bei der Adresseingabe weglasse, kommt ebenfalls 0 heraus, deshalb sollt es an diesem 0x nicht liegen.</p>
<p>Aber ich wrde trotzdem mal den umgerechneten Wert gleich erproben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1705393</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1705393</guid><dc:creator><![CDATA[andi01]]></dc:creator><pubDate>Mon, 04 May 2009 15:00:02 GMT</pubDate></item><item><title><![CDATA[Reply to ReadProcessMemory - Speicheradressen eingeben on Mon, 04 May 2009 15:16:49 GMT]]></title><description><![CDATA[<p>so, ich habe es jetzt erprobt:</p>
<p>mit einer Variable funktioniert das ja prima, nur ich kann mir wirklich nicht erklären warum es mit der 2. nicht funktioniert???</p>
<p>Hoffentlich habe ich mich nur vertippt und das problem wäre gelöst</p>
<p>Aber schonmal danke, das mit dem Taschenrechner funktioniert hervorragend!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1705415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1705415</guid><dc:creator><![CDATA[andi01]]></dc:creator><pubDate>Mon, 04 May 2009 15:16:49 GMT</pubDate></item><item><title><![CDATA[Reply to ReadProcessMemory - Speicheradressen eingeben on Mon, 04 May 2009 15:25:17 GMT]]></title><description><![CDATA[<p>eendlich!<br />
es funktioniert fantastisch!<br />
vielen Dank an alle die mir bei der Lösung dieses Problems geholfen haben!</p>
<p>für alle, die vielleicht etwas Ähnliches machen wollen, hier nochmal mein kompletter Code:</p>
<p>Änderungstool:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
#include&lt;windows.h&gt;
#include&lt;conio.h&gt;
#include&lt;stdio.h&gt;
#include&lt;string&gt;
#include&lt;fstream&gt;
#include&lt;sstream&gt;
#include&lt;cstdio&gt;
using namespace std;

int main() 
{ 
    HWND hWnd; 
    HANDLE hproc; 
    DWORD procid; 
    DWORD rw = 0; 

	SetConsoleTitle(TEXT(&quot;Aenderungstool&quot;));

    unsigned adress = 0x77DCA2;
    unsigned adress2= 0x7804B4;
	int buffer = 0;

    cout&lt;&lt;&quot;Verwenden Sie den Ursprungs-PC der Tools(1)\n oder einen anderen(2)?\n&quot;;
    int eingabe;
    cin&gt;&gt;eingabe;
    if(eingabe==1)
    {
    cout&lt;&lt;&quot;Bitte oeffnen Sie das Opferprogramm und druecken Sie\n&quot;;
    cout&lt;&lt;&quot;eine beliebige Taste\n&quot;;
    getch();

    cout&lt;&lt;&quot;Bitte druecken Sie eine Taste und geben Sie den gewuenschten Wert ein\n&quot;;
    getch();
    cin&gt;&gt;buffer; 

    hWnd = FindWindow(0,TEXT(&quot;Opfer&quot;)); 
    if(!hWnd) 
        return 0; 

    GetWindowThreadProcessId(hWnd, &amp;procid);

    hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procid);

    if(WriteProcessMemory(hproc,(LPVOID)adress,&amp;buffer, 
                    sizeof(buffer),&amp;rw)) 
    { 
        cout &lt;&lt; &quot;Schreiben erfolgreich\n&quot;; 
    } 

     if(WriteProcessMemory(hproc,(LPVOID)adress2,&amp;buffer, 
                    sizeof(buffer),&amp;rw)) 
    { 
        cout &lt;&lt; &quot;Schreiben erfolgreich\n&quot;; 
    } 

    CloseHandle(hproc);
	getch();
    }
    else
    {
        cout&lt;&lt;&quot;Bitte geben Sie die erste der beiden Speicheradressen\n&quot;;
        cout&lt;&lt;&quot;der Variablen ein\n&quot;;
        cin&gt;&gt;adress;
		cin&gt;&gt;adress2;

    cout&lt;&lt;&quot;Bitte oeffnen Sie das Opferprogramm und druecken Sie\n&quot;;
    cout&lt;&lt;&quot;eine beliebige Taste\n&quot;;
    getch();

    cout&lt;&lt;&quot;Bitte druecken Sie eine Taste und geben Sie den gewuenschten Wert ein\n&quot;;
    cin&gt;&gt;buffer; 

    hWnd = FindWindow(0,TEXT(&quot;Opfer&quot;)); 
    if(!hWnd) 
        return 0; 

    GetWindowThreadProcessId(hWnd, &amp;procid);

    hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procid);

    if(WriteProcessMemory(hproc,(LPVOID) adress,&amp;buffer, 
                    sizeof(buffer),&amp;rw)) 
    { 
        cout &lt;&lt; &quot;Schreiben erfolgreich\n&quot;; 
    } 

     if(WriteProcessMemory(hproc,(LPVOID) adress2,&amp;buffer, 
                    sizeof(buffer),&amp;rw)) 
    { 
        cout &lt;&lt; &quot;Schreiben erfolgreich\n&quot;; 
    } 

    CloseHandle(hproc);
	getch();
}
}
</code></pre>
<p>Opfer:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 
#include &lt;windows.h&gt; 

using namespace std; 

int i = 15; 
int main(void) 
{ 
	HWND hWnd=GetForegroundWindow();
	SetWindowText(hWnd, TEXT(&quot;Opfer&quot;));
	Sleep(500);
    cout &lt;&lt; i &lt;&lt; &quot;\t&quot; &lt;&lt; &amp;i &lt;&lt; endl; 
    Sleep(10000); 
    cout &lt;&lt; i &lt;&lt; &quot;\t&quot; &lt;&lt; &amp;i &lt;&lt; endl; 
    Sleep(10000); 
    return 0; 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1705423</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1705423</guid><dc:creator><![CDATA[andi01]]></dc:creator><pubDate>Mon, 04 May 2009 15:25:17 GMT</pubDate></item><item><title><![CDATA[Reply to ReadProcessMemory - Speicheradressen eingeben on Tue, 05 May 2009 08:20:13 GMT]]></title><description><![CDATA[<p>Hi Leute,</p>
<p>jetzt ist aber meine Frage schon mal, wenn ihr schon C++ verwendet warum dann nicht auch die IO Manipulatoren sondern den umweg von std::string ueber std::stringstream nach int!?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;iomanip&gt;

int main(int argc, char**)
{
	int i = 0;
	std::cout &lt;&lt; &quot;Zahl:&quot; ;
	std::cin &gt;&gt; std::hex &gt;&gt; i ;
	std::cout &lt;&lt; &quot;input: &quot; &lt;&lt; i;

	return 0;

}
</code></pre>
<p>Liest ein Hexwert in eine Int Variable <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Peace &amp; Blessed Love C0de4Fun</p>
<p>€ Ach ja und das hat doch eig nichts mit WinAPI zu tun sollte mal wer verschieben <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/1705674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1705674</guid><dc:creator><![CDATA[C0de4Fun]]></dc:creator><pubDate>Tue, 05 May 2009 08:20:13 GMT</pubDate></item><item><title><![CDATA[Reply to ReadProcessMemory - Speicheradressen eingeben on Tue, 05 May 2009 11:49:40 GMT]]></title><description><![CDATA[<p>jetzt funktioniert zwar die Eingabe, aber irgendwie scheint er auch den Wert der Variablen buffer, die den neuen Wert derVariable beinhaltet, als hex einzulesen, weil er jetzt zwar die Variable findet und auch den Wert manipuk´liert, allerdings ist der neue Wert ein Vielfaches von dem was ich eingegeben habe.</p>
<p>deshalb bleibe ich wohl doch besser bei der Methode mit dem Taschenrechner.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1705800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1705800</guid><dc:creator><![CDATA[andi01]]></dc:creator><pubDate>Tue, 05 May 2009 11:49:40 GMT</pubDate></item><item><title><![CDATA[Reply to ReadProcessMemory - Speicheradressen eingeben on Tue, 05 May 2009 12:20:18 GMT]]></title><description><![CDATA[<p>andi01 schrieb:</p>
<blockquote>
<p>jetzt funktioniert zwar die Eingabe, aber irgendwie scheint er auch den Wert der Variablen buffer, die den neuen Wert derVariable beinhaltet, als hex einzulesen, weil er jetzt zwar die Variable findet und auch den Wert manipuk´liert, allerdings ist der neue Wert ein Vielfaches von dem was ich eingegeben habe.</p>
<p>deshalb bleibe ich wohl doch besser bei der Methode mit dem Taschenrechner.</p>
</blockquote>
<p>Mein Vorschlag an dich, waere jetzt einfach mal mit den Grundlagen einer Sprache zu beginnen, um nicht bei jeder kleinigkeit fragen zu muessen!</p>
<pre><code class="language-cpp">std::cin &gt;&gt; std::hex &gt;&gt; i &gt;&gt; std::dec;
</code></pre>
<p>Peace &amp; Blessed Love C0de4Fun</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1705825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1705825</guid><dc:creator><![CDATA[C0de4Fun]]></dc:creator><pubDate>Tue, 05 May 2009 12:20:18 GMT</pubDate></item><item><title><![CDATA[Reply to ReadProcessMemory - Speicheradressen eingeben on Tue, 05 May 2009 12:27:56 GMT]]></title><description><![CDATA[<p>juhu, es funktioniert!</p>
<p>Vielen dank an alle für die Hilfe,<br />
Andreas.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1705833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1705833</guid><dc:creator><![CDATA[andi01]]></dc:creator><pubDate>Tue, 05 May 2009 12:27:56 GMT</pubDate></item></channel></rss>