繁体   English   中英

访问在ASM函数中在堆栈上传递的参数

[英]Accessing parameters passed on the stack in an ASM function

我正在编写一个要从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我正在外部组装模块中编写此代码,以解决使用MSVC10定位x64时缺少内联汇编的问题。 但是,这个特定的汇编功能/程序是作为x86运行的,所以我可以掌握整个过程。

PPS我没有使用__sidt内在函数,因为Windows驱动程序工具包(WDK)似乎不支持它。 或至少我无法使用它!

您的代码会将IDT写入到您不需要的内存地址ebp+8 相反,您需要以下内容:

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

编译:

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

组装,然后查看将值从何处提取到返回寄存器中。

我认为x86_64上的前几个参数在寄存器中传递。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM