Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

51

05.01.2011, 18:21

/

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »E333« (02.09.2021, 04:21)


52

25.01.2012, 07:29

hi,

auch wenn das thema schon etwas älter ist.... hätte ich doch eine frage

könnte man auch 2 prozesse die man auswählt miteinander vergleichen und die addressen mit value ausgeben die unterschiedlich sind?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

53

25.01.2012, 12:46

Könnte man. Nur, was hätte man davon? Der naive Ansatz wäre zudem impraktikabel da er ewig lange dauern würde und ein nicht naiver Ansatz wäre vermutlich ziemlich kompliziert.

DasBlub

Alter Hase

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

54

25.01.2012, 13:49

mach doch einfach 2x memdump und dann ein binary diff von den beiden dumps? dann hast du zwar nicht die variablennamen, aber schonmal n anfang... :)

wofür muss man überhaupt ein diff von zwei speicherbereichen machen?

55

25.01.2012, 18:53

Könnte man. Nur, was hätte man davon? Der naive Ansatz wäre zudem impraktikabel da er ewig lange dauern würde und ein nicht naiver Ansatz wäre vermutlich ziemlich kompliziert.
mmh ich habe 2 prozesse die fast identisch sind 5-8 values sind unterschiedlich und diesen unterschied hätte ich gerne mit c++ rausgesucht

doch einfach 2x memdump und dann ein binary diff von den beiden dumps?
dann hast du zwar nicht die variablennamen, aber schonmal n anfang... :)
wofür muss man überhaupt ein diff von zwei speicherbereichen machen?
aha..??
da ich schon eure aussagen nicht wirklich verstanden habe muss ich das wohl aufgeben :(
oder könnte vill jemd so lieb sein mir zeigen wie das geht? :)

56

05.07.2012, 11:09

Ja, der Thread ist ein Stück veraltet, allerdings würde mich etwas interessieren!
Ich arbeite gerade mit Speicheradressen und co. und möchte das Prinzip verstehen, aus diesem
Grund wollte ich einfach mal das Programm so umschreiben das es auch nach Strings suchen kann.

Mein Ansatz war, da ich denke das in jeder Speicherschublade ein char des Strings vorhanden ist,
dass ich einfach überprüfe ob bei der nächsten Adresse der char weiterhin übereinstimmt mit der jeweiligen
Stelle des Strings, so lange bis der String durch ist...

Hier meine derzeitige Version der umgeschriebenen Funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
void scan_memory (::HANDLE process, ::DWORD start, ::DWORD end, std::string value, std::vector<::DWORD>& adresses)
{
    std::string str = "";

    for(::DWORD i = start; i < end; ++i)
    {
        for(int x = 0; x < value.length(); ++x)
        {       
            char read_buffer = 0;

            // Wert auslesen
            ::ReadProcessMemory(process, reinterpret_cast<void*>(i + x), &read_buffer, sizeof (char), 0);

            // Wert stimmt mit gesuchten Wert berein
            if(read_buffer == value.at(x))
            {
                // Zum String hinzufügen
                str += read_buffer;
            }
            else
            {
                // String ausgeben
                for(int y = 0; y < str.length(); ++y)
                {
                    std::cout << str.at(y);
                }

                std::cout << "\n";

                str = "";
                break; // Schleife verlassen
            }
        }

        if(str.find(value) != std::string::npos)
        {
            for(int x = 0; x < value.length(); ++x)
            {  
                // Alle Adressen hinzufügen
                adresses.push_back(i + x);  
            }
        }
        else
        {
            str = "";
        }
    }
}


Ich habe einfach den Parameter zu einem String Objekt gemacht und hab halt wie oben schon erklärt einfach bei einer anfangs Adresse
alle weiteren Werte mit dem String verglichen, wenn der String nicht mehr übereinstimmt, wird mit der nächsten Anfangsadresse weiter gemacht...

Das ganze funktioniert natürlich nicht, sonst würde ich ja nicht hier fragen, es wird ständig ein Zeichen ausgegeben und
sehr oft ist dieses Zeichen ein Leerzeichen... Hat jemand eine Idee wie man das realisieren könnte und ist mein Ansatz völlig verkehrt?

Vielen Dank im Voraus! :)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Jack« (05.07.2012, 11:15)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

57

05.07.2012, 11:27

Also was mir aufstößt (von den Kommentaren ["break; // Schleife verlassen" - echt jetzt?] mal abgesehen), ist das hier:
for(int y = 0; y < str.length(); ++y)
{
std::cout << str.at(y);
}

Der Ansatz an sich ist erstmal nicht sooo falsch. Du gehst den Speicher durch und schaust, ob er mit deinem String übereinstimmt. Aber was ist z.B. mit Unicode? Und was soll das sein: "if(str.find(value) != std::string::npos)"? Da reicht doch eine Prüfung der Länge des Strings. Überhaupt würde ich's wohl ganz anders schreiben, aber theoretisch sieht es erstmal nicht ganz unfunktional aus. Dass Leerzeichen ausgegeben werden, klingt durchaus logisch, denn Du gibst ja jeden Quatsch aus, der nicht mit dem übereinstimmt, was du suchst.

Wie wär's mit einem Debugger? :)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

AlexWorX

unregistriert

58

24.09.2015, 10:49

Broken Links!!!

Die Links auf der ersten Seite, zu den Bildern und den progs funktionieren nich mehr. Einfach PM oder Mail.
Danke

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

59

24.09.2015, 11:21

Das ist nach 7 Jahren durchaus zu erwarten, oder?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

60

24.09.2015, 14:03

Einfach PM oder Mail.

Also soll sich jetzt einer von uns hinsetzen und einen 7 Jahre alten Thread auffrischen und reparieren und dir den Kram per Mail schreiben damit du nicht hier rein gucken musst oder wie soll man das verstehen :D
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige