windows - Hexadecimals addition slutresultatet er altid forkert? C ++

Indlæg af Hanne Mølgaard Plasc

Problem



Når jeg vil beregne adressen til en funktion, gør jeg følgende:


HMODULE base = GetModuleHandle(L"program.exe"); // Module base addr

// Adding an offset to the base
std::cout << (base + 0x8F0A0) << std::endl; -> Wrong!


Jeg er ikke sikker på hvorfor resultatet er forkert. Jeg har testet det via online hex calcs og har også debugger for at kontrollere begge værdier.


Kan basen betragtes som decimal og andre er hex, producerer forkerte resultater?


Hvordan kan jeg få et resultat i hex?

Bedste reference


Som forklaret her, afhængigt af om STRICT er defineret, er HMODULE i det væsentlige enten en void* eller en <unique type>*, hvor formålet med dette er at gøre hver håndtagstype en anden C ++ type, hvilket betyder kompileringsfejl, når du blander og matcher. I det forrige tilfælde vil pointer aritmetik ikke kompilere. I sidstnævnte tilfælde vil det kompilere, men man kan ikke stole på noget, der sker, fordi pegerens aritmetik tager højde for typeens størrelse, og fordi pointer aritmetik er udefineret, hvis du forlader objektet/arrayet er peget på. [16]


Du bør behandle denne peger som peger på intet i særdeleshed, og derfor ikke peger aritmetisk. Du skal reinterpret\_cast det til en integreret type, som du er sikker på, er stor nok (std::uintptr\_t) og derefter gøre aritmetik på den integrerede værdi.


I min lokale overskrift indeholder denne unikke type et int medlem, så tilføjelse 1 vil rent faktisk bevæge markøren fremad med 4 byte (du ved, undtagen den udefinerede opførsel og alle). Det sker bare så, at 0x00DE0000 + 4 * 0x8F0A0 er din 0x0101C280 værdi.

Andre referencer 1


Du er et problem med værdien GetModuleHandle(L"program.exe") tilbage: 00DE0000. Du skal bruge C hexadecimal syntaks, så du skal tilføje og forudgå '0x' til dit hex nummer 00DE0000 .


Derfor skal dit basisnummer udkastes til en numerisk værdi: 0x00DE0000


0x00DE0000 is equal to 00DE0000


Prøv at bruge std::string to\_string(int value); til at konvertere den til streng, og konverter derefter dine hex-værdier (base) til C-hexadecimal syntaks (tilføj '0x' i begyndelsen af ​​din hex-værdi). For at afslutte skal du konvertere din basisværdi tilbage til en numerisk værdi (f.eks. Bruge std :: stoi ) og udfør tilføjelsen ved hjælp af std :: hex . [17] [18]





Prøv denne kode her. [19]


#include <iostream>

int main () {
    int hex1 = 0x8F0A0;
    int hex2 = 0x00DE0000; // Using int values

    std::cout << std::hex << hex1 + hex2 << std::endl;
}

Andre referencer 2


Som Chris har sagt, havde jeg samme sag, så jeg løste sagen sådan:


int offset = 0x8F0A0;
std::uintptr\_t base = reinterpret\_cast<uintptr\_t>(GetModuleHandle(L"program.exe"));

// Here added 4 bytes to the offset.

std::cout << std::hex << (base + (offset + 4096)) << std::endl;