Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: WinAPI ::  Speicher Verständis  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
dirk01
Unregistrierter




Beitrag dirk01 Unregistrierter 18:57:28 28.01.2012   Titel:   Speicher Verständis            Zitieren

Hallo

Habe da mal ne frage bez. Speicher.
Wenn ich jetzt Bereich: 0x00510000 - 0x00511000 (RegionSize:4096) habe, habe ich dann 4*4096bytes (16384bytes) Speicher? Weil eine Adresse ja 4byte Speicher belegt auf 32bit systemen.
cooky451
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.10.2010
Beiträge: 4840
Beitrag cooky451 Mitglied 19:00:20 28.01.2012   Titel:              Zitieren

Ich weiß zwar nicht was das mit Standard C zu tun haben soll, aber du hast wohl eher 4096 (0x1000) Byte Speicher. Eine Adresse belegt vielleicht 4 Byte, aber das ändert ja nichts daran, dass jedes Byte einzeln adressiert ist.

_________________
Sie sind nicht berechtigt unrechtmäßige Kopien dieses Datenträgers zu erstellen.™


Zuletzt bearbeitet von cooky451 am 19:01:21 28.01.2012, insgesamt 1-mal bearbeitet
dirk01
Unregistrierter




Beitrag dirk01 Unregistrierter 19:08:34 28.01.2012   Titel:              Zitieren

Aber dann würde ich mit diesem Code am Ende über den Speicher hinaus lesen oder?

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void ScanMem(HANDLE hproc ,DWORD start ,DWORD end)
{

    DWORD read = 0;
    int buffer = 0;

    printf("wird gescannt...\n");

    for(start; start < end ;start++) {

        ReadProcessMemory(hproc ,(void *) start ,&buffer ,sizeof(int) ,&read);
        if(buffer == 0x65) {
            printf("Wert an 0x%.8lx gefunden!", start);
                getchar();
              return;
        }
    }
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void ScanMem(HANDLE hproc ,DWORD start ,DWORD end)
{

DWORD read = 0;
int buffer = 0;

printf("wird gescannt...\n");

for(start; start < end ;start++) {

ReadProcessMemory(hproc ,(void *) start ,&buffer ,sizeof(int) ,&read);
if(buffer == 0x65) {
printf("Wert an 0x%.8lx gefunden!", start);
getchar();
return;
}
}
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void ScanMem(HANDLE hproc ,DWORD start ,DWORD end)
{

    DWORD read = 0;
    int buffer = 0;

    printf("wird gescannt...\n");

    for(start; start < end ;start++) {

        ReadProcessMemory(hproc ,(void *) start ,&buffer ,sizeof(int) ,&read);
        if(buffer == 0x65) {
            printf("Wert an 0x%.8lx gefunden!", start);
                getchar();
              return;
        }
    }
}
Z
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.02.2010
Beiträge: 773
Beitrag Z Mitglied 19:15:55 28.01.2012   Titel:   Re: Speicher Verständis            Zitieren

dirk01 schrieb:
Hallo

Habe da mal ne frage bez. Speicher.
Wenn ich jetzt Bereich: 0x00510000 - 0x00511000 (RegionSize:4096) habe, habe ich dann 4*4096bytes (16384bytes) Speicher? Weil eine Adresse ja 4byte Speicher belegt auf 32bit systemen.

Das hängt damit zusammen, ob deine Maschine byte-adressierbar (also 8 bit) ist. Besteht ein Speicherwort aus 32 Bits, dann bestehen 4096 Adressen aus 32*4096 Speicherbits.

_________________
a = b << c; /* shift happens */
cooky451
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.10.2010
Beiträge: 4840
Beitrag cooky451 Mitglied 19:18:02 28.01.2012   Titel:              Zitieren

Kommt darauf an, wie du die Funktion aufrufst. Wenn [start;end) dir gehört, dann nicht.

_________________
Sie sind nicht berechtigt unrechtmäßige Kopien dieses Datenträgers zu erstellen.™
dirk01
Unregistrierter




Beitrag dirk01 Unregistrierter 19:19:02 28.01.2012   Titel:              Zitieren

Ja das weis ich auch danke... möchte eben nur wissen ob es beim obigen konstrukt ein überlauf gibt - bei einer maschine die byte adressierbar ist.
dirk01
Unregistrierter




Beitrag dirk01 Unregistrierter 19:20:21 28.01.2012   Titel:              Zitieren

C/C++ Code:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
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
49
50
51
52
53
54
55
56
57
58
59
60
61
void GetMemMinMax(DWORD pid)
{
    HANDLE hprocess = NULL;
    MEMORY_BASIC_INFORMATION mbi;
    unsigned long adress = 0x00400000; // Start memory address
    unsigned long start;
    unsigned long end;

    hprocess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
    if(hprocess == NULL) {
        printf("OpenProcess(), error %i\n",GetLastError());
        getchar();
        return;
    }


    do
    {
        VirtualQueryEx( hprocess ,(void *) adress ,&mbi ,sizeof(MEMORY_BASIC_INFORMATION) );

        if( ( (mbi.State == MEM_COMMIT) && (mbi.Protect == PAGE_READWRITE) ) && (mbi.Type == MEM_PRIVATE)) {
            start = (unsigned int) mbi.BaseAddress;
            end = (unsigned int) mbi.BaseAddress + mbi.RegionSize;

            printf("Bereich: 0x%.8lx - 0x%.8lx  Size:%li ",start ,end ,end-start);

            // Scan memory
            ScanMem(hprocess ,start ,end);
        }

        adress += mbi.RegionSize;

    }
    while(adress < 0x80000000);

    CloseHandle(hprocess);

    return;
}




void ScanMem(HANDLE hproc ,DWORD start ,DWORD end)
{

    DWORD read = 0;
    int buffer = 0;

    printf("wird gescannt...\n");

    for(start; start < end ;start++) {

        ReadProcessMemory(hproc ,(void *) start ,&buffer ,sizeof(int) ,&read);
        if(buffer == 0x65) {
            printf("Wert an 0x%.8lx gefunden!", start);
                getchar();
              return;
        }
    }
}
C/C++ Code:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
void GetMemMinMax(DWORD pid)
{
HANDLE hprocess = NULL;
MEMORY_BASIC_INFORMATION mbi;
unsigned long adress = 0x00400000; // Start memory address
unsigned long start;
unsigned long end;

hprocess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
if(hprocess == NULL) {
printf("OpenProcess(), error %i\n",GetLastError());
getchar();
return;
}


do
{
VirtualQueryEx( hprocess ,(void *) adress ,&mbi ,sizeof(MEMORY_BASIC_INFORMATION) );

if( ( (mbi.State == MEM_COMMIT) && (mbi.Protect == PAGE_READWRITE) ) && (mbi.Type == MEM_PRIVATE)) {
start = (unsigned int) mbi.BaseAddress;
end = (unsigned int) mbi.BaseAddress + mbi.RegionSize;

printf("Bereich: 0x%.8lx - 0x%.8lx Size:%li ",start ,end ,end-start);

// Scan memory
ScanMem(hprocess ,start ,end);
}

adress += mbi.RegionSize;

}
while(adress < 0x80000000);

CloseHandle(hprocess);

return;
}




void ScanMem(HANDLE hproc ,DWORD start ,DWORD end)
{

DWORD read = 0;
int buffer = 0;

printf("wird gescannt...\n");

for(start; start < end ;start++) {

ReadProcessMemory(hproc ,(void *) start ,&buffer ,sizeof(int) ,&read);
if(buffer == 0x65) {
printf("Wert an 0x%.8lx gefunden!", start);
getchar();
return;
}
}
}
C/C++ Code:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
void GetMemMinMax(DWORD pid)
{
    HANDLE hprocess = NULL;
    MEMORY_BASIC_INFORMATION mbi;
    unsigned long adress = 0x00400000; // Start memory address
    unsigned long start;
    unsigned long end;

    hprocess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
    if(hprocess == NULL) {
        printf("OpenProcess(), error %i\n",GetLastError());
        getchar();
        return;
    }


    do
    {
        VirtualQueryEx( hprocess ,(void *) adress ,&mbi ,sizeof(MEMORY_BASIC_INFORMATION) );

        if( ( (mbi.State == MEM_COMMIT) && (mbi.Protect == PAGE_READWRITE) ) && (mbi.Type == MEM_PRIVATE)) {
            start = (unsigned int) mbi.BaseAddress;
            end = (unsigned int) mbi.BaseAddress + mbi.RegionSize;

            printf("Bereich: 0x%.8lx - 0x%.8lx  Size:%li ",start ,end ,end-start);

            // Scan memory
            ScanMem(hprocess ,start ,end);
        }

        adress += mbi.RegionSize;

    }
    while(adress < 0x80000000);

    CloseHandle(hprocess);

    return;
}




void ScanMem(HANDLE hproc ,DWORD start ,DWORD end)
{

    DWORD read = 0;
    int buffer = 0;

    printf("wird gescannt...\n");

    for(start; start < end ;start++) {

        ReadProcessMemory(hproc ,(void *) start ,&buffer ,sizeof(int) ,&read);
        if(buffer == 0x65) {
            printf("Wert an 0x%.8lx gefunden!", start);
                getchar();
              return;
        }
    }
}
Th69
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.03.2008
Beiträge: 2256
Beitrag Th69 Mitglied 19:21:00 28.01.2012   Titel:              Zitieren

Nimm dann gleich einen entsprechenden Zeiger, dann paßt es automatisch:
C/C++ Code:
int *p = (int*)start;
int *pEnd = (int *)end;
for(; p < pEnd ; p++)
{
    ReadProcessMemory(hproc, p ,&buffer, sizeof(int), &read);

}
C/C++ Code:
int *p = (int*)start;
int *pEnd = (int *)end;
for(; p < pEnd ; p++)
{
ReadProcessMemory(hproc, p ,&buffer, sizeof(int), &read);

}
C/C++ Code:
int *p = (int*)start;
int *pEnd = (int *)end;
for(; p < pEnd ; p++)
{
    ReadProcessMemory(hproc, p ,&buffer, sizeof(int), &read);

}

So liest du "(end - start) / sizeof(int)" Werte aus.
cooky451
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.10.2010
Beiträge: 4840
Beitrag cooky451 Mitglied 19:22:26 28.01.2012   Titel:              Zitieren

Sieht in Ordnung aus, allerdings solltest du "read" auch überprüfen, wenn du dir die Information schon holst. Also if (read == sizeof(int) && buffer == 0x65).

Edit: Warte mal, du übergibst da DWORD statt DWORD*? :eek:
Wenn du jede Kombination checken willst, dann nimm zumindest char*. Aber caste doch keine Pointer in Integer um. oO

_________________
Sie sind nicht berechtigt unrechtmäßige Kopien dieses Datenträgers zu erstellen.™


Zuletzt bearbeitet von cooky451 am 19:23:44 28.01.2012, insgesamt 1-mal bearbeitet
dirk01
Unregistrierter




Beitrag dirk01 Unregistrierter 19:24:01 28.01.2012   Titel:              Zitieren

Und wenn ich einen String habe?
C/C++ Forum :: WinAPI ::  Speicher Verständis  
Gehen Sie zu Seite 1, 2  Weiter
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

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

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.