Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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

Aktivity
Avatar
Caster
Člen
Avatar
Caster:22.5.2018 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.5.2018 23:29
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Caster
Martin Dráb:23.5.2018 1:32

Takto?

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

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

Nahoru Odpovědět
23.5.2018 1:32
2 + 2 = 5 for extremely large values of 2
Avatar
Caster
Člen
Avatar
Caster:23.5.2018 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.5.2018 10:36
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Caster
Martin Dráb:23.5.2018 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.5.2018 10:42
2 + 2 = 5 for extremely large values of 2
Avatar
Caster
Člen
Avatar
Caster:23.5.2018 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.5.2018 12:10
Avatar
Caster
Člen
Avatar
Caster:23.5.2018 12:14

Ověřil jsem si, že

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

jsou 4.

 
Nahoru Odpovědět
23.5.2018 12:14
Avatar
Caster
Člen
Avatar
Caster:1.6.2018 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.6.2018 13:50
Avatar
B42P6
Člen
Avatar
Odpovídá na Caster
B42P6:1.6.2018 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.6.2018 19:00
'long long long' is too long for GCC
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Caster
Martin Dráb:1.6.2018 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.6.2018 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.