Teamviewer
Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
    
Bücher-Shop mit Amazon (Buchkategorien):  C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : COM & DCOM : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Projektmanagement : Software-Testing
C/C++ Forum :: C++/CLI mit .NET ::  Speicher manipulation mit C++/CLI .NET     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Mumpitz
Mitglied

Benutzerprofil
Anmeldungsdatum: 08.02.2010
Beiträge: 5
Beitrag Mumpitz Mitglied 23:22:22 08.02.2010   Titel:   Speicher manipulation mit C++/CLI .NET            Zitieren

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:
C++/CLI:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
    }
}
C++/CLI:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
}
}
C++/CLI:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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


Zuletzt bearbeitet von Mumpitz am 22:05:39 11.02.2010, insgesamt 1-mal bearbeitet
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 8194
Beitrag hustbaer Mitglied 00:48:12 09.02.2010   Titel:              Zitieren

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

_________________
"Let there be Licht..." http://lichttools.sourceforge.net/
Wer const vor den Typ schreibt, ist doof.
Mumpitz
Mitglied

Benutzerprofil
Anmeldungsdatum: 08.02.2010
Beiträge: 5
Beitrag Mumpitz Mitglied 04:55:14 10.02.2010   Titel:              Zitieren

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.) :D
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 8194
Beitrag hustbaer Mitglied 09:51:53 10.02.2010   Titel:              Zitieren

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

_________________
"Let there be Licht..." http://lichttools.sourceforge.net/
Wer const vor den Typ schreibt, ist doof.
Mumpitz
Mitglied

Benutzerprofil
Anmeldungsdatum: 08.02.2010
Beiträge: 5
Beitrag Mumpitz Mitglied 19:53:26 10.02.2010   Titel:   Problem mit PROCESS_VM_READ            Zitieren

So, mal ein kleines Update.

C++/CLI:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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");
        }
    }
}
C++/CLI:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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");
}
}
}
C++/CLI:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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.
mogel
Mitglied

Benutzerprofil
Anmeldungsdatum: 02.04.2009
Beiträge: 398
Beitrag mogel Mitglied 00:13:10 11.02.2010   Titel:   Re: Problem mit PROCESS_VM_READ            Zitieren

Zitat:
Ansonsten bin ich für jeden Tip dankbar

DLL-Injection & Interprocesscommunication

_________________
http://www.fantasya-pbem.de - Fantasy-Multiplayer-Strategie - Runden basiert


Zuletzt bearbeitet von mogel am 00:13:32 11.02.2010, insgesamt 1-mal bearbeitet
Mumpitz
Mitglied

Benutzerprofil
Anmeldungsdatum: 08.02.2010
Beiträge: 5
Beitrag Mumpitz Mitglied 21:58:59 11.02.2010   Titel:              Zitieren

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.
Zitat:
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
C/C++ Forum :: C++/CLI mit .NET ::  Speicher manipulation mit C++/CLI .NET   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.