2010-10-21 32 views
1

Hey, Aujourd'hui, j'ai essayé de faire une différence binaire de NDIS.sys, et j'ai remarqué quelque chose de bizarre. J'ai pris une fonction et j'ai commencé à la différencier. Les 30 premiers octets étaient les mêmes sur le disque (en utilisant IDA) et sur la mémoire (en utilisant WinDbg). Ensuite, quelque chose a changé. J'ai vu quelque chose comme "jmp _ imp _XXXXX". les octets JMP étaient les mêmes, mais l'adresse était différente. Ma question est: qu'est-ce qui fait la différence? Je pense que cela a quelque chose à voir avec les délocalisations. Bien que le saut soit adressé dans le même module, c'est un saut en longueur, ce qui le rend relativement à l'adresse de base du module. Si une relocalisation a lieu, elle doit également déplacer cette adresse, même si elle se trouve sur le même module.Quelles sont les causes des différences entre un pilote sur le disque et un pilote mappé en mémoire?

Ai-je tort ou raison? :-) Merci.

Répondre

2

Oui, les cibles de saut sont réécrites pendant le déplacement lorsqu'un module n'est pas chargé en mémoire dans son adresse de base préférée. En fait, les développeurs sont invités à fournir une adresse de base non-par défaut pour leurs modules afin d'éviter les coûts de relocalisation, mais beaucoup ne le font jamais, donc certains modules seront toujours déplacés et le chargeur devra réécrire les cibles de saut.

+0

Notez que pour les pilotes de périphérique, l'adresse de base préférée est entièrement ignorée – snoone

+0

Yup, mais - pourquoi le saut a dû être rebasé? La destination du saut se trouve dans le même module. – MindBlower

+0

Pouvez-vous montrer ce que vous voyez dans le débogueur? – snoone