Du bist nicht angemeldet.

Werbeanzeige

E333

Alter Hase

Beiträge: 1 375

Beruf: Schüler

  • Private Nachricht senden

51

05.01.2011, 18:21

Es gab auch mal einen Teil 1 dieses Tutorials ...

idkat

Neuzugang

Beiträge: 2

Spieleentwicklung: Hobby

  • Private Nachricht senden

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 000

Spieleentwicklung: Hobby

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: 807

Spieleentwicklung: Hobby

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?

idkat

Neuzugang

Beiträge: 2

Spieleentwicklung: Hobby

  • Private Nachricht senden

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

Supermoderator

Beiträge: 7 287

Beruf: Team- & Projektleiter

  • 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? :)
Team-Leiter von Rickety Racquet (aka das "Foren-Projekt") und von Marble Theory

Werbeanzeige