8
votes

être offset dans le fichier de RVA

J'essaie de lire un fichier PE.
Les problèmes sont que les données utilisent des pointeurs de RVA pendant que j'ai besoin de compensation dans le fichier
pour obtenir ce dont j'ai besoin. Comment puis-je convertir la RVA en décalage dans le fichier?


11 commentaires

Supposons que vous ne puissiez pas le lire dans le fichier, comment fonctionne le chargeur PE?


Je ne sais pas ... Est-ce qu'il montre les informations de déroulement? Et si je peux le lire dans le fichier, quelle est l'adresse décalée?


Selon mes informations, elles sont relatives à ImageBase (dans l'en-tête)


Le problème est que la valeur de "imagebase" dans l'en-tête est beaucoup plus grande que la taille de l'exécutable.


Eh bien oui, la position que vous sortez de cela est la position qu'il aurait en mémoire, pas dans le fichier.


Donc, j'ai besoin de charger le module?


Ok, attends .. est la question réelle: "Comment convertir une RVA en offset dans le fichier"?


hmmm ... eh bien je suppose que c'est ce que j'essaie de faire :)


est-ce que cela aide? Art0.org/ravering/... < / a>


Je pense que ça va. Si vous postez cela comme une réponse, je l'accepterai. Je vais aussi mettre à jour ma question :)


Avez-vous suivi un coup d'œil à échantillon de Pedump de Matt Pietrek ? Il montre comment cela fonctionne.


3 Réponses :


10
votes

Pour déterminer le décalage du fichier par RVA, vous avez besoin:

  1. Pour déterminer dans quelle section Points RVA.
  2. Soustrayez de votre adresse Adresse virtuelle relative de la section
  3. Ajouter au résultat Le décalage de fichier de la section

    Vous recevrez un décalage de fichier dont vous avez besoin.


1 commentaires

heures! Les heures! J'ai eu du mal avec ça ... Merci d'avoir dit clairement!



1
votes
// Example:
//   RVA: F0B0
//   Virtual offset: F000 ("RVA" in PEview)
//   Raw offset: C600 ("Pointer to Raw Data" in PEview)
//   fileOffset = F0B0 - F000 + C600 = C6B0
private static uint rvaToFileOffset(uint i_Rva, uint i_VirtualOffset, uint i_RawOffset)
{
    return (i_Rva - i_VirtualOffset + i_RawOffset);
}

0 commentaires

3
votes

ci-dessous exemple donne le décalage de fichier d'adresse du point d'entrée de la RVA. On peut transmettre n'importe quel pointeur pour obtenir son décalage de disque de RVA.

essentiellement, nous devons trouver dans quelle section l'adresse appartient. Une fois que la section correcte est identifiée, utilisez ci-dessous la formule pour vous offenser.

DWORD RETADDRDDRDRDDRDRDDRDDRDDRDDRDDRDDRDDRDDRDDRDDRDDRDDRDDRDDRDDRDDR = VirtualAddress) + (SectionHeader-> Pointertorawdata);

Ajoutez une adresse de base de fichier pour obtenir une adresse physique

Retaddr + (Pbyte) LPFileBase xxx


3 commentaires

ajouté une description ainsi que des commentaires.


Pouvez-vous s'il vous plaît expliquer pourquoi ajoutons-nous un pointeur de base de fichier lpfilebase sur un décalage de disque brut? On dirait que nous ajoutons des compensations brutes à un décalage virtuel qui n'est pas correct, je pense. Je pensais que lpfilebase est une adresse virtuelle où le fichier a été mappé. Pour obtenir une adresse virtuelle du point d'entrée de ce fichier, nous devons ajouter une rva de point d'entrée sur lpfilebase , nous aurons une valeur de point d'entrée de ce fichier mail.


Je pense avoir manqué que les fichiers sont mappés en mémoire comme 1 à 1 de leur image disque dur. Corrige moi si je me trompe. Donc, pour obtenir un point d'entrée de fichier mappé de mémoire, nous devons utiliser CARD compensations brutes à partir de Pointeur de base de fichier en mémoire. Par conséquent, d'abord, nous obtenons Point d'entrée RAW Complet à partir de son rva , second, ajoutez Pointeur de base de fichier (VA en mémoire) à ce Décalage brut pour obtenir VA de l'entréePoint du fichier mappé de mémoire .