Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 当控件返回到被调用方保存的寄存器时,操作系统是否对其进行任何假设?_Windows_Assembly_X86_Operating System - Fatal编程技术网

Windows 当控件返回到被调用方保存的寄存器时,操作系统是否对其进行任何假设?

Windows 当控件返回到被调用方保存的寄存器时,操作系统是否对其进行任何假设?,windows,assembly,x86,operating-system,Windows,Assembly,X86,Operating System,当控件返回到被调用方保存的寄存器时,操作系统是否对其进行任何假设 我想知道操作系统,比如说Windows,是否假定被调用方保存的寄存器有任何内容,比如ebp、esi、edi 换句话说,当控制传回操作系统(main中的ret)时,操作系统是否需要保留这些寄存器中的值 我找不到任何指定的内容,但我猜答案是否定的(查看了编译器生成的代码)。是否有关于此主题的文档?Windows 32旨在实现进程隔离。 一个进程所做的任何事情都不会导致另一个进程(包括)操作系统本身失败。 因此,退出时如何处理寄存器并不

当控件返回到被调用方保存的寄存器时,操作系统是否对其进行任何假设

我想知道操作系统,比如说Windows,是否假定被调用方保存的寄存器有任何内容,比如
ebp、esi、edi

换句话说,当控制传回操作系统(
main
中的
ret
)时,操作系统是否需要保留这些寄存器中的值


我找不到任何指定的内容,但我猜答案是否定的(查看了编译器生成的代码)。是否有关于此主题的文档?

Windows 32旨在实现进程隔离。
一个进程所做的任何事情都不会导致另一个进程(包括)操作系统本身失败。
因此,退出时如何处理寄存器并不重要

唯一的例外是
esp
。如果堆栈指针出错,应用程序将因堆栈错误或访问冲突而终止。
这仍然不会影响操作系统,但只会稍微提前终止你的应用程序

*显然,这不包括合法系统调用或漏洞利用对系统的影响

请注意,
main
中的
ret
不会将控制权返回操作系统。几乎所有Win32
c
应用程序都包含运行时库。如果是这样,
main
中的
ret
将返回如下所示的一些初始化代码:

//pseudo-init

do set up (setup command line params for main to read).
call main;
call Windows.ExitProcess(); 
有一个“干净”的Windows出口对于应用程序来说很重要,这样它就可以清理自己的资源(关闭文件等)。操作系统并不真正关心。如果一个应用程序在运行后没有进行清理,操作系统将为其执行此任务。

比撞车更糟糕的是被挂断了。如果一个应用程序陷入了一个无止境的循环,或者更糟糕的是,一个不断要求越来越多资源的无止境的循环,那么系统就可以很容易地崩溃

Windows作为语言不可知论者,总是有自己的ABI。编译器都需要适应它。调用约定是stdcall(从右到左,被调用方清理),eax、ecx和edx是scratch,返回值在eax中,其余保留。Stdcall在任何地方都有文档记录。@HansPassant-我的意思是:当我的汇编程序通过从入口点函数返回将控制转移到操作系统时,操作系统对寄存器有什么假设吗?我猜这与Stdcall无关?@HansPassant—堆栈中最顶端的地址(启动程序时)返回到内核32,对吗?它是否假定了保留寄存器的某些内容?换言之,是否应该保留(例如,
esi
)?当返回操作系统时,一个适当的安全操作系统应该能够经受住应用程序的任何破坏,否则就有可能将此类行为误用为DoS攻击,甚至更糟。所以在这个特殊的情况下(返回OS),你只能伤害自己,但是只要你正确地调用退出进程,其他的东西都不重要。如果我们在C++应用程序上举例说明,<代码> clib < />代码在调用<代码>主< /C>之前,有一些初始化代码,返回之后,它将进行去初始化,像调用已注册的
atexit(…)
,调用全局/静态变量的析构函数,刷新流缓冲区等。。。该代码的健壮程度取决于特定的
clib
实现(甚至可能随版本更新而改变),该代码是应用程序的一部分,而不是操作系统。一般来说,如果可能的话,你应该尝试遵循ABI,通常这并不难做到。但它不会影响操作系统,只会影响应用程序。所谓退出,您的意思是当我的应用程序通过
ret
将控制权转移到操作系统(调用我的应用程序入口点的函数)时?