Question:
Appel à une fonction importée dans un fichier PE: Pourquoi la destination est-elle précédée de ds (appelez ds: func_name)?
langlauf.io
2015-04-24 16:46:44 UTC
view on stackexchange narkive permalink

Dans les fichiers Windows PE (32 et 64 bits), les appels aux fonctions importées ressemblent à ceci dans IDA PRO:

  call ds: SetEvent // default settingcall [ds: SetEvent] // Target Assembleur réglé sur TASM  

Je comprends ce qu'il fait (appel indirect, import table, ...) mais ce que je ne comprends pas: Pourquoi IDA ajoute-t-il le ds: devant le nom de la fonction? J'ai vérifié l'opcode, c'est FF 15 qui signifie un appel near .

Si j'ai raison de supposer que le ds est un registre de segment, il n'est pas nécessaire de le spécifier car un appel proche signifie un appel d'une fonction à l'intérieur du même segment.

Quelqu'un pourrait-il expliquer pourquoi IDA est ajouter le ds: quand même et à quoi ça sert?

Un répondre:
peter ferrie
2015-04-24 20:50:13 UTC
view on stackexchange narkive permalink

Le FF 15 est un appel indirect absolu. Il récupère la valeur à un emplacement mémoire, puis transfère le contrôle à l'adresse récupérée.

Afin de spécifier cet emplacement mémoire précisément, le CPU a besoin à la fois du registre de segment et de l'adresse. En l'absence de requête explicite (2E pour CS, par exemple), ou d'un mode qui a un override implicite (l'utilisation d'EBP sélectionne SS :), DS: est utilisé. Bien que Windows utilise un modèle de mémoire plate, rien n'empêche les registres de segment de se voir attribuer d'autres valeurs: Windows 32 bits prend en charge les entrées de la table de descripteurs locaux, par exemple, et il existe des astuces où DS: reçoit la valeur de FS:, pour effectuer un enregistrement SEH non évident.

IDA affiche le registre de segment pour supprimer toute ambiguïté quant au registre de segment utilisé.

vous écrivez: "Afin de spécifier cet emplacement mémoire avec précision, le processeur a besoin à la fois du registre de segment et de l'adresse." Je pensais qu'un appel proche ne nécessitait aucune information de segment. Je pensais qu'un appel proche était "un appel d'une fonction à l'intérieur du même segment". Est-ce que je manque quelque chose?
Peut-être "Afin de spécifier l'emplacement à partir duquel aller chercher", alors? «proche» dans ce sens se réfère à l'adresse de retour, pas à l'emplacement à partir duquel elle est extraite. Un appel proche a uniquement l'adresse de retour placée sur la pile. Un appel distant a le sélecteur et l'adresse de retour placés sur la pile.
Je l'ai maintenant. Merci pour la clarification supplémentaire.


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...