C# Speicheradresse in einem Prozess finden!

PeterParty

Lt. Junior Grade
Registriert
Aug. 2008
Beiträge
282
Hey,

Ich möchte von einem Prozess eine bestimmte Speicheradresse finden, das möchte ich mit VirtualQueryEx und ReadProcessMemory bewältigen.

Mit der VirtualQueryEx Funkition möchte ich erstmal den Speicherbereich von meinem Prozess finden.

Code:
        [StructLayout(LayoutKind.Sequential)]
        public struct MEMORY_BASIC_INFORMATION
        {
            public IntPtr BaseAddress;
            public IntPtr AllocationBase;
            public uint AllocationProtect;
            public IntPtr RegionSize;
            public uint State;
            public uint Protect;
            public uint Type;
        }

Vom Prinzip verstehe ich das so, dass die BaseAdress = Anfangsadresse und BaseAdress + RegionSize = Endadresse?
Ich habe diese Seite im Internet gefunden und auf meinen Prozess angewendet.

Code:
            long MaxAddress = 0x7fffffff;
            long address = 0;
            do
            {
                MEMORY_BASIC_INFORMATION m;
                int result = VirtualQueryEx(pHandle, (IntPtr)address, out m, (uint)Marshal.SizeOf(typeof(MEMORY_BASIC_INFORMATION)));
                Console.WriteLine("{0}-{1} : {2} bytes result={3}", m.BaseAddress, (uint)m.BaseAddress + (uint)m.RegionSize - 1, m.RegionSize, result);
                if (address == (long)m.BaseAddress + (long)m.RegionSize)
                    break;
                address = (long)m.BaseAddress + (long)m.RegionSize;
            } while (address <= MaxAddress);
            Console.Read();

        }

Als Ergebniss bekomme ich:

Code:
0 - 4294967295 : 0 bytes result = 0

0 = Anfangsadresse?
4294967295 = Endadresse?


Bevor ich mit dem Durchsuchen der Adressen anfgange wollte ich fragen ob ich bis hierhin alles richtig gemacht habe?

Viele Grüße
Peter
 
Da kenne ich nen Trick ;) Geh auf die Seite von CheatEngine und lad dir den SourceCode :D Der ist frei unten bei den Downloads zu finden.

Btw: Sowas programmiert man in C++, ist sehr viel schneller und nicht an das .NET Framework gebunden und somit außerhalb von einigen Sicherheitsfeatures von .NET.
 
Hast du zufällig 4GB Arbeitsspeicher?

Edit:

Und wenn du als Anfangsadresse 0 raus bekommst, hilft dir das recht wenig, denn dieser Wert ist dann nur relativ zum Prozess und dass 4294967295 die Endadresse ist glaube ich kaum, denn das sind 4GB und die werden dein Prozess wohl nicht verwenden (inbesondere da .Net standardmäßig auf 2GB begrenzt, da bin ich mir aber nicht ganz sicher).
 
Zuletzt bearbeitet:
Freezedevil schrieb:
Wie schafft es das Tool im Speicher von fremden Prozessen rumzupfuschen?

Gibt genügend Funktionen in der WINAPI, die einen im gesamten RAM rumpfuschen lassen. Nur wenn man halt ausversehen etwas falsch addressiert, dann kracht's ;)

http://msdn.microsoft.com/en-us/library/windows/desktop/ms681674(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366899(v=vs.85).aspx

Dachte eigentlich immer CheatEngine würde mit DLL-Injection oder so etwas in der Art arbeiten.

B2T: Nichts desto trotz, 1 Minute Googlen und man findet passende .NET Implementierungen: http://www.mpgh.net/forum/250-c-programming/298510-c-writeprocessmemory-readprocessmemory.html
 
PeterParty schrieb:
weil 4294967295 bytes 4GB sind und diese wohl unrealistisch für deinen Prozess sind und 0 keine Baseaddress ist (außer man würde das auf den Arbeitsspeicher beziehen).

Greenmaxn schrieb:
B2T: Nichts desto trotz, 1 Minute Googlen und man findet passende .NET Implementierungen: http://www.mpgh.net/forum/250-c-programming/298510-c-writeprocessmemory-readprocessmemory.html

Das gleiche wie mein 2. Link, daher hatte ich wohl auch mein Code.
 
Das Problem bei den ganzen Beispielen im Internet ist, das dort immer nur das eig. schreiben und lesen gezeigt wird.
Ich möchte z.B den String "Hallo 123" im memory eines Prozesses suchen und die Adresse anzeigen lassen.
 
Zuletzt bearbeitet:
Ich benutze nun diesen Code von hier: http://forum.cheatengine.org/viewtopic.php?t=564488

Code:
            Byte[] toFind = StringToByteArray("TEST");
            IntPtr MyAddress = AobScan("Process Name Here", toFind);

Ich bekomme diese: 35490824 Adresse raus, wenn ich diese in HEX Convertiere ist es die selbe, die auch CheatEngine zurück gibt.

Wie kann ich die IntPtr Variable zu einer long variable konvertieren?
 
Zurück
Oben