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? P>
3 Réponses :
Pour déterminer le décalage du fichier par RVA, vous avez besoin: p>
Vous recevrez un décalage de fichier dont vous avez besoin. p>
// 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); }
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.
DWORD RETADDRDDRDRDDRDRDDRDDRDDRDDRDDRDDRDDRDDRDDRDDRDDRDDRDDRDDRDDRDDR = VirtualAddress) +
(SectionHeader-> Pointertorawdata); P>
blockQuote> Ajoutez une adresse de base de fichier pour obtenir une adresse physique p> Retaddr + (Pbyte) LPFileBase P>
blockQuote>
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 code> 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 code> 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 code>, 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 code> de fichier mappé de mémoire, nous devons utiliser CARD compensations brutes code> à partir de
Pointeur de base de fichier code> en mémoire. Par conséquent, d'abord, nous obtenons
Point d'entrée RAW Complet code> à partir de son
rva code>, second, ajoutez
Pointeur de base de fichier code> (VA en mémoire) à ce
Décalage brut code> pour obtenir
VA de l'entréePoint du fichier mappé de mémoire code>.
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.