Frage zu RVA und VA



  • Ich habe ein einfach C++ Programm geschrieben was einen String ausgibt.

    Nun schaue ich mit OllyDbg mein Programm an.

    43A0D0 <-- An der Adresse steht mein String.(Nennt man diese Adresse jetzt RVA Adresse oder VA ? )

    Die Base Adresse von meinem Code ist: 430000

    Jetzt öffne ich einen Hexeditor und Suche da denn String aus meinem Programm im Hexeditor steht mein string an Adresse: 38CD0

    Wie finde ich eine Adresse die in Olly angezeigt wird im Hexeditor wieder, das kann man doch irgendwie berechnen, ich meine auch sowas schon einmal gemacht zu haben vor langer Zeit aber ich kann mich nicht mehr erinnern wie das ging. 😞



  • Kann mir da keiner helfen?



  • RVA ist einfach nur die relative virtuelle Adresse. Das heißt es ist die Adresse des Strings substrahiert mit der Start Adresse eines Objekts in dessen Raum er sich befindet (z.B. die des Images selbst, also die Base oder des jeweiligen Segments). die VA ist dann die komplette Adresse 'Base + Offset'. Somit kannst du das nun selbst berechnen. Der Hex-Editor ließt ja die Datei auf einem Datenträger ein, somit ist die Start-Adresse des Images unbekannt oder einfach 0. Dann nimmst du das Offset zum Datensegment-Bereich und in dessen Kontext das Offset zum String. Schon hast du das komplette Offset. Das ist natürlich jetzt sehr allgemein erklärt. Aber ich hoffe, du weißt was ich meine und kannst das nun weiter selbst mal ausprobieren.

    Hier mal ein sehr simples Beispiel, hier aber mit einem Code-Objekt.

    //Offset zur Funktion glBegin berechnen
    HMODULE hModule = GetModuleHandle("opengl32.dll"); //Handle to opengl32.dll in memory. It is the base address of the module
    ...
    DWORD dwRelAddr = (DWORD)(GetProcAddress(hModule, "glBegin") - (DWORD)hModule); //Calculate relative offset
    ...
    printf("Relative Virtual Address of glBegin: %p\n", dwRelAddr);
    

Anmelden zum Antworten