Speicher manipulation mit C++/CLI .NET



  • Hallo

    Ich würd mir gerne einen Speicherbetrachter basteln der mir den Speicher einer Applikation in echtzeit anzeigt, so wie ich es von dem GameBoy-Emulator VBA kenne.

    Es ist nicht einfach, das ist mir klar und mein Wissensstand erlaubt mir ein solches Projekt vielleicht noch nicht aber ich will es versuchen.

    Derzeit suche ich eine Möglichkeit den Speicher überhaupt erstmal auszulesen und evtl. zu manipulieren. Jedoch ist die WinAPI ReadProcessMemory nicht gemanaged wenn ich mich nicht täusche.
    Ich suche daher nach einer möglichkeit das ganze gemanaged zu erledigen.

    An ein Prozess-Handle komme ich schon mit folgendem Code:

    using namespace System::Diagnostics;
    ...
    private: System::Void getPB_Click(System::Object^  sender, System::EventArgs^  e)
    {
    	listView1->Items->Clear();
    	int i=0;
    	for each(Process ^p in Process::GetProcesses())
    	{
    		listView1->Items->Add(""+p->Id);
    		listView1->Items[i++]->SubItems->Add(p->ProcessName);
    	}
    }
    private: System::Void detailPB_Click(System::Object^  sender, System::EventArgs^  e)
    {
    	if(listView1->SelectedItems->Count != 0)
    	{
    		Process ^dp = Process::GetProcessById(Convert::ToUInt32(listView1->SelectedItems[0]->Text));
    		//dp->Handle;	//Der Handle zum ausgewählten Prozess
    	}
    }
    

    Hab mir eine Form mit ner ListView und zwei Buttons gebaut. Button eins um die ListView mit den aktiven Prozessen zu füllen und Button zwei um irgendwas mit dem gewählten Prozess zu machen. In der ListView ist MultiSelect deaktiviert.

    Ich nutze MS Visual C++ 2008 Express bzw. Pro (arbeite an zwei unterschiedlichen Rechnern).
    Bitte verbessert mich falls ich damit schon im trüben stocher.

    MfG

    Mumpitz



  • Da du mit C++/CLI rummachst bist du ja nicht auf "managed" APIs eingeschränkt.
    Du kannst also jederzeit problemlos ReadProcessMemory aufrufen.



  • Ja das hab ich in meinem Buch gelesen das ich gemanagedten und ungemanagedten code "mischen" kann. Ich bin auch dabei das zu versuchen.
    Jedoch würde ich halt gerne wissen ob es das ganze auch schon gemanaged gibt.

    Ich hab schon immer son kleines Problem mit Speichermanagment gehabt. Damit mein ich seit ich in der Schule mit C angefangen hab. Hab da nie so ganz durchgeblickt.

    Schließlich hab ich die sache mit OpenProcess ja auch schon als gemanaged gefunden. (s.o.) 😃



  • Ich glaube nicht dass du von ReadProcessMemory eine "managed" Variante finden wirst.



  • So, mal ein kleines Update.

    for each (ProcessModule ^pm in dp->Modules)
    {
        if (pm->ModuleName == dp->MainModule->ModuleName)
        {
            array<unsigned char> ^mem = gcnew array<unsigned char>(pm->ModuleMemorySize);
            if (ReadProcessMemory((HANDLE)dp->Handle, (LPCVOID)pm->BaseAddress, &mem, pm->ModuleMemorySize, NULL))
            {
                MessageBox::Show("Geglückt", "Debug");
            }
            else
            {
                MessageBox::Show(""+GetLastError(), "Error");
            }
        }
    }
    

    dp = System::Diagnostics::Process, der gewählte Prozess auss dem gelesen werden soll.

    Mit diesem Code versuche ich den Speicher auszulesen. Er kompiliert auch ohne Probleme. Es tritt halt der übliche Fehler auf.
    GetLastError() = 998 = ERROR_NOACCESS, Invalid access to memory location.

    Dem lesenden Prozess fehlt das PROCESS_VM_READ.
    Kann man solche Rechte über das Visual Studio in irgend einem Eigenschaftsdialog setzen?
    Ansonsten bin ich für jeden Tip dankbar und werde natürlich selbst auch nach einer Lösung grübeln.

    MfG

    Mumpitz

    P.S.: Diesen Beitrag habe ich mit einem Nintendo DS geschrieben und fast zwei Stunden dafür gebraucht. Ich bitte fehler im Code zu entschuldigen. Der DS ist nicht sehr übersichtlich.



  • Ansonsten bin ich für jeden Tip dankbar

    DLL-Injection & Interprocesscommunication



  • Also das mit der DLL-Injection will ich mir aufheben falls es garnicht anders will.
    Fällt das nichtt schon in den Bereich hacking? Wird solcher Code dann nich als Schadsoftware erkannt?

    Ich habe gestern eine Methode der Klasse 'Process' entdeckt die da lautet: EnterDebugMode()
    Hier ein Auszug aus dem MSDN.

    Puts a Process component in state to interact with operating system processes that run in special mode by enabeling the naative property SeDebugPrivilege on the current thread.

    Hat mir aber bisher nichts gebracht. Evtl. benutze ich sie noch falsch oder es hat mit der SecurityPermission zu tun.
    Ich hab da noch was von dem NamedPermissionSet FullTrust gelesen und irgendwas mit assembly, die Codebeispiele waren aber alle in C#.

    Ich schwöre euch, wenn ich das hinbekomme mach ich den Code hier öffentlich. Dieses rumgeeier mit tausenden Dingen die man erst noch machen muss, das nervt.
    Na ich danke zumindest für die viele Anteilnahme.

    MfG

    Mumpitz


Anmelden zum Antworten