2010-08-26 4 views
1

J'écris une fonction d'assemblage à appeler à partir de C qui appellera l'instruction machine sidt avec une adresse mémoire transmise à la fonction C. De mon analyse du code produit par MSVC10, j'ai construit le code suivant (syntaxe yasm):Accès aux paramètres transmis sur la pile dans une fonction ASM

SECTION .data 
SECTION .text 
GLOBAL _sidtLoad 
_sidtLoad: 

push  ebp 
mov   ebp,esp 
sub   esp,0C0h 
push  ebx 
push  esi 
push  edi 
lea   edi,[ebp-0C0h] 
mov   ecx,30h 
mov   eax,0CCCCCCCCh 

sidt [ebp+8] 

pop   edi 
pop   esi 
pop   ebx 
add   esp,0C0h 
cmp   ebp,esp  
mov   esp,ebp 
pop   ebp 
ret 

Voici la signature de la fonction C:

void sidtLoad (void* mem); 

Pour autant que je peux voir tout devrait travail, j'ai même vérifié l'adresse mémoire transmise à la fonction et ai vu qu'elle correspond à l'adresse stockée à [ebp + 8] (les octets sont inversés, ce qui je suppose est le résultat de l'endianness et devrait être géré par la machine) . J'ai essayé d'autres arguments pour l'instruction sidt, comme [ebp + 12], [ebp + 4], [ebp-8] etc. mais pas de chance.

P.S J'écris ceci dans un module d'assemblage externe afin de contourner le manque d'assemblage en ligne lorsque je cible x64 en utilisant MSVC10. Cependant, cette fonction/programme d'assemblage particulier est exécuté en tant que x86, juste pour que je puisse comprendre tout le processus.

P.P.S Je n'utilise pas le __sidt intrinsèque que le Kit de pilotes Windows (WDK) ne semble pas le prendre en charge. Ou au moins je ne peux pas le faire fonctionner avec ça!

+0

Courez-vous en mode utilisateur ou en mode noyau? La manipulation directe de l'IDT n'est définitivement pas supportée par Windows - qu'essayez-vous de faire? – Michael

+0

L'instruction sidt stocke simplement les données de l'IDT dans l'adresse spécifiée. J'ai initialisé une structure contenant les membres corrects et passe son adresse à la fonction sidtLoad(). Je veux simplement remplir la structure avec les informations IDT et l'imprimer. Cela fonctionne très bien si j'utilise inline asm pour appeler l'instruction sidt, donc je ne pense pas que ce soit un problème d'accès à la sécurité. –

Répondre

2

Votre code écrira l'IDT dans l'adresse mémoire ebp+8, ce qui n'est pas ce que vous voulez. Au lieu de cela, vous avez besoin de quelque chose comme:

mov eax, [ebp+8] 
sidt [eax] 
+0

Fonctionne comme un charme, en vous remerciant aimablement. –

1

compilation:

int sidLoad_fake(void * mem) { 
    return (int)mem; 
} 

à l'assemblage, puis regarder où il tire la valeur de mettre dans le registre de retour.

Je pense que les premiers arguments sur x86_64 sont transmis dans des registres.

Questions connexes