Diskuze: C++ Vypsání hodnoty long long int z RAM

C a C++ C a C++ C++ Vypsání hodnoty long long int z RAM American English version English version

Aktivity (1)
Avatar
Caster
Člen
Avatar
Caster:22. května 23:29

V paměti mám po volání ASM funkce z C++ data v paměti. Jak mohu data

BYTE* ptr; // Adresa začátku alokovaného pole v RAM
// má hodnotu 0x000001881e690000
// k adrese potřebuji přičíst 0x01719F0F6B
// a vypsat proměnnou __INT64 v C++ z té adresy
printf("%lli\t", x);

Jak to udělat ?

 
Odpovědět 22. května 23:29
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Caster
Martin Dráb:23. května 1:32

Takto?

printf("%lli", *(__INT64 *)(ptr + 0x01719F0F6B));

Není to moc C++ způsob, ale Céčkový.

Nahoru Odpovědět  +1 23. května 1:32
2 + 2 = 5 for extremely large values of 2
Avatar
Caster
Člen
Avatar
Caster:23. května 10:36

Díky, zapomněl jsem, že ta data v paměti jsou ve tvaru DWORD ne __int64. Hodnot může být více za sebou a proto je vypisuji v cyklu:

for (int i = 0; i <=(int)x; i++)
        {
                printf("%lli\n", *(__int64 *)(bsrc + 0x01719F0F6B + 4*i));
        }

Nyní je výsledkem jen jedna hodnota. V paměti jsou data uložena takto (bsrc+0x01719­F0F6B):
00 00 00 00 67 9e 00 00

což printf vytiskne jako 174165218820096 (0x9E67 0000 0000). Jak to upravit, aby mi to vytisklo jen DWORD 0x9E67 tj. 40551 desítkově ?

 
Nahoru Odpovědět 23. května 10:36
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Caster
Martin Dráb:23. května 10:42

Pokud to jsou DWORDy, tak je vypisuj jako DWORDy (%i, případně %li to na x86/x64 zařídí).

for (int i = 0; i <=(int)x; i++) {
  printf("%i\n", *(DWORD *)(bsrc + 0x01719F0F6B + sizeof(DWORD)*i));
}
Nahoru Odpovědět 23. května 10:42
2 + 2 = 5 for extremely large values of 2
Avatar
Caster
Člen
Avatar
Caster:23. května 12:10

Díky, když použiji

for (int i = 1; i <=(int)x; i++) {
  printf("%i\n", *(DWORD *)(bsrc + 0x01719F0F6B + 4));
}

tak mi to správně vypíše 40551, se sizeof(DWORD)*i) to vypíše nulu. Někde jsem myslím četl, že u pointerů nelze použít násobení.

P.S. Lze nějak naformátovat, aby se čísla vypisovala s mezerou po tisících ?

 
Nahoru Odpovědět 23. května 12:10
Avatar
Caster
Člen
Avatar
Caster:23. května 12:14

Ověřil jsem si, že

cout << "sizeof(DWORD ) : " << sizeof(DWORD) << '\n';

jsou 4.

 
Nahoru Odpovědět 23. května 12:14
Avatar
Caster
Člen
Avatar
Caster:1. června 13:50

Vyřešeno, i s tím násobením to funguje správně.

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět  -1 1. června 13:50
Avatar
B42P6
Člen
Avatar
Odpovídá na Caster
B42P6:1. června 19:00

Akceptované riešenie? Podľa mňa je to čo napísal Martin Dráb "funkčnejšie" :-P

Nahoru Odpovědět 1. června 19:00
'long long long' is too long for GCC
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Caster
Martin Dráb:1. června 19:10

Ano, sizeof(DWORD) = 4. Použil jsem to proto, že jsi čtyřku použil v původním příspěvku.

Nahoru Odpovědět 1. června 19:10
2 + 2 = 5 for extremely large values of 2
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.