Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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
Assembly 使用将函数重定向到子例程_Assembly - Fatal编程技术网

Assembly 使用将函数重定向到子例程

Assembly 使用将函数重定向到子例程,assembly,Assembly,如果要将执行重定向到汇编中的另一个函数,可以执行以下操作: push 0deadbeefh ; function pointer to some random function ret 但是让我们说,在C中 void* func_ptr = (void*) 0xdeadbeef; 假设上面的变量在代码中存储了指向随机函数的函数指针。如果我不知道end函数采用哪些参数,是否可以仅使用函数指针jmp到此函数?一旦开始这样做,您就会很快陷入未定义的危险境地,这些危险可能并不总是有效的,并且可能依赖

如果要将执行重定向到汇编中的另一个函数,可以执行以下操作:

push 0deadbeefh ; function pointer to some random function
ret
但是让我们说,在C中

void* func_ptr = (void*) 0xdeadbeef;

假设上面的变量在代码中存储了指向随机函数的函数指针。如果我不知道end函数采用哪些参数,是否可以仅使用函数指针
jmp
到此函数?

一旦开始这样做,您就会很快陷入未定义的危险境地,这些危险可能并不总是有效的,并且可能依赖于体系结构。但是,忽略这一点,您可以执行以下操作:

void (*func_ptr)() = (void (*)()) 0xdeadbeef;
func_ptr();
这里,
func_ptr
被定义为指向函数的指针,该函数使用未指定的参数,并返回
void
。它被称为任何其他函数指针(或函数)


此代码适用于x86-64 GCC 10.1和Clang 10.0.0,带有
-Wall-Wextra-Werror-pedantic
。两个编译器都生成一个
jmp
。他们可以这样做,因为这是一个函数的尾部调用,返回
void

一旦你开始做类似的事情,你很快就会陷入未定义的危险境地,这些危险可能并不总是有效的,并且可能依赖于架构。但是,忽略这一点,您可以执行以下操作:

void (*func_ptr)() = (void (*)()) 0xdeadbeef;
func_ptr();
这里,
func_ptr
被定义为指向函数的指针,该函数使用未指定的参数,并返回
void
。它被称为任何其他函数指针(或函数)


此代码适用于x86-64 GCC 10.1和Clang 10.0.0,带有
-Wall-Wextra-Werror-pedantic
。两个编译器都生成一个
jmp
。他们可以这样做,因为这是一个来自返回
void

jmp
的函数的尾部调用,它不知道或不关心参数,它会很高兴地做它自己的事情,但您可能不喜欢结果。这是在什么样的背景下进行的?例如,对于转发呼叫,参数已正确设置。顺便说一句,不要使用push/ret技巧,这对性能有害,如果在我的场景中启用控制流强制,将来可能会失败。我这样做是为了热补丁。我在几个API调用之前添加了一个保护代码(函数),并试图在代码完成后重定向回原始函数/API。
jmp
不知道或不关心参数,它会很高兴地完成它的工作,但您可能不喜欢结果。这是在什么样的背景下进行的?例如,对于转发呼叫,参数已正确设置。顺便说一句,不要使用push/ret技巧,这对性能有害,如果在我的场景中启用控制流强制,将来可能会失败。我这样做是为了热补丁。我在几个API调用之前添加了一个保护代码(函数),并试图在代码完成后重定向回原始函数/API。如果我能够计算要传递给函数的所有参数的大小,该怎么办?我应该如何使用这个函数指针至少为原型函数添加一些填充,以便它能够安全地调用结果函数?或者这无关紧要,因为它的所有参数都已推送到堆栈上了?@randomuser843你是什么意思?如果我能够计算所有要传递给函数的参数的大小呢?我应该如何使用这个函数指针至少为原型函数添加一些填充,以便它能够安全地调用结果函数?或者这不重要,因为它的所有参数都已经被推到堆栈上了吗?@randomuser843你是什么意思?