程序需求:编写一函数,该函数执行结束后返回,返回后原有程序的执行流程发生改变。
编程思路:函数的调用是通过堆栈进行的,在函数开始执行之前会将此函数位置的下一条指令地址压入栈中,函数执行结束后会返回到这个地址处继续执行指令。我们可以通过在函数体内部修改栈中的函数返回地址,从而达到修改程序的执行流程。在C语言中可以使用混编的方式来达到修改函数返回地址(因为C语言无法直接修改寄存器的值,只能使用汇编实现)。汇编中采用将我们想要函数返回的地址通过参数传递进去,然后再修改函数返回地址,从而使函数返回到我们想要执行的地址。
开发环境
Win10 + VS2017
C语言代码实现如下:
#include <stdio.h>
#include <stdlib.h>
void function()
{
printf("hello,function!\n");
getchar();
exit(0);
}
void test()
{
__asm
{
mov eax,function
mov [ebp+4],eax
}
}
int main()
{
test();
printf("hello,world!\n");
return 0;
}
汇编语言代码实现如下:
INCLUDELIB kernel32.lib
INCLUDELIB ucrt.lib
INCLUDELIB legacy_stdio_definitions.lib
.386
.model flat,