Доступ к параметрам, передаваемым в стеке в функции ASM - PullRequest
1 голос
/ 26 августа 2010

Я пишу функцию сборки, которая будет вызываться из C, которая вызовет машинную инструкцию sidt с адресом памяти, передаваемым в функцию C.Из моего анализа кода, созданного MSVC10, я построил следующий код (синтаксис YASM):

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  

Вот сигнатура функции C:

void sidtLoad (void* mem);

Насколько яможет видеть, что все должно работать, я даже проверил адрес памяти, переданный функции, и увидел, что он совпадает с адресом, хранящимся в [ebp + 8] (байты обращены, что, я полагаю, является результатом порядка байтов и должно обрабатыватьсяна машине).Я пробовал другие аргументы для инструкции sidt, такие как [ebp + 12], [ebp + 4], [ebp-8] и т. Д., Но не повезло.

PS Я пишу это на внешнеммодуль сборки, чтобы обойти отсутствие встроенной сборки при нацеливании на x64 с помощью MSVC10.Тем не менее, эта конкретная функция / программа сборки выполняется как x86, просто чтобы я мог справиться со всем процессом.

PPS Я не использую встроенную __sidt как Windows Driver Kit (WDK)кажется, не поддерживает это.Или, по крайней мере, я не могу заставить его работать с этим!

Ответы [ 2 ]

2 голосов
/ 26 августа 2010

Ваш код запишет IDT в адрес памяти ebp+8, что не то, что вы хотите. Вместо этого вам нужно что-то вроде:

mov eax, [ebp+8]
sidt [eax]
1 голос
/ 26 августа 2010

compile:

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

в сборку, а затем посмотрите, откуда она извлекает значение для помещения в регистр возврата.

Я думаю, что первые несколько аргументов в x86_64передано в регистры.

...